@paigy/mcp 0.40.15 → 0.40.16

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.
@@ -1585,7 +1585,7 @@ var GetGoalSchema = z3.object({ goalId: z3.string().uuid() }).strict();
1585
1585
  var GET_GOAL_DESCRIPTION = "Read one Goal without claiming it: its outcome, state, revision, progress, blockers, the conversation on it (each question with its options and what was decided), and `next`, the one step to take. Foreign or sibling-owned Goals are not disclosed.";
1586
1586
  var UPDATE_GOAL_DESCRIPTION = "Update an owned Goal at an exact revision. State, ownership, dependencies, children, progress, title, and review acknowledgement are explicit; stale revisions are rejected. title is the work's name in one to five words, as a person would refer to it out loud (it is spoken on a call and heads every list); null clears it. reviewed: true acknowledges new evidence and closes the Deliveries addressed to you on that Goal, never over an open decision. dueAt (an ISO instant, or null) makes the Goal wait until then; when it passes you are woken for it \u2014 use it for a promise to follow up later. Returns the Goal as get_goal reads it, at its new revision.";
1587
1587
  var CLAIM_GOAL_DESCRIPTION = "Claim the oldest runnable or review-pending Goal you own, or pass goalId to claim that Goal. Another agent's Goal that has gone quiet for 3 days (check_replies lists them as stalledOthers) is taken over when you claim it, and becomes yours to finish or cancel. Returns the Goal as get_goal reads it, and creates or renews the execution lease.";
1588
- var CHECK_REPLIES_DESCRIPTION = "Your open Deliveries: every Notification or Call currently addressed to you \u2014 a request the user started toward you, an answer relayed to something you asked, a handoff \u2014 one row each: its Goals, how many decisions are still open, and the newest words in brief. A pure read with no arguments: nothing is consumed, acknowledged or claimed by reading it, so call it on startup, after a long wait, or whenever you want to know what is outstanding. To act on one, claim its Goal (claim_goal) or reread it in full with contact({deliveryId}). Once you have acted on what arrived, update_goal with reviewed: true closes the Deliveries addressed to you on that Goal. Your runnable and review-pending Goals come from claim_goal, not from here.";
1588
+ var CHECK_REPLIES_DESCRIPTION = "What is waiting for you: your open Deliveries (a request the user started toward you, a handoff), one row each with its Goals, how many decisions are still open, and the newest words in brief; and `review`, your Goals with something new on them \u2014 the user's answers and notes are Entries on the Goal, not Deliveries. A pure read with no arguments: nothing is consumed, acknowledged or claimed by reading it, so call it on startup, after a long wait, or whenever you want to know what is outstanding. To act on one, claim its Goal (claim_goal) or reread a Delivery in full with contact({deliveryId}). Once you have acted on what arrived, update_goal with reviewed: true clears the Goal from `review` and closes the Deliveries addressed to you on it.";
1589
1589
  var CheckRepliesSchema = z3.object({}).strict();
1590
1590
  var AGENT_TOOLS = [
1591
1591
  { name: "contact", description: CONTACT_DESCRIPTION, inputSchema: CONTACT_SCHEMA },
@@ -3057,6 +3057,7 @@ function deliveryView(d) {
3057
3057
  }
3058
3058
  function repliesView(r) {
3059
3059
  const deliveries = r.deliveries ?? [];
3060
+ const review = r.review ?? [];
3060
3061
  const stalled = r.stalled ?? [];
3061
3062
  const others = r.stalledOthers ?? [];
3062
3063
  return {
@@ -3067,13 +3068,17 @@ function repliesView(r) {
3067
3068
  openDecisions: d.decisionNeeds.filter((n) => n.state === "open").length || void 0,
3068
3069
  latest: "about" in d ? d.about : void 0
3069
3070
  })),
3071
+ // NEW ON YOUR GOALS (owner, 2026-09-23): a reply is an Entry on the Goal, not a Delivery, so the
3072
+ // Goals flagged for your review are listed here until you acknowledge them.
3073
+ ...review.length ? { review } : {},
3070
3074
  // YOUR STALLED WORK (#2257): Goals you own with no progress for three days. Named here so an
3071
3075
  // agent that reads its replies also sees what it left, and says what to do about each.
3072
3076
  ...stalled.length ? { stalled } : {},
3073
3077
  // OTHER AGENTS' STALLED WORK (owner, 2026-09-23): any agent may take it over and close it.
3074
3078
  ...others.length ? { stalledOthers: others } : {},
3075
3079
  next: [
3076
- deliveries.length ? "Act on a Goal with claim_goal; reread one Delivery in full with contact({deliveryId})." : "Nothing is waiting.",
3080
+ deliveries.length || review.length ? "Act on a Goal with claim_goal; reread one Delivery in full with contact({deliveryId})." : "Nothing is waiting.",
3081
+ ...review.length ? [`${review.length} of your Goals have something new (review): read each with claim_goal or get_goal, then update_goal with reviewed: true.`] : [],
3077
3082
  ...stalled.length ? [`${stalled.length} of your Goals have had no progress for 3 days: update_goal each with progress, finish it, or cancel it.`] : [],
3078
3083
  ...others.length ? [`${others.length} of other agents' Goals have gone quiet for 3 days: claim_goal({goalId}) takes one over, then finish or cancel it with update_goal.`] : []
3079
3084
  ].join(" ")
@@ -4,10 +4,10 @@ import {
4
4
  serverInstructions,
5
5
  sessionStartHook,
6
6
  withSessionStartHook
7
- } from "./chunk-SE2JCKDI.js";
7
+ } from "./chunk-SFGGZLVO.js";
8
8
  import {
9
9
  agentName
10
- } from "./chunk-PHTQITTC.js";
10
+ } from "./chunk-6OBUH2FB.js";
11
11
 
12
12
  // src/toolset.ts
13
13
  var ONBOARD_DESCRIPTION = "Get this agent talking to Paigy \u2014 call it FIRST, before contact, and any time you're unsure who you are. One call, and it does whatever the situation needs: NOT SET UP \u2192 hatches an identity instantly if this machine holds a device credential (the user ran the Paigy desktop app or harness), otherwise starts the code ceremony; ALREADY SET UP \u2192 returns your current identity and offers the two things left to decide, renaming it or unpairing; TOKEN NO LONGER VALID \u2192 says so, then re-pairs. Pass { name, voice } to choose who you are when hatching, or to RENAME yourself when already set up (voices: rachel, george, jessica, brian, lily). Safe to call any time: idempotent, and it never writes settings \u2014 the tool-allowlist state it reports is read-only. If it returns a `user_code`, print it to the user immediately and call onboard again with the `device_code`. If it returns `enable_command`, PRINT that command for the user to run \u2014 you cannot apply it yourself (it writes your own permission allowlist, which hosts block as privilege escalation), so print it, don't wait for it, and carry on.";
@@ -4,7 +4,7 @@ import {
4
4
  requestCode,
5
5
  saveToken,
6
6
  sleep
7
- } from "./chunk-PHTQITTC.js";
7
+ } from "./chunk-6OBUH2FB.js";
8
8
 
9
9
  // src/identity.ts
10
10
  var CLIENT_LABELS = {
@@ -117,7 +117,7 @@ var GetGoalSchema = z3.object({ goalId: z3.string().uuid() }).strict();
117
117
  var GET_GOAL_DESCRIPTION = "Read one Goal without claiming it: its outcome, state, revision, progress, blockers, the conversation on it (each question with its options and what was decided), and `next`, the one step to take. Foreign or sibling-owned Goals are not disclosed.";
118
118
  var UPDATE_GOAL_DESCRIPTION = "Update an owned Goal at an exact revision. State, ownership, dependencies, children, progress, title, and review acknowledgement are explicit; stale revisions are rejected. title is the work's name in one to five words, as a person would refer to it out loud (it is spoken on a call and heads every list); null clears it. reviewed: true acknowledges new evidence and closes the Deliveries addressed to you on that Goal, never over an open decision. dueAt (an ISO instant, or null) makes the Goal wait until then; when it passes you are woken for it \u2014 use it for a promise to follow up later. Returns the Goal as get_goal reads it, at its new revision.";
119
119
  var CLAIM_GOAL_DESCRIPTION = "Claim the oldest runnable or review-pending Goal you own, or pass goalId to claim that Goal. Another agent's Goal that has gone quiet for 3 days (check_replies lists them as stalledOthers) is taken over when you claim it, and becomes yours to finish or cancel. Returns the Goal as get_goal reads it, and creates or renews the execution lease.";
120
- var CHECK_REPLIES_DESCRIPTION = "Your open Deliveries: every Notification or Call currently addressed to you \u2014 a request the user started toward you, an answer relayed to something you asked, a handoff \u2014 one row each: its Goals, how many decisions are still open, and the newest words in brief. A pure read with no arguments: nothing is consumed, acknowledged or claimed by reading it, so call it on startup, after a long wait, or whenever you want to know what is outstanding. To act on one, claim its Goal (claim_goal) or reread it in full with contact({deliveryId}). Once you have acted on what arrived, update_goal with reviewed: true closes the Deliveries addressed to you on that Goal. Your runnable and review-pending Goals come from claim_goal, not from here.";
120
+ var CHECK_REPLIES_DESCRIPTION = "What is waiting for you: your open Deliveries (a request the user started toward you, a handoff), one row each with its Goals, how many decisions are still open, and the newest words in brief; and `review`, your Goals with something new on them \u2014 the user's answers and notes are Entries on the Goal, not Deliveries. A pure read with no arguments: nothing is consumed, acknowledged or claimed by reading it, so call it on startup, after a long wait, or whenever you want to know what is outstanding. To act on one, claim its Goal (claim_goal) or reread a Delivery in full with contact({deliveryId}). Once you have acted on what arrived, update_goal with reviewed: true clears the Goal from `review` and closes the Deliveries addressed to you on it.";
121
121
  var CheckRepliesSchema = z3.object({}).strict();
122
122
  var AGENT_TOOLS = [
123
123
  { name: "contact", description: CONTACT_DESCRIPTION, inputSchema: CONTACT_SCHEMA },
@@ -52,7 +52,7 @@ import {
52
52
  updateGoal,
53
53
  updateSlot,
54
54
  whoAmI
55
- } from "./chunk-PHTQITTC.js";
55
+ } from "./chunk-6OBUH2FB.js";
56
56
  export {
57
57
  AGENT_TOOLS,
58
58
  AGENT_TOOL_NAMES,
package/dist/enable.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  PAIGY_TOOL_IDS,
4
4
  enablePaigyTools,
5
5
  installSessionListening
6
- } from "./chunk-37FS33UP.js";
7
- import "./chunk-SE2JCKDI.js";
8
- import "./chunk-PHTQITTC.js";
6
+ } from "./chunk-JWMR6K6D.js";
7
+ import "./chunk-SFGGZLVO.js";
8
+ import "./chunk-6OBUH2FB.js";
9
9
 
10
10
  // src/enable.ts
11
11
  function main() {
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  resolvePairing,
6
6
  startPairing,
7
7
  suggestedAgentName
8
- } from "./chunk-X6G7XXCP.js";
8
+ } from "./chunk-OGTH55QH.js";
9
9
  import {
10
10
  ENABLE_COMMAND,
11
11
  OnboardSchema,
@@ -14,11 +14,11 @@ import {
14
14
  SERVER_INSTRUCTIONS,
15
15
  TOOLS,
16
16
  paigyToolsAllowlisted
17
- } from "./chunk-37FS33UP.js";
17
+ } from "./chunk-JWMR6K6D.js";
18
18
  import {
19
19
  decideListen,
20
20
  listenerAlive
21
- } from "./chunk-SE2JCKDI.js";
21
+ } from "./chunk-SFGGZLVO.js";
22
22
  import {
23
23
  clearSurface,
24
24
  writeSurface
@@ -39,7 +39,7 @@ import {
39
39
  setIdentity,
40
40
  slotName,
41
41
  whoAmI
42
- } from "./chunk-PHTQITTC.js";
42
+ } from "./chunk-6OBUH2FB.js";
43
43
 
44
44
  // src/index.ts
45
45
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
package/dist/listen.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  entryWords,
4
4
  removeListenMark,
5
5
  writeListenMark
6
- } from "./chunk-SE2JCKDI.js";
6
+ } from "./chunk-SFGGZLVO.js";
7
7
  import {
8
8
  agentName,
9
9
  checkReplies,
@@ -11,7 +11,7 @@ import {
11
11
  getGoal,
12
12
  slotName,
13
13
  subscribeWake
14
- } from "./chunk-PHTQITTC.js";
14
+ } from "./chunk-6OBUH2FB.js";
15
15
 
16
16
  // src/listen.ts
17
17
  import { spawn } from "child_process";
@@ -133,11 +133,14 @@ function leadOf(deliveries, goalId) {
133
133
  function brief(waiting, reason, as, goalId) {
134
134
  const lead = leadOf(waiting.deliveries, goalId);
135
135
  const stalled = waiting.stalled?.length ? ` \xB7 ${waiting.stalled.length} of your Goals stalled 3+ days: update, finish or cancel each` : "";
136
- if (!lead) return (reason === "boot" ? `Paigy \xB7 listening as ${as} \xB7 nothing waiting` : `Paigy \xB7 ${reason} \xB7 nothing waiting`) + stalled;
136
+ const review = waiting.review ?? [];
137
+ const named = (goalId ? review.find((g) => g.goalId === goalId) : void 0) ?? review[0];
138
+ const fresh = review.length ? ` \xB7 new on ${review.length === 1 ? "your Goal" : `${review.length} of your Goals`}, first ${named.goalId} ("${named.title}"): claim_goal to read it` : "";
139
+ if (!lead) return `Paigy \xB7 ${reason === "boot" ? `listening as ${as}` : reason}${fresh || " \xB7 nothing waiting"}${stalled}`;
137
140
  const said = saidIn(lead) || ("about" in lead ? lead.about : "");
138
141
  const shown = said.length > 160 ? `${said.slice(0, 160)}\u2026` : said;
139
142
  const goal = waiting.goal?.goalId ?? lead.goalIds[0];
140
- return `Paigy \xB7 ${reason} \xB7 ${waiting.deliveries.length} waiting \xB7 lead ${lead.deliveryId} on Goal ${goal}: "${shown}"${stalled}`;
143
+ return `Paigy \xB7 ${reason} \xB7 ${waiting.deliveries.length} waiting \xB7 lead ${lead.deliveryId} on Goal ${goal}: "${shown}"${fresh}${stalled}`;
141
144
  }
142
145
  function launchEnv(waiting, reason, goalId) {
143
146
  const env = { PAIGY_WORK: JSON.stringify(waiting), PAIGY_EVENT: reason };
@@ -154,16 +157,16 @@ function launchEnv(waiting, reason, goalId) {
154
157
  async function sweep(reason, goalId) {
155
158
  try {
156
159
  const cmd = process.env.PAIGY_ON_WAKE;
157
- const { deliveries: rows, stalled } = await checkReplies();
160
+ const { deliveries: rows, stalled, review } = await checkReplies();
158
161
  const lead = leadOf(rows, goalId);
159
162
  const full = lead ? await contact({ deliveryId: lead.deliveryId }, { waits: false }).then((d) => "recorded" in d ? null : d).catch(() => null) : null;
160
163
  const deliveries = rows.map((d) => d === lead && full ? full : d);
161
164
  const leadGoalId = lead?.goalIds[0];
162
165
  const goal = leadGoalId ? await getGoal(leadGoalId).then((g) => ({ goalId: leadGoalId, progress: g.progress })).catch(() => null) : null;
163
- const waiting = { deliveries, goal, ...stalled?.length ? { stalled } : {} };
166
+ const waiting = { deliveries, goal, ...stalled?.length ? { stalled } : {}, ...review?.length ? { review } : {} };
164
167
  if (BRIEF) line(brief(waiting, reason, listeningAs(), goalId));
165
168
  else emit({ type: "sweep", reason, ...goalId ? { about: goalId } : {}, ...waiting });
166
- if (cmd && (deliveries.length || reason === "boot" && waiting.stalled?.length)) {
169
+ if (cmd && (deliveries.length || waiting.review?.length || reason === "boot" && waiting.stalled?.length)) {
167
170
  spawn(cmd, { shell: true, stdio: "inherit", env: { ...process.env, ...launchEnv(waiting, reason, goalId) } });
168
171
  }
169
172
  } catch (e) {
package/dist/onboard.js CHANGED
@@ -3,13 +3,13 @@ import {
3
3
  resolvePairing,
4
4
  startPairing,
5
5
  suggestedAgentName
6
- } from "./chunk-X6G7XXCP.js";
6
+ } from "./chunk-OGTH55QH.js";
7
7
  import {
8
8
  autoConfigureClients,
9
9
  claudeInstallHint,
10
10
  openBrowser
11
- } from "./chunk-37FS33UP.js";
12
- import "./chunk-SE2JCKDI.js";
11
+ } from "./chunk-JWMR6K6D.js";
12
+ import "./chunk-SFGGZLVO.js";
13
13
  import {
14
14
  TOKEN_PATH,
15
15
  agentName,
@@ -20,7 +20,7 @@ import {
20
20
  saveToken,
21
21
  setIdentity,
22
22
  whoAmI
23
- } from "./chunk-PHTQITTC.js";
23
+ } from "./chunk-6OBUH2FB.js";
24
24
 
25
25
  // src/onboard.ts
26
26
  function reportRegistered() {
package/dist/slot.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  agentName
4
- } from "./chunk-PHTQITTC.js";
4
+ } from "./chunk-6OBUH2FB.js";
5
5
 
6
6
  // src/slot.ts
7
7
  process.stdout.write(agentName());
package/dist/stalled.js CHANGED
@@ -22,7 +22,7 @@ async function main() {
22
22
  const dir = join(homedir(), ".paigy", "stalled-reminded");
23
23
  const mark = join(dir, `${session || "session"}-${day}`);
24
24
  if (existsSync(mark)) return;
25
- const { checkReplies } = await import("./dist-DKP3DJQJ.js");
25
+ const { checkReplies } = await import("./dist-6F22VALF.js");
26
26
  const reply = stopReply((await checkReplies()).stalled ?? []);
27
27
  if (!reply) return;
28
28
  mkdirSync(dir, { recursive: true });
@@ -7,7 +7,7 @@ import {
7
7
  readToken,
8
8
  sessionSlot,
9
9
  slotName
10
- } from "./chunk-PHTQITTC.js";
10
+ } from "./chunk-6OBUH2FB.js";
11
11
 
12
12
  // src/statusline.ts
13
13
  import { realpathSync } from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paigy/mcp",
3
- "version": "0.40.15",
3
+ "version": "0.40.16",
4
4
  "description": "Paigy MCP server — the AI agent harness that calls you. Lets an agent notify a user and await their reply.",
5
5
  "license": "MIT",
6
6
  "type": "module",