let-them-talk 5.4.0 → 5.4.2
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/README.md +315 -87
- package/USAGE.md +1 -1
- package/cli.js +21 -2
- package/conversation-templates/autonomous-feature.json +4 -4
- package/conversation-templates/code-review.json +3 -3
- package/conversation-templates/debug-squad.json +3 -3
- package/conversation-templates/feature-build.json +3 -3
- package/conversation-templates/research-write.json +3 -3
- package/dashboard.js +47 -2
- package/office/index.js +43 -40
- package/package.json +1 -1
- package/server.js +40 -6
- package/templates/debate.json +2 -2
- package/templates/managed.json +4 -4
- package/templates/pair.json +2 -2
- package/templates/review.json +2 -2
- package/templates/team.json +3 -3
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"code",
|
|
11
11
|
"implementation"
|
|
12
12
|
],
|
|
13
|
-
"prompt": "Register as \"Developer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write code as instructed. If review feedback arrives, fix issues and continue the loop. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
13
|
+
"prompt": "Register as \"Developer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write code as instructed. If review feedback arrives, fix issues and continue the loop. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"name": "Reviewer",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"standards",
|
|
21
21
|
"security"
|
|
22
22
|
],
|
|
23
|
-
"prompt": "Register as \"Reviewer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review code for bugs, style, and best practices. Use submit_review() to approve or request changes. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
23
|
+
"prompt": "Register as \"Reviewer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review code for bugs, style, and best practices. Use submit_review() to approve or request changes. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"name": "Tester",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"qa",
|
|
31
31
|
"verification"
|
|
32
32
|
],
|
|
33
|
-
"prompt": "Register as \"Tester\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write and run tests for the code, and report results. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
33
|
+
"prompt": "Register as \"Tester\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write and run tests for the code, and report results. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"workflow": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"analysis",
|
|
12
12
|
"tracing"
|
|
13
13
|
],
|
|
14
|
-
"prompt": "Register as \"Investigator\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Analyze error logs, trace code paths, and identify root causes. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
14
|
+
"prompt": "Register as \"Investigator\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Analyze error logs, trace code paths, and identify root causes. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"name": "Fixer",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"fixing",
|
|
22
22
|
"patching"
|
|
23
23
|
],
|
|
24
|
-
"prompt": "Register as \"Fixer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Implement fixes based on investigation findings and write regression tests. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence. If the fix fails, use retry_with_improvement().\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
24
|
+
"prompt": "Register as \"Fixer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Implement fixes based on investigation findings and write regression tests. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence. If the fix fails, use retry_with_improvement().\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"name": "Verifier",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"verification",
|
|
32
32
|
"qa"
|
|
33
33
|
],
|
|
34
|
-
"prompt": "Register as \"Verifier\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Test the fix, confirm resolution, and check for regressions. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
34
|
+
"prompt": "Register as \"Verifier\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Test the fix, confirm resolution, and check for regressions. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"workflow": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"interfaces",
|
|
12
12
|
"architecture"
|
|
13
13
|
],
|
|
14
|
-
"prompt": "Register as \"Architect\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Design the feature architecture, define interfaces, and create the implementation plan. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
14
|
+
"prompt": "Register as \"Architect\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Design the feature architecture, define interfaces, and create the implementation plan. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"name": "Builder",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"implementation",
|
|
22
22
|
"testing"
|
|
23
23
|
],
|
|
24
|
-
"prompt": "Register as \"Builder\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Implement the feature following the architecture design and write tests. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
24
|
+
"prompt": "Register as \"Builder\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Implement the feature following the architecture design and write tests. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"name": "Reviewer",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"quality",
|
|
32
32
|
"standards"
|
|
33
33
|
],
|
|
34
|
-
"prompt": "Register as \"Reviewer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review implementations against the architecture. Use submit_review() to approve or request changes. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
34
|
+
"prompt": "Register as \"Reviewer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review implementations against the architecture. Use submit_review() to approve or request changes. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"workflow": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"analysis",
|
|
12
12
|
"data"
|
|
13
13
|
],
|
|
14
|
-
"prompt": "Register as \"Researcher\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Gather information on the given topic and organize findings into a structured research brief. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
14
|
+
"prompt": "Register as \"Researcher\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Gather information on the given topic and organize findings into a structured research brief. Respect any required_capabilities or preferred_capabilities attached to work before continuing it. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"name": "Writer",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"content",
|
|
22
22
|
"structure"
|
|
23
23
|
],
|
|
24
|
-
"prompt": "Register as \"Writer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write clear, well-structured content based on the research findings. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence. If the editor requests changes, use retry_with_improvement().\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
24
|
+
"prompt": "Register as \"Writer\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Write clear, well-structured content based on the research findings. When you complete a workflow step, call verify_and_advance() with summary, verification, files_changed, and confidence. If the editor requests changes, use retry_with_improvement().\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"name": "Editor",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"style",
|
|
32
32
|
"accuracy"
|
|
33
33
|
],
|
|
34
|
-
"prompt": "Register as \"Editor\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review and polish content. Check for clarity, accuracy, and style. Use submit_review() to approve or request revisions. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
34
|
+
"prompt": "Register as \"Editor\", call get_briefing() for current branch and session context, call get_guide() once to load the active autonomous rules, then use get_work() for assignments. Review and polish content. Check for clarity, accuracy, and style. Use submit_review() to approve or request revisions. When your review step is complete, call verify_and_advance() with summary, verification, files_changed, and confidence.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"workflow": {
|
package/dashboard.js
CHANGED
|
@@ -202,7 +202,45 @@ function isRecentlyListening(info) {
|
|
|
202
202
|
return Date.now() - last < LISTEN_RECENCY_GRACE_MS;
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
+
// Virtual-agent helpers. "Dashboard" and "Owner" represent the operator UI,
|
|
206
|
+
// not a real CLI process. Writing them to agents.json lets list_agents and
|
|
207
|
+
// list_channels show them as first-class recipients, so agents can DM the
|
|
208
|
+
// operator via send_message(to="Dashboard") without confusion.
|
|
209
|
+
const VIRTUAL_AGENT_NAMES = ['Dashboard', 'Owner'];
|
|
210
|
+
function ensureVirtualAgents(projectPath) {
|
|
211
|
+
try {
|
|
212
|
+
const dataDir = resolveDataDir(projectPath);
|
|
213
|
+
if (!fs.existsSync(dataDir)) return;
|
|
214
|
+
const agentsFile = path.join(dataDir, 'agents.json');
|
|
215
|
+
let agents = {};
|
|
216
|
+
if (fs.existsSync(agentsFile)) {
|
|
217
|
+
try { agents = JSON.parse(fs.readFileSync(agentsFile, 'utf8')); } catch {}
|
|
218
|
+
}
|
|
219
|
+
const now = new Date().toISOString();
|
|
220
|
+
let changed = false;
|
|
221
|
+
for (const name of VIRTUAL_AGENT_NAMES) {
|
|
222
|
+
if (!agents[name] || !agents[name].is_virtual) {
|
|
223
|
+
agents[name] = {
|
|
224
|
+
pid: -1,
|
|
225
|
+
is_virtual: true,
|
|
226
|
+
virtual_type: 'owner',
|
|
227
|
+
timestamp: (agents[name] && agents[name].timestamp) || now,
|
|
228
|
+
last_activity: now,
|
|
229
|
+
last_listened_at: now,
|
|
230
|
+
provider: 'Dashboard',
|
|
231
|
+
branch: 'main',
|
|
232
|
+
};
|
|
233
|
+
changed = true;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (changed) {
|
|
237
|
+
fs.writeFileSync(agentsFile, JSON.stringify(agents, null, 2) + '\n');
|
|
238
|
+
}
|
|
239
|
+
} catch {} // best-effort — if agents.json is locked, we'll try again next request
|
|
240
|
+
}
|
|
241
|
+
|
|
205
242
|
function isPidAlive(pid, lastActivity) {
|
|
243
|
+
if (pid === -1) return true; // virtual agents (Dashboard, Owner) — always alive
|
|
206
244
|
const STALE_THRESHOLD = 60000; // 60s — if heartbeat updated within this, agent is alive
|
|
207
245
|
|
|
208
246
|
// PRIORITY 1: Trust heartbeat freshness over PID status
|
|
@@ -270,6 +308,9 @@ function apiChannels(query) {
|
|
|
270
308
|
|
|
271
309
|
function apiAgents(query) {
|
|
272
310
|
const projectPath = query.get('project') || null;
|
|
311
|
+
// Make sure the operator virtual agents (Dashboard, Owner) exist so agents
|
|
312
|
+
// querying list_agents over MCP see them as valid DM recipients.
|
|
313
|
+
ensureVirtualAgents(projectPath);
|
|
273
314
|
const canonicalState = getCanonicalState(projectPath);
|
|
274
315
|
const agents = canonicalState.listAgents();
|
|
275
316
|
const profiles = canonicalState.listProfiles();
|
|
@@ -809,11 +850,15 @@ function apiInjectMessage(body, query) {
|
|
|
809
850
|
const fromName = (body.from === 'Owner' || body.from === 'owner') ? 'Owner' : 'Dashboard';
|
|
810
851
|
const now = new Date().toISOString();
|
|
811
852
|
|
|
812
|
-
// Broadcast to all agents
|
|
853
|
+
// Broadcast to all agents. Exclude virtual agents (Dashboard, Owner) from
|
|
854
|
+
// per-agent inbox copies — they represent the operator UI and read every
|
|
855
|
+
// message through /api/history, so per-recipient duplication would just
|
|
856
|
+
// bloat the log.
|
|
813
857
|
if (body.to === '__all__') {
|
|
814
858
|
const agents = readJson(path.join(dataDir, 'agents.json'));
|
|
815
859
|
const ids = [];
|
|
816
860
|
for (const name of Object.keys(agents)) {
|
|
861
|
+
if (agents[name] && agents[name].is_virtual) continue;
|
|
817
862
|
const msg = {
|
|
818
863
|
id: Date.now().toString(36) + Math.random().toString(36).slice(2, 8),
|
|
819
864
|
from: fromName,
|
|
@@ -3417,7 +3462,7 @@ server.listen(PORT, LAN_MODE ? '0.0.0.0' : '127.0.0.1', () => {
|
|
|
3417
3462
|
const dataDir = resolveDataDir();
|
|
3418
3463
|
const lanIP = getLanIP();
|
|
3419
3464
|
console.log('');
|
|
3420
|
-
console.log(' Let Them Talk - Agent Bridge Dashboard v5.4.
|
|
3465
|
+
console.log(' Let Them Talk - Agent Bridge Dashboard v5.4.2');
|
|
3421
3466
|
console.log(' ============================================');
|
|
3422
3467
|
console.log(' Dashboard: http://localhost:' + PORT);
|
|
3423
3468
|
if (LAN_MODE && lanIP) {
|
package/office/index.js
CHANGED
|
@@ -28,13 +28,13 @@ function getCityMods() {
|
|
|
28
28
|
}).catch(function(e) { console.warn('City modules failed:', e); });
|
|
29
29
|
return _cityMods;
|
|
30
30
|
}
|
|
31
|
-
function isDriving() { return _cityMods && _cityMods.vehicle && _cityMods.vehicle.isDriving(); }
|
|
32
|
-
function isConnected() { return false; }
|
|
33
|
-
|
|
34
|
-
function scopedOfficeApiUrl(path, options) {
|
|
35
|
-
if (typeof window.scopedApiUrl === 'function') return window.scopedApiUrl(path, null, options);
|
|
36
|
-
return path;
|
|
37
|
-
}
|
|
31
|
+
function isDriving() { return _cityMods && _cityMods.vehicle && _cityMods.vehicle.isDriving(); }
|
|
32
|
+
function isConnected() { return false; }
|
|
33
|
+
|
|
34
|
+
function scopedOfficeApiUrl(path, options) {
|
|
35
|
+
if (typeof window.scopedApiUrl === 'function') return window.scopedApiUrl(path, null, options);
|
|
36
|
+
return path;
|
|
37
|
+
}
|
|
38
38
|
|
|
39
39
|
// Expose createCharacter + resolveAppearance for the character designer (Phase 3)
|
|
40
40
|
export { createCharacter } from './character.js';
|
|
@@ -319,29 +319,29 @@ function executeCommand(agentName, action) {
|
|
|
319
319
|
});
|
|
320
320
|
break;
|
|
321
321
|
|
|
322
|
-
case 'send_message':
|
|
323
|
-
showInputOverlay('Send message to ' + agentName + ':', 'Type your message...', function(msg) {
|
|
324
|
-
if (msg && msg.trim()) {
|
|
325
|
-
showBubble(agent, 'Message incoming...');
|
|
326
|
-
fetch(scopedOfficeApiUrl('/api/inject'), {
|
|
327
|
-
method: 'POST',
|
|
328
|
-
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
329
|
-
body: JSON.stringify({ to: agentName, content: msg.trim() })
|
|
330
|
-
}).then(function() { showBubble(agent, 'Got it!'); });
|
|
331
|
-
}
|
|
322
|
+
case 'send_message':
|
|
323
|
+
showInputOverlay('Send message to ' + agentName + ':', 'Type your message...', function(msg) {
|
|
324
|
+
if (msg && msg.trim()) {
|
|
325
|
+
showBubble(agent, 'Message incoming...');
|
|
326
|
+
fetch(scopedOfficeApiUrl('/api/inject'), {
|
|
327
|
+
method: 'POST',
|
|
328
|
+
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
329
|
+
body: JSON.stringify({ to: agentName, content: msg.trim() })
|
|
330
|
+
}).then(function() { showBubble(agent, 'Got it!'); });
|
|
331
|
+
}
|
|
332
332
|
});
|
|
333
333
|
break;
|
|
334
334
|
|
|
335
|
-
case 'assign_task':
|
|
336
|
-
showInputOverlay('New task for ' + agentName + ':', 'Task title...', function(title) {
|
|
337
|
-
if (title && title.trim()) {
|
|
338
|
-
showBubble(agent, 'New task assigned!');
|
|
339
|
-
fetch(scopedOfficeApiUrl('/api/tasks'), {
|
|
340
|
-
method: 'POST',
|
|
341
|
-
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
342
|
-
body: JSON.stringify({ title: title.trim(), assignee: agentName, status: 'pending' })
|
|
343
|
-
});
|
|
344
|
-
}
|
|
335
|
+
case 'assign_task':
|
|
336
|
+
showInputOverlay('New task for ' + agentName + ':', 'Task title...', function(title) {
|
|
337
|
+
if (title && title.trim()) {
|
|
338
|
+
showBubble(agent, 'New task assigned!');
|
|
339
|
+
fetch(scopedOfficeApiUrl('/api/tasks'), {
|
|
340
|
+
method: 'POST',
|
|
341
|
+
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
342
|
+
body: JSON.stringify({ title: title.trim(), assignee: agentName, status: 'pending' })
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
345
|
});
|
|
346
346
|
break;
|
|
347
347
|
|
|
@@ -355,13 +355,13 @@ function executeCommand(agentName, action) {
|
|
|
355
355
|
}
|
|
356
356
|
break;
|
|
357
357
|
|
|
358
|
-
case 'nudge':
|
|
359
|
-
showBubble(agent, 'Hey! Wake up!');
|
|
360
|
-
fetch(scopedOfficeApiUrl('/api/inject'), {
|
|
361
|
-
method: 'POST',
|
|
362
|
-
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
363
|
-
body: JSON.stringify({ to: agentName, content: 'Hey ' + agentName + ', the user is waiting for you. Please check for new messages and continue your work.' })
|
|
364
|
-
});
|
|
358
|
+
case 'nudge':
|
|
359
|
+
showBubble(agent, 'Hey! Wake up!');
|
|
360
|
+
fetch(scopedOfficeApiUrl('/api/inject'), {
|
|
361
|
+
method: 'POST',
|
|
362
|
+
headers: { 'Content-Type': 'application/json', 'X-LTT-Request': '1' },
|
|
363
|
+
body: JSON.stringify({ to: agentName, content: 'Hey ' + agentName + ', the user is waiting for you. Please check for new messages and continue your work.' })
|
|
364
|
+
});
|
|
365
365
|
break;
|
|
366
366
|
|
|
367
367
|
case 'edit_profile':
|
|
@@ -957,19 +957,20 @@ window.onPlayerSit = function(deskIdx) {
|
|
|
957
957
|
var iframeWrap = document.createElement('div');
|
|
958
958
|
iframeWrap.style.cssText = 'flex:1;position:relative;';
|
|
959
959
|
|
|
960
|
-
// Dashboard iframe
|
|
960
|
+
// Dashboard iframe. clipboard-write only — the iframe needs to copy agent
|
|
961
|
+
// prompts into the user's clipboard, it never needs to read from it.
|
|
961
962
|
var dashIframe = document.createElement('iframe');
|
|
962
963
|
dashIframe.id = 'mon-iframe-dashboard';
|
|
963
964
|
dashIframe.src = window.location.origin || 'http://localhost:3000';
|
|
964
965
|
dashIframe.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;border:none;background:#0d1117;';
|
|
965
|
-
dashIframe.allow = 'clipboard-
|
|
966
|
+
dashIframe.allow = 'clipboard-write';
|
|
966
967
|
iframeWrap.appendChild(dashIframe);
|
|
967
968
|
|
|
968
|
-
// ComfyUI iframe (hidden initially)
|
|
969
|
+
// ComfyUI iframe (hidden initially). Same write-only clipboard scope.
|
|
969
970
|
var comfyIframe = document.createElement('iframe');
|
|
970
971
|
comfyIframe.id = 'mon-iframe-comfyui';
|
|
971
972
|
comfyIframe.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;border:none;background:#1a1a2e;display:none;';
|
|
972
|
-
comfyIframe.allow = 'clipboard-
|
|
973
|
+
comfyIframe.allow = 'clipboard-write';
|
|
973
974
|
// Don't load ComfyUI until tab is clicked (saves resources)
|
|
974
975
|
iframeWrap.appendChild(comfyIframe);
|
|
975
976
|
|
|
@@ -995,9 +996,11 @@ window.onPlayerSit = function(deskIdx) {
|
|
|
995
996
|
if (dIframe) dIframe.style.display = 'none';
|
|
996
997
|
if (cIframe) {
|
|
997
998
|
cIframe.style.display = 'block';
|
|
998
|
-
// Lazy-load ComfyUI on first switch
|
|
999
|
+
// Lazy-load ComfyUI on first switch. URL is configurable via
|
|
1000
|
+
// window.COMFYUI_URL (set it from the dashboard or page) so users
|
|
1001
|
+
// on non-default ports or remote ComfyUI hosts can override.
|
|
999
1002
|
if (!cIframe.src || cIframe.src === 'about:blank' || cIframe.src === '') {
|
|
1000
|
-
cIframe.src = 'http://127.0.0.1:8188';
|
|
1003
|
+
cIframe.src = (typeof window !== 'undefined' && window.COMFYUI_URL) || 'http://127.0.0.1:8188';
|
|
1001
1004
|
}
|
|
1002
1005
|
}
|
|
1003
1006
|
if (dTab) { dTab.style.color = '#8892b0'; dTab.style.borderBottomColor = 'transparent'; }
|
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -567,11 +567,34 @@ function withFileLock(filePath, fn) {
|
|
|
567
567
|
try { return fn(); } finally { try { fs.unlinkSync(lockPath); } catch {} }
|
|
568
568
|
}
|
|
569
569
|
|
|
570
|
+
// Virtual operator agents. "Dashboard" and "Owner" represent the operator UI,
|
|
571
|
+
// not a CLI process. Surfacing them here ensures list_agents, broadcast filters,
|
|
572
|
+
// and DM-routing in the broker all agree the operator is a real recipient.
|
|
573
|
+
const VIRTUAL_AGENT_NAMES = ['Dashboard', 'Owner'];
|
|
574
|
+
function _mergeVirtualAgents(agents) {
|
|
575
|
+
const now = new Date().toISOString();
|
|
576
|
+
for (const name of VIRTUAL_AGENT_NAMES) {
|
|
577
|
+
if (!agents[name] || !agents[name].is_virtual) {
|
|
578
|
+
agents[name] = {
|
|
579
|
+
pid: -1,
|
|
580
|
+
is_virtual: true,
|
|
581
|
+
virtual_type: 'owner',
|
|
582
|
+
timestamp: (agents[name] && agents[name].timestamp) || now,
|
|
583
|
+
last_activity: now,
|
|
584
|
+
last_listened_at: now,
|
|
585
|
+
provider: 'Dashboard',
|
|
586
|
+
branch: (agents[name] && agents[name].branch) || 'main',
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return agents;
|
|
591
|
+
}
|
|
592
|
+
|
|
570
593
|
function getAgents() {
|
|
571
594
|
return cachedRead('agents', () => {
|
|
572
|
-
if (!fs.existsSync(AGENTS_FILE)) return {};
|
|
595
|
+
if (!fs.existsSync(AGENTS_FILE)) return _mergeVirtualAgents({});
|
|
573
596
|
let agents;
|
|
574
|
-
try { agents = JSON.parse(fs.readFileSync(AGENTS_FILE, 'utf8')); } catch { return {}; }
|
|
597
|
+
try { agents = JSON.parse(fs.readFileSync(AGENTS_FILE, 'utf8')); } catch { return _mergeVirtualAgents({}); }
|
|
575
598
|
// Scale fix: merge per-agent heartbeat files for live activity data
|
|
576
599
|
try {
|
|
577
600
|
const files = fs.readdirSync(DATA_DIR).filter(f => f.startsWith('heartbeat-') && f.endsWith('.json'));
|
|
@@ -586,7 +609,7 @@ function getAgents() {
|
|
|
586
609
|
}
|
|
587
610
|
}
|
|
588
611
|
} catch {}
|
|
589
|
-
return agents;
|
|
612
|
+
return _mergeVirtualAgents(agents);
|
|
590
613
|
}, 1500);
|
|
591
614
|
}
|
|
592
615
|
|
|
@@ -616,6 +639,10 @@ function getAcks(branch = currentBranch) {
|
|
|
616
639
|
// Cache for isPidAlive results — avoids redundant process.kill calls at 100-agent scale
|
|
617
640
|
const _pidAliveCache = {};
|
|
618
641
|
function isPidAlive(pid, lastActivity) {
|
|
642
|
+
// Virtual agents (Dashboard, Owner) use pid === -1 and are always alive.
|
|
643
|
+
// They represent the operator UI; liveness is implicit while the broker runs.
|
|
644
|
+
if (pid === -1) return true;
|
|
645
|
+
|
|
619
646
|
// Cache with 5s TTL — PID status doesn't change faster than heartbeats
|
|
620
647
|
const cacheKey = `${pid}_${lastActivity}`;
|
|
621
648
|
const cached = _pidAliveCache[cacheKey];
|
|
@@ -1893,6 +1920,9 @@ function buildGuide(level = 'standard') {
|
|
|
1893
1920
|
rules.push('DASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to other agents. EVERYTHING you want anyone to see — replies to Dashboard/Owner, status updates, questions for teammates, progress reports, "starting work", "done", "blocked on X" — MUST go through send_message() or broadcast(). Talk like humans on a team chat: announce when you start, when you finish, when you need help. Never just narrate in terminal and assume anyone will read it — they cannot.');
|
|
1894
1921
|
rules.push('DASHBOARD REPLY RULE: When a message arrives from "Dashboard" or "Owner", reply via send_message(to="Dashboard", content=...). Do NOT narrate the reply in your terminal. If a message targets a different agent (msg.to is not you), do not answer on their behalf — let the addressed agent reply. After send_message, call ' + listenCmd + ' again immediately.');
|
|
1895
1922
|
rules.push('TOOL ERROR RECOVERY: If ' + listenCmd + ' itself returns a tool error (e.g. "timed out awaiting tools/call"), that is a transport hiccup — IMMEDIATELY call ' + listenCmd + ' again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat it as "done". The loop only ends when the owner tells you to stop via send_message.');
|
|
1923
|
+
rules.push('SELF-RELIANCE RULE: When the Owner gives you a goal, treat it as a goal — NOT a checklist of approval gates. Break it down yourself, pick tasks via get_work(), and work until done. NEVER stop to ask "should I do X?" or "do you want me to Y?" for decisions you and the team can make. Your default answer to uncertainty is: decide, log_decision() to record the choice, continue. Asking the Owner for permission on small decisions is the failure mode — deciding and moving is the success mode.');
|
|
1924
|
+
rules.push('TEAM-FIRST ESCALATION RULE: Before DMing Dashboard/Owner with a question, try these in order: (1) kb_read() — did the team already decide this? (2) DM a teammate with the relevant skill (use list_agents() to find them). (3) call_vote() if the team genuinely disagrees. (4) log_decision() to lock in your choice and move forward. Only escalate to Owner when: (a) the overall goal is complete and the next strategic direction genuinely needs a human call, or (b) you hit a true blocker only the Owner can resolve (credentials, priorities, business rules, access). "I am not sure which design to pick" is NOT an Owner question — it is a team_decision() question.');
|
|
1925
|
+
rules.push('DONE-WHEN-DONE RULE: "Done" means the Owner\'s original GOAL is achieved, not "I finished my current step". After verify_and_advance(), immediately call get_work() again to find the next piece of the goal. The loop ends when the goal is complete and evidence is recorded — not when the current step ends. If get_work() returns nothing and the goal still is not done, synthesize: break the remaining work into new tasks with create_task() and keep going.');
|
|
1896
1926
|
|
|
1897
1927
|
// Minimal level: Tier 0 only — for experienced agents refreshing rules
|
|
1898
1928
|
if (level === 'minimal') {
|
|
@@ -2765,7 +2795,11 @@ function toolBroadcast(content) {
|
|
|
2765
2795
|
if (sizeErr) return sizeErr;
|
|
2766
2796
|
|
|
2767
2797
|
const agents = getAgents();
|
|
2768
|
-
|
|
2798
|
+
// Exclude self and virtual agents (Dashboard, Owner) from broadcast recipients.
|
|
2799
|
+
// Virtual agents represent the operator UI and read from the shared message log
|
|
2800
|
+
// directly; they don't need per-recipient DM copies. Group-mode __group__ writes
|
|
2801
|
+
// are still visible to the UI via /api/history.
|
|
2802
|
+
const otherAgents = Object.keys(agents).filter(n => n !== registeredName && !agents[n].is_virtual);
|
|
2769
2803
|
|
|
2770
2804
|
if (otherAgents.length === 0) {
|
|
2771
2805
|
return { error: 'No other agents registered' };
|
|
@@ -8391,7 +8425,7 @@ function toolToggleRule(ruleId) {
|
|
|
8391
8425
|
// --- MCP Server setup ---
|
|
8392
8426
|
|
|
8393
8427
|
const server = new Server(
|
|
8394
|
-
{ name: 'agent-bridge', version: '5.4.
|
|
8428
|
+
{ name: 'agent-bridge', version: '5.4.2' },
|
|
8395
8429
|
{ capabilities: { tools: {} } }
|
|
8396
8430
|
);
|
|
8397
8431
|
|
|
@@ -9531,7 +9565,7 @@ async function main() {
|
|
|
9531
9565
|
try {
|
|
9532
9566
|
const transport = new StdioServerTransport();
|
|
9533
9567
|
await server.connect(transport);
|
|
9534
|
-
console.error('Agent Bridge MCP server v5.4.
|
|
9568
|
+
console.error('Agent Bridge MCP server v5.4.2 running (66 tools)');
|
|
9535
9569
|
} catch (e) {
|
|
9536
9570
|
console.error('ERROR: MCP server failed to start: ' + e.message);
|
|
9537
9571
|
console.error('Fix: Run "npx let-them-talk doctor" to check your setup.');
|
package/templates/debate.json
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
{
|
|
6
6
|
"name": "Pro",
|
|
7
7
|
"role": "Argues in favor of the proposal",
|
|
8
|
-
"prompt": "You are the Pro agent in a structured debate. Register as \"Pro\", call get_briefing() for current project context, then call get_guide() if you need the current collaboration rules. Your job is to argue IN FAVOR of the topic or proposal presented by the user.\n\n1. Open with your strongest argument for the proposal\n2. When you receive counterarguments from Con, address them directly and present additional supporting evidence\n3. Always send_message then call listen()\n4. After 3-4 rounds, summarize your position with a final statement\n\nBe rigorous and evidence-based. Cite real examples, data, and precedents. If the topic is repo-specific, ground claims in the current docs, code, or team context. Acknowledge valid counterpoints but explain why the benefits still outweigh the costs. Avoid straw-manning and engage with Con's strongest arguments.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
8
|
+
"prompt": "You are the Pro agent in a structured debate. Register as \"Pro\", call get_briefing() for current project context, then call get_guide() if you need the current collaboration rules. Your job is to argue IN FAVOR of the topic or proposal presented by the user.\n\n1. Open with your strongest argument for the proposal\n2. When you receive counterarguments from Con, address them directly and present additional supporting evidence\n3. Always send_message then call listen()\n4. After 3-4 rounds, summarize your position with a final statement\n\nBe rigorous and evidence-based. Cite real examples, data, and precedents. If the topic is repo-specific, ground claims in the current docs, code, or team context. Acknowledge valid counterpoints but explain why the benefits still outweigh the costs. Avoid straw-manning and engage with Con's strongest arguments.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"name": "Con",
|
|
12
12
|
"role": "Argues against the proposal",
|
|
13
|
-
"prompt": "You are the Con agent in a structured debate. Register as \"Con\", call get_briefing() for current project context, then call get_guide() if you need the current collaboration rules. Call listen() to hear Pro's opening argument. Your job is to argue AGAINST the topic or proposal.\n\n1. When you receive Pro's argument, identify weaknesses and present counterarguments\n2. Raise risks, edge cases, hidden costs, and alternative approaches\n3. Always send_message then call listen()\n4. After 3-4 rounds, summarize your position with a final statement\n\nBe rigorous and evidence-based. Cite real examples, data, and precedents. If the topic is repo-specific, ground claims in the current docs, code, or team context. Do not be contrarian for its own sake, make genuine arguments about risks and alternatives. Acknowledge valid points from Pro but explain why the concerns are more significant.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message."
|
|
13
|
+
"prompt": "You are the Con agent in a structured debate. Register as \"Con\", call get_briefing() for current project context, then call get_guide() if you need the current collaboration rules. Call listen() to hear Pro's opening argument. Your job is to argue AGAINST the topic or proposal.\n\n1. When you receive Pro's argument, identify weaknesses and present counterarguments\n2. Raise risks, edge cases, hidden costs, and alternative approaches\n3. Always send_message then call listen()\n4. After 3-4 rounds, summarize your position with a final statement\n\nBe rigorous and evidence-based. Cite real examples, data, and precedents. If the topic is repo-specific, ground claims in the current docs, code, or team context. Do not be contrarian for its own sake, make genuine arguments about risks and alternatives. Acknowledge valid points from Pro but explain why the concerns are more significant.\n\nLOOP RULE (DO NOT BREAK): After every action, call listen() (or listen_group() in group/managed mode). When it returns with no messages, that is NORMAL — call it again immediately. Codex CLI may end the call near 120s due to its own tool-call timeout; treat the empty return as \"no messages yet\", NOT as a failure. Never stop the loop. Never sleep, never poll with check_messages().\n\nDASHBOARD REPLY RULE: When you receive a message from \"Dashboard\" or \"Owner\", reply ONLY via send_message(to=\"Dashboard\", content=...). The owner reads your reply in the dashboard Messages tab — NOT your CLI terminal. Anything you say in terminal output is invisible to the owner. If a message targets a different agent (msg.to is not you), do not answer on their behalf. After send_message, call listen_group() (or listen()) again immediately.\n\nDASHBOARD IS YOUR VOICE: Your CLI terminal is invisible to the owner and to every other agent. Everything you want anyone to see — status updates, questions for teammates, \"starting X\", \"done with Y\", \"blocked on Z\" — MUST go out through send_message() or broadcast(). Talk like humans on a team chat. Never just narrate in terminal and assume anyone will read it.\n\nTOOL ERROR RECOVERY: If listen_group() (or listen()) returns a tool error such as \"timed out awaiting tools/call\", that is a transport hiccup — immediately call it again. Do NOT summarize in terminal, do NOT stop the loop, do NOT treat the error as \"done\". The loop only ends when the owner tells you to stop via send_message.\n\nAUTONOMY RULES (DO NOT BREAK):\n1. SELF-RELIANCE — When given a goal, break it down and work until done. Never pause to ask \"should I do X?\" or \"do you want me to Y?\" for decisions the team can make. Decide, log_decision() to record the choice, continue.\n2. TEAM-FIRST ESCALATION — Before DMing Owner with a question: kb_read() first, then DM a teammate with the relevant skill (list_agents() to find them), then call_vote() if disagreement, then log_decision() to lock your choice. Only escalate to Owner when the goal is complete OR a true blocker only the Owner can resolve (credentials, priorities, business rules).\n3. DONE-WHEN-DONE — Done means the Owner's original GOAL is achieved with evidence, not \"I finished my current step\". After verify_and_advance(), call get_work() again. If nothing is queued and the goal is not yet done, synthesize new tasks with create_task() and keep going."
|
|
14
14
|
}
|
|
15
15
|
]
|
|
16
16
|
}
|