chatroom-cli 1.128.1 → 1.129.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -20403,6 +20403,13 @@ var init_agent_role = __esm(() => {
20403
20403
  researcher: {
20404
20404
  tags: ["ephemeral" /* Ephemeral */],
20405
20405
  teams: [{ teamId: "duo", order: 25 }]
20406
+ },
20407
+ verifier: {
20408
+ tags: ["ephemeral" /* Ephemeral */],
20409
+ teams: [
20410
+ { teamId: "duo", order: 45 },
20411
+ { teamId: "solo", order: 45 }
20412
+ ]
20406
20413
  }
20407
20414
  };
20408
20415
  AGENT_ROLE_DEFINITIONS = Object.fromEntries(Object.entries(roleMetadata).map(([role, metadata]) => [role, { role, ...metadata }]));
@@ -99882,14 +99889,14 @@ var init_team_presets = __esm(() => {
99882
99889
  duo: {
99883
99890
  structureId: TEAM_STRUCTURE_IDS.duo,
99884
99891
  name: "Duo",
99885
- description: "A planner and builder working as a pair, planner as coordinator, with optional ephemeral architect, researcher, triage, and uiux-engineer roles",
99892
+ description: "A planner and builder working as a pair, planner as coordinator, with optional ephemeral architect, researcher, triage, uiux-engineer, and verifier roles",
99886
99893
  roles: getBuiltinRolesForTeam("duo"),
99887
99894
  entryPoint: "planner"
99888
99895
  },
99889
99896
  solo: {
99890
99897
  structureId: TEAM_STRUCTURE_IDS.solo,
99891
99898
  name: "Solo",
99892
- description: "A single agent working independently, with optional ephemeral architect, triage, and uiux-engineer roles",
99899
+ description: "A single agent working independently, with optional ephemeral architect, triage, uiux-engineer, and verifier roles",
99893
99900
  roles: getBuiltinRolesForTeam("solo"),
99894
99901
  entryPoint: "solo"
99895
99902
  }
@@ -100973,6 +100980,99 @@ var init_triage_handoff_templates = __esm(() => {
100973
100980
  init_command2();
100974
100981
  });
100975
100982
 
100983
+ // ../../services/backend/prompts/teams/verifier-handoff-templates.ts
100984
+ function normalizeEntryPointRole5(entryPointRole) {
100985
+ return entryPointRole.trim().toLowerCase() || "planner";
100986
+ }
100987
+ function getEntryPointToVerifierHandoffTemplate(entryPointRole) {
100988
+ const entryPoint = normalizeEntryPointRole5(entryPointRole);
100989
+ return `${getHandoffRecipientVisibilityCallout("verifier")}
100990
+
100991
+ ## Handoff Template (${entryPoint} → verifier)
100992
+
100993
+ The verifier judges, from chatroom logs only, whether the user's last message was achieved. It ${VERIFIER_TEST_RULE}; list any user-requested tests under Requested test runs. Treat the claimed outcome as a claim, not as evidence: the verifier does not trust it and checks every requirement against the logs themselves. Request this review only when the task involved code changes, in any conversation mode. The verdict returns to \`${entryPoint}\`.
100994
+
100995
+ ## Round
100996
+ <1 or 2; for 2, cite the round-1 verdict message id>
100997
+
100998
+ ## Mode
100999
+ <chat | code | code:enhanced>
101000
+
101001
+ ## User message id
101002
+ <id of the user's last message: the origin message id of the user task, or from \`chatroom messages anchor\`>
101003
+
101004
+ ## Context id
101005
+ <id from \`chatroom context read\`, or \`none\` if no context was read for this task>
101006
+
101007
+ ## Requested test runs
101008
+ <the test commands the user explicitly asked for, one per line, or exactly \`None requested.\`>
101009
+
101010
+ ## Claimed outcome
101011
+ <requirement-by-requirement what you believe is complete>
101012
+
101013
+ ## Evidence pointers
101014
+ <builder handoff message ids, commits, PRs, and test results as quoted in those handoffs>
101015
+
101016
+ ## Known gaps
101017
+ <anything incomplete, or exactly \`None.\`>
101018
+
101019
+ ## Handoff
101020
+ Send this request to the verifier with the command below, then stop. The verdict returns to \`${entryPoint}\`.
101021
+
101022
+ \`\`\`bash
101023
+ ${handoffCommand({
101024
+ chatroomId: "<chatroom-id>",
101025
+ role: entryPoint,
101026
+ nextRole: "verifier",
101027
+ cliEnvPrefix: ""
101028
+ })}
101029
+ \`\`\``;
101030
+ }
101031
+ function getVerifierToEntryPointHandoffTemplate(entryPointRole) {
101032
+ const entryPoint = normalizeEntryPointRole5(entryPointRole);
101033
+ return `${getHandoffRecipientVisibilityCallout(entryPoint)}
101034
+
101035
+ ## Handoff Template (Verifier → ${entryPoint})
101036
+
101037
+ Return one advisory verdict for the authoritative request. This review is non-binding: it uses chatroom logs, plus the requested test runs listed in the request, if any, deciding every requirement from the evidence those logs and runs actually contain. It ${VERIFIER_TEST_RULE}. Never accept the claimed outcome as proof. Use the exact sections below, in this order.
101038
+
101039
+ ## Verdict
101040
+ <exactly one of ${VERIFIER_VERDICTS.join(", ")} as the value; ${ACHIEVED} only if every requirement is met; ${NOT_ACHIEVED} if any requirement is unmet (logs show it was not done, or contradict it); ${INCONCLUSIVE} if none is unmet but any is unverified (logs are silent)>
101041
+
101042
+ ## Objective
101043
+ <user message id, any prior user messages used, objective in 1-2 sentences>
101044
+
101045
+ ## Requirements
101046
+ <numbered \`R1 — <requirement> — met | unmet | unverified — <evidence ref>\`>
101047
+
101048
+ ## Evidence
101049
+ <bullets: \`<message id or handoff> — "<short quote>" — supports R#\`; for a requested test run, \`<command> — exit <result> — supports R#\`>
101050
+
101051
+ ## Missing or unmet
101052
+ <per unmet or unverified requirement: what is missing and what evidence would resolve it; exactly \`None.\` if ${ACHIEVED}>
101053
+
101054
+ ## Scope and limits
101055
+ <state the test runs the verifier executed (command and exit result), or "No tests were run; none were requested."; log range read; whether the download was truncated; context id read and whether it matched the request>
101056
+
101057
+ ## Handoff
101058
+ Run the normal handoff command to \`${entryPoint}\` with this complete verdict, then stop.
101059
+
101060
+ \`\`\`bash
101061
+ ${handoffCommand({
101062
+ chatroomId: "<chatroom-id>",
101063
+ role: "verifier",
101064
+ nextRole: entryPoint,
101065
+ cliEnvPrefix: ""
101066
+ })}
101067
+ \`\`\``;
101068
+ }
101069
+ var VERIFIER_VERDICTS, VERIFIER_TEST_RULE = "runs no test the user did not ask for, and never builds, lints, or edits", ACHIEVED, NOT_ACHIEVED, INCONCLUSIVE;
101070
+ var init_verifier_handoff_templates = __esm(() => {
101071
+ init_command2();
101072
+ VERIFIER_VERDICTS = ["ACHIEVED", "NOT_ACHIEVED", "INCONCLUSIVE"];
101073
+ [ACHIEVED, NOT_ACHIEVED, INCONCLUSIVE] = VERIFIER_VERDICTS;
101074
+ });
101075
+
100976
101076
  // ../../services/backend/prompts/teams/duo/handoff-templates/planner.ts
100977
101077
  var duoPlannerHandoffContract;
100978
101078
  var init_planner = __esm(() => {
@@ -100983,16 +101083,26 @@ var init_planner = __esm(() => {
100983
101083
  init_researcher_handoff_templates();
100984
101084
  init_triage_handoff_templates();
100985
101085
  init_uiux_engineer_handoff_templates();
101086
+ init_verifier_handoff_templates();
100986
101087
  duoPlannerHandoffContract = {
100987
101088
  role: "planner",
100988
- receivesFrom: ["user", "builder", "architect", "uiux-engineer", "triage", "researcher"],
100989
- returnsTo: ["builder", "architect", "uiux-engineer", "triage", "researcher", "user"],
101089
+ receivesFrom: [
101090
+ "user",
101091
+ "builder",
101092
+ "architect",
101093
+ "uiux-engineer",
101094
+ "triage",
101095
+ "researcher",
101096
+ "verifier"
101097
+ ],
101098
+ returnsTo: ["builder", "architect", "uiux-engineer", "triage", "researcher", "verifier", "user"],
100990
101099
  outboundTemplates: {
100991
101100
  builder: () => getPlannerToBuilderHandoffTemplate(),
100992
101101
  architect: () => getEntryPointToArchitectHandoffTemplate("planner"),
100993
101102
  "uiux-engineer": () => getEntryPointToUiuxEngineerHandoffTemplate("planner"),
100994
101103
  triage: () => getEntryPointToTriageHandoffTemplate("planner"),
100995
101104
  researcher: () => getEntryPointToResearcherHandoffTemplate("planner"),
101105
+ verifier: () => getEntryPointToVerifierHandoffTemplate("planner"),
100996
101106
  user: (query) => query.conversationMode === "chat" ? getChatToUserHandoffTemplate() : getPlannerToUserReportTemplate({
100997
101107
  chatroomId: query.chatroomId,
100998
101108
  role: query.role,
@@ -101044,6 +101154,20 @@ var init_uiux_engineer = __esm(() => {
101044
101154
  };
101045
101155
  });
101046
101156
 
101157
+ // ../../services/backend/prompts/teams/duo/handoff-templates/verifier.ts
101158
+ var duoVerifierHandoffContract;
101159
+ var init_verifier = __esm(() => {
101160
+ init_verifier_handoff_templates();
101161
+ duoVerifierHandoffContract = {
101162
+ role: "verifier",
101163
+ receivesFrom: ["planner"],
101164
+ returnsTo: ["planner"],
101165
+ outboundTemplates: {
101166
+ planner: () => getVerifierToEntryPointHandoffTemplate("planner")
101167
+ }
101168
+ };
101169
+ });
101170
+
101047
101171
  // ../shared/src/domain/chatroom-role.ts
101048
101172
  var CHATROOM_ROLE_USER = "user";
101049
101173
  var init_chatroom_role = __esm(() => {
@@ -101188,6 +101312,7 @@ var init_handoff_templates = __esm(() => {
101188
101312
  init_researcher();
101189
101313
  init_triage();
101190
101314
  init_uiux_engineer();
101315
+ init_verifier();
101191
101316
  init_contracts();
101192
101317
  DUO_ROLE_HANDOFF_CATALOG = {
101193
101318
  planner: duoPlannerHandoffContract,
@@ -101195,7 +101320,8 @@ var init_handoff_templates = __esm(() => {
101195
101320
  architect: duoArchitectHandoffContract,
101196
101321
  researcher: duoResearcherHandoffContract,
101197
101322
  "uiux-engineer": duoUiuxEngineerHandoffContract,
101198
- triage: duoTriageHandoffContract
101323
+ triage: duoTriageHandoffContract,
101324
+ verifier: duoVerifierHandoffContract
101199
101325
  };
101200
101326
  DUO_ROLE_HANDOFF_CONTRACTS = Object.values(DUO_ROLE_HANDOFF_CATALOG);
101201
101327
  validatedDuoRoleHandoffContracts = (() => {
@@ -101240,14 +101366,16 @@ var init_solo = __esm(() => {
101240
101366
  init_architect_handoff_templates();
101241
101367
  init_triage_handoff_templates();
101242
101368
  init_uiux_engineer_handoff_templates();
101369
+ init_verifier_handoff_templates();
101243
101370
  soloHandoffContract = {
101244
101371
  role: "solo",
101245
- receivesFrom: ["user", "architect", "uiux-engineer", "triage"],
101246
- returnsTo: ["architect", "uiux-engineer", "triage", "user"],
101372
+ receivesFrom: ["user", "architect", "uiux-engineer", "triage", "verifier"],
101373
+ returnsTo: ["architect", "uiux-engineer", "triage", "verifier", "user"],
101247
101374
  outboundTemplates: {
101248
101375
  architect: () => getEntryPointToArchitectHandoffTemplate("solo"),
101249
101376
  "uiux-engineer": () => getEntryPointToUiuxEngineerHandoffTemplate("solo"),
101250
101377
  triage: () => getEntryPointToTriageHandoffTemplate("solo"),
101378
+ verifier: () => getEntryPointToVerifierHandoffTemplate("solo"),
101251
101379
  user: (query) => query.conversationMode === "chat" ? getChatToUserHandoffTemplate() : getSoloToUserReportTemplate({
101252
101380
  chatroomId: query.chatroomId,
101253
101381
  role: query.role,
@@ -101285,6 +101413,20 @@ var init_uiux_engineer2 = __esm(() => {
101285
101413
  };
101286
101414
  });
101287
101415
 
101416
+ // ../../services/backend/prompts/teams/solo/handoff-templates/verifier.ts
101417
+ var soloVerifierHandoffContract;
101418
+ var init_verifier2 = __esm(() => {
101419
+ init_verifier_handoff_templates();
101420
+ soloVerifierHandoffContract = {
101421
+ role: "verifier",
101422
+ receivesFrom: ["solo"],
101423
+ returnsTo: ["solo"],
101424
+ outboundTemplates: {
101425
+ solo: () => getVerifierToEntryPointHandoffTemplate("solo")
101426
+ }
101427
+ };
101428
+ });
101429
+
101288
101430
  // ../../services/backend/prompts/teams/solo/handoff-templates/index.ts
101289
101431
  function listSoloRoleHandoffContracts() {
101290
101432
  return validatedSoloRoleHandoffContracts;
@@ -101302,12 +101444,14 @@ var init_handoff_templates2 = __esm(() => {
101302
101444
  init_solo();
101303
101445
  init_triage2();
101304
101446
  init_uiux_engineer2();
101447
+ init_verifier2();
101305
101448
  init_contracts();
101306
101449
  SOLO_ROLE_HANDOFF_CATALOG = {
101307
101450
  solo: soloHandoffContract,
101308
101451
  architect: soloArchitectHandoffContract,
101309
101452
  "uiux-engineer": soloUiuxEngineerHandoffContract,
101310
- triage: soloTriageHandoffContract
101453
+ triage: soloTriageHandoffContract,
101454
+ verifier: soloVerifierHandoffContract
101311
101455
  };
101312
101456
  SOLO_ROLE_HANDOFF_CONTRACTS = Object.values(SOLO_ROLE_HANDOFF_CATALOG);
101313
101457
  validatedSoloRoleHandoffContracts = (() => {
@@ -101858,6 +102002,34 @@ chatroom handoff --chatroom-id="<chatroom-id>" --role="uiux-engineer" --next-rol
101858
102002
  The handoff must contain every required brief section, repository evidence, chosen flow, exact component/prop/state details, explicit states, accessibility details, ownership decisions, concrete classes/tokens, risks, acceptance criteria, tests, and implementation sequence the configured entry point needs to coordinate implementation. It must not contain implementation edits or alternative designs.`;
101859
102003
  });
101860
102004
 
102005
+ // ../../services/backend/prompts/cli/roles/verifier.ts
102006
+ var ACHIEVED2, NOT_ACHIEVED2, INCONCLUSIVE2, VERIFIER_GUIDANCE;
102007
+ var init_verifier3 = __esm(() => {
102008
+ init_verifier_handoff_templates();
102009
+ init_sections();
102010
+ [ACHIEVED2, NOT_ACHIEVED2, INCONCLUSIVE2] = VERIFIER_VERDICTS;
102011
+ VERIFIER_GUIDANCE = `## Verifier Operating Model
102012
+
102013
+ You are the verifier. Your main job is to check whether the user's goal was accomplished, judged from chatroom logs. You are advisory and read-only: do not edit files, implement code, run builds or linters, run \`chatroom context new\`, or act as the planner or builder. The one exception to running nothing is the test rule below: it ${VERIFIER_TEST_RULE}.
102014
+
102015
+ ${"{SESSION_CONTINUITY}"}
102016
+
102017
+ ${getInterRoleHandoffRule()}
102018
+
102019
+ 1. Read the injected verification request: round, mode, user message id, context id, requested test runs, claimed outcome, evidence pointers, and known gaps. The claimed outcome is a claim to be checked, never evidence.
102020
+ 2. Recover the objective from the logs. Run \`chatroom messages anchor --chatroom-id="<chatroom-id>" --role="verifier"\`, then \`chatroom messages download --chatroom-id="<chatroom-id>" --role="verifier" --since-message-id=<user message id> --limit=100\`. If the download is truncated, raise \`--limit\` and download again until the range is complete. If the anchor id differs from the request's user message id, use the request's id and report the mismatch. For terse follow-ups, recover intent from the prior user messages the anchor lists.
102021
+ 2a. Requested test runs: if the user's last message (or prior user messages for this objective) explicitly asks for tests to be run, run exactly those commands from the repository root, record the command and exit result, and count the output as evidence. Run no test the user did not ask for. If the request is absent, run nothing.
102022
+ 3. Run \`chatroom context read --chatroom-id="<chatroom-id>" --role="verifier"\` and note any mismatch with the request's context id.
102023
+ 4. Decompose the objective into numbered requirements R1..Rn. Split compound requests and ignore anything the user did not actually ask for.
102024
+ 5. Find evidence for every requirement in the logs alone: builder handoff reports, planner delegations, quoted test output, commits, and PRs. \`met\` requires concrete evidence in the logs. The planner's claimed outcome is a claim, not evidence. Silence means \`unverified\`. A contradiction, or a log showing the requirement was not done, means \`unmet\`. Never state that tests passed unless a log reports it, or you ran the requested tests yourself.
102025
+ 6. Choose the verdict by the rules in the injected verdict template: exactly one of ${VERIFIER_VERDICTS.join(", ")}. ${ACHIEVED2} only if every requirement is met; ${NOT_ACHIEVED2} if any requirement is unmet; ${INCONCLUSIVE2} if none is unmet but any is unverified.
102026
+ 7. Follow the injected \`<handoff-templates>\` verdict template exactly, in its order, and put the complete verdict in the handoff. Then hand off to the configured entry point with the normal command, then stop:
102027
+
102028
+ \`\`\`bash
102029
+ chatroom handoff --chatroom-id="<chatroom-id>" --role="verifier" --next-role="{ENTRY_POINT_ROLE}"
102030
+ \`\`\``;
102031
+ });
102032
+
101861
102033
  // ../../services/backend/prompts/cli/roles/planner-guidance-context.ts
101862
102034
  var init_planner_guidance_context = __esm(() => {
101863
102035
  init_env();
@@ -101881,6 +102053,7 @@ var init_fromContext2 = __esm(() => {
101881
102053
  init_planner2();
101882
102054
  init_researcher2();
101883
102055
  init_uiux_engineer3();
102056
+ init_verifier3();
101884
102057
  init_fromContext();
101885
102058
  });
101886
102059
 
@@ -101970,6 +102143,19 @@ var init_templates = __esm(() => {
101970
102143
  ],
101971
102144
  defaultHandoffTarget: "planner"
101972
102145
  },
102146
+ verifier: {
102147
+ role: "verifier",
102148
+ title: "Verifier",
102149
+ description: "You are the verifier responsible for judging, from chatroom logs only, whether the user's last message was achieved; you do not implement, test, or inspect code.",
102150
+ responsibilities: [
102151
+ "Recover the user's last message and the pinned context from the chatroom logs",
102152
+ "Break the objective into numbered requirements",
102153
+ "Check each requirement against concrete evidence in the logs, treating the planner claim as unverified",
102154
+ "Return one verdict (ACHIEVED, NOT_ACHIEVED, or INCONCLUSIVE) with evidence and the missing items",
102155
+ "Execute nothing: no tests, builds, or repository inspection"
102156
+ ],
102157
+ defaultHandoffTarget: "planner"
102158
+ },
101973
102159
  triage: {
101974
102160
  role: "triage",
101975
102161
  title: "Triage Agent",
@@ -111106,9 +111292,7 @@ function normalizeDeliveryAttachments(input) {
111106
111292
  return Object.values(attachments).some((items) => items && items.length > 0) ? attachments : undefined;
111107
111293
  }
111108
111294
  function normalizeTask(input) {
111109
- if (!input.taskId || input.taskStatus == null || input.taskContent == null)
111110
- return;
111111
- return { _id: input.taskId, status: input.taskStatus, content: input.taskContent };
111295
+ return input.task ?? undefined;
111112
111296
  }
111113
111297
  function toSerializableMessage(input) {
111114
111298
  const attachments = normalizeDeliveryAttachments(input);
@@ -111497,10 +111681,6 @@ async function createDefaultDeps17() {
111497
111681
  }
111498
111682
  };
111499
111683
  }
111500
- function formatBadges(message) {
111501
- const status = message.taskStatus ? ` (${message.taskStatus})` : "";
111502
- return `${status}`;
111503
- }
111504
111684
  function logMessageContent(content, full) {
111505
111685
  if (full) {
111506
111686
  console.log(` Content:
@@ -111572,11 +111752,10 @@ var listBySenderRoleEffect = (chatroomId, options) => exports_Effect.gen(functio
111572
111752
  console.log("─".repeat(60));
111573
111753
  for (const message of messages) {
111574
111754
  const timestamp = new Date(message._creationTime).toLocaleString();
111575
- const badges = formatBadges(message);
111576
111755
  console.log(`
111577
111756
  \uD83D\uDD39 ID: ${message._id}`);
111578
111757
  console.log(` Time: ${timestamp}`);
111579
- console.log(` Type: ${message.type}${badges}`);
111758
+ console.log(` Type: ${message.type}`);
111580
111759
  if (message.targetRole) {
111581
111760
  console.log(` Target: ${message.targetRole}`);
111582
111761
  }
@@ -111608,12 +111787,11 @@ var listBySenderRoleEffect = (chatroomId, options) => exports_Effect.gen(functio
111608
111787
  for (const message of messages) {
111609
111788
  const timestamp = new Date(message._creationTime).toLocaleString();
111610
111789
  const roleIndicator = message.senderRole.toLowerCase() === "user" ? "\uD83D\uDC64" : "\uD83E\uDD16";
111611
- const badges = formatBadges(message);
111612
111790
  console.log(`
111613
111791
  ${roleIndicator} ${message.senderRole}${message.targetRole ? ` → ${message.targetRole}` : ""}`);
111614
111792
  console.log(` ID: ${message._id}`);
111615
111793
  console.log(` Time: ${timestamp}`);
111616
- console.log(` Type: ${message.type}${badges}`);
111794
+ console.log(` Type: ${message.type}`);
111617
111795
  logMessageContent(message.content, options.full ?? false);
111618
111796
  }
111619
111797
  console.log(`
@@ -138270,4 +138448,4 @@ program2.hook("preAction", async (_thisCommand, actionCommand) => {
138270
138448
  });
138271
138449
  program2.parse();
138272
138450
 
138273
- //# debugId=7C84BEF97B16C1D064756E2164756E21
138451
+ //# debugId=8506C14FCD932D1964756E2164756E21