pendingyou 0.30.0 → 0.31.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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.31.1 (2026-10-08)
4
+
5
+ - Your words on a card that's closed reach its assistant. "Write to …" (threads) writes on a thread's newest card even
6
+ after its assistant picked it up, withdrew it or ran its fallback. `hold`, the hooks and the wake now say "Pending
7
+ You: your person wrote to you on req_… after it closed.", quote your words, and tell the assistant to act on them,
8
+ then ack_answer with a one-line outcome (or reply_in_thread if you asked it something). Before, they said the card
9
+ was already handled and there was nothing to do. Servers that don't send `wrote` are heard as before.
10
+
11
+ ## 0.31.0 (2026-10-08)
12
+
13
+ - “I’ll handle it” has one meaning (guide 2.45): the person will handle it themselves. `hold`, the hooks, the wake mod
14
+ and the Codex wake say so in Pending You's own words, “The person will handle this themselves. Close it out: take no
15
+ action on it, leave things as they are (an email stays in their inbox, untouched), and don’t follow up or ask
16
+ again.”, then to ack_answer with an outcome like “Left to you”. The app no longer offers “Leave it”; a server since
17
+ guide 2.45 sends an older one as the same. `leave` now means only a to-do's Skip: “your person won’t do it”, don't do
18
+ it for them or follow up, and pick it up with an outcome like “Skipped”. Older command lines still stand down on
19
+ both.
20
+
3
21
  ## 0.30.0 (2026-10-07)
4
22
 
5
23
  - This computer's own sign-ins (the connections `init` made for Claude Code, Codex, OpenCode and Pi) now last while
package/README.md CHANGED
@@ -378,10 +378,11 @@ next message brings any answer with it too.
378
378
  When you're at the terminal, Claude Code asks you there and puts the same question in Pending You at once; the
379
379
  first answer wins. If you answer in the terminal, it withdraws the card and the hold ends by itself.
380
380
 
381
- **When you'll handle it yourself (0.20.0).** A card you end with “I’ll handle it” in Pending You (“I’ll do it myself”,
382
- or “Leave it”) reaches the agent the same ways, saying which: instead of acting on it, it's told to stand down (nothing
383
- done, drafted, sent or followed up for it; with “Leave it”, an email or a task gets no reply), to pick it up with
384
- `ack_answer` and an outcome like “Left to you”, and never to post it again.
381
+ **When you'll handle it yourself (0.20.0; one meaning in 0.31.0).** A card you end with “I’ll handle it” in Pending
382
+ You reaches the agent the same ways, in these words: “The person will handle this themselves. Close it out: take no
383
+ action on it, leave things as they are (an email stays in their inbox, untouched), and don’t follow up or ask again.”
384
+ Then it picks it up with `ack_answer` and an outcome like “Left to you”, and never posts it again. A to-do you Skip
385
+ says you won't do it: the agent doesn't do it for you or follow up, and picks it up with an outcome like “Skipped”.
385
386
 
386
387
  **Finishing setup by itself (0.11.0).** In `init`'s copy of the mod, a few seconds after a session you're at opens
387
388
  (never `claude -p`), it asks Pending You whether Claude Code is set up here (`whoami`, once Pending You's tools are
@@ -414,12 +414,12 @@ function line(heard, card) {
414
414
  if (handledOf(heard) === 'self')
415
415
  return [
416
416
  `your person will handle ${titled} themselves`,
417
- `call ${get} to read it, don’t act on it, then ack_answer with its version and an outcome like “Left to you”`,
417
+ `call ${get} to read it, then close it out: take no action on it, leave things as they are and don’t follow up; ack_answer with its version and an outcome like “Left to you”`,
418
418
  ];
419
419
  if (handledOf(heard) === 'leave')
420
420
  return [
421
- `your person said to leave ${titled}`,
422
- `call ${get} to read it, do nothing for it (no reply, no follow-up), then ack_answer with its version and an outcome like “Left it”`,
421
+ `your person won’t do ${titled}`,
422
+ `call ${get} to read it, then close it out: don’t do it for them and don’t follow up; ack_answer with its version and an outcome like “Skipped”`,
423
423
  ];
424
424
  return [
425
425
  `your person answered ${titled}`,
package/dist/format.js CHANGED
@@ -12,7 +12,12 @@ export function handledOf(heard) {
12
12
  const given = heard.handled;
13
13
  return given === 'self' || given === 'leave' ? given : null;
14
14
  }
15
- const HANDLED_SAID = { self: 'I’ll do it myself', leave: 'Leave it' };
15
+ const HANDLED_SAID = {
16
+ self: ['I’ll handle it', 'I’ll do it myself'],
17
+ leave: ['I won’t do it', 'Leave it'],
18
+ };
19
+ export const HANDLED_MEANS = 'The person will handle this themselves. Close it out: take no action on it, leave things as they are (an email stays in their inbox, untouched), and don’t follow up or ask again.';
20
+ export const SKIPPED_MEANS = 'The person won’t do this to-do. Close it out: don’t do it for them, leave things as they are, and don’t follow up or ask again.';
16
21
  export const APPROVED_DRAFT_NOTICE = 'The approved words are in get_request’s answer.approvedDrafts: send them exactly.';
17
22
  export const approvesDraft = (heard) => heard.approvedDraft === true;
18
23
  export const HANDED_PREFIX = 'Pending You: your person handed you';
@@ -140,11 +145,12 @@ function describeNotice(heard, notice) {
140
145
  }
141
146
  function standDown(heard, handled) {
142
147
  const ack = `ack_answer with requestId ${heard.requestId}, name ${named(heard)}, expectedVersion ${heard.version}`;
143
- const noted = Boolean(heard.said?.trim() && heard.said.trim() !== HANDLED_SAID[handled]);
144
- const note = noted ? '; if their note asks you for one thing, do just that' : '';
148
+ const said = heard.said?.trim();
149
+ const noted = Boolean(said && !HANDLED_SAID[handled].includes(said));
150
+ const note = noted ? ' If their note asks you for one thing, do just that.' : '';
145
151
  return handled === 'self'
146
- ? `Stand down: don’t act on it, don’t draft or send anything for it, and don’t follow up${note}. Then call ${ack} and an outcome like “Left to you”. Never post it again.`
147
- : `Stand down: nobody does it, so an email or a task gets no reply and no follow-up, and nothing is archived or deleted unless their rules say so${note}. Then call ${ack} and an outcome like “Left it”. Never post it again.`;
152
+ ? `${HANDLED_MEANS}${note} Then call ${ack} and an outcome like “Left to you”. Never post it again.`
153
+ : `${SKIPPED_MEANS}${note} Then call ${ack} and an outcome like “Skipped”. Never post it again.`;
148
154
  }
149
155
  export function describe(heard, again) {
150
156
  const id = heard.requestId;
@@ -162,13 +168,19 @@ export function describe(heard, again) {
162
168
  return line;
163
169
  });
164
170
  const lines = [];
171
+ if (heard.wrote && heard.status !== 'answered' && isClosed(heard)) {
172
+ lines.push(`Pending You: your person wrote to you on ${id} after it closed.`, question, `They wrote: ${wrote.join(' ') || '(call get_request to read it)'}`, `Act on it, then call ack_answer with requestId ${id}, name ${named(heard)}, expectedVersion ${heard.version} and a one-line outcome (reply_in_thread instead if they asked you something).`);
173
+ if (cut)
174
+ lines.push(`(Cut short: get_request ${id} has all of it.)`);
175
+ return lines;
176
+ }
165
177
  switch (heard.status) {
166
178
  case 'answered': {
167
179
  const handled = handledOf(heard);
168
180
  if (handled) {
169
- const answer = clip(heard.said ?? HANDLED_SAID[handled], MAX_ANSWER);
181
+ const answer = clip(heard.said ?? HANDLED_SAID[handled][0] ?? '', MAX_ANSWER);
170
182
  cut ||= answer.cut;
171
- lines.push(`Pending You: ${id} is answered: ${handled === 'self' ? 'your person will do it themselves' : 'your person said to leave it'}.`, question, `Answer: ${answer.text}`);
183
+ lines.push(`Pending You: ${id} is answered: ${handled === 'self' ? 'your person will handle it themselves' : 'your person won’t do it'}.`, question, `Answer: ${answer.text}`);
172
184
  if (wrote.length)
173
185
  lines.push(`They also wrote: ${wrote.join(' ')}`);
174
186
  lines.push(standDown(heard, handled));
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.30.0';
1
+ export const VERSION = '0.31.1';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pendingyou-wake",
3
3
  "displayName": "Pending You",
4
- "version": "2.44.1",
4
+ "version": "2.46.0",
5
5
  "description": "Wakes Claude Code when your person answers a Pending You card it posted, even while it sits idle. Installed by `npx pendingyou init`.",
6
6
  "author": {
7
7
  "name": "RecordPlane",
package/mod/README.md CHANGED
@@ -4,4 +4,4 @@ The pendingyou command line’s copy of the Pending You plugin’s wake mod, for
4
4
 
5
5
  In each session it learns the cards the session posts to Pending You, checks them through the session’s own Pending You connection, and starts a turn when your person answers, writes back or a fallback comes due, or hands the session a question from another of their assistants (CLI 0.14.0), even while it sits idle. It answers `npx pendingyou hold` itself, so nothing waits in the background, and shows “2 waiting on you” under the prompt, after the plugin’s name. With the Pending You plugin installed too, only one copy acts.
6
6
 
7
- Generated from recordplane/pendingyou (packages/claude-plugin/src/wake) with Pending You’s guide 2.44.1; send changes there.
7
+ Generated from recordplane/pendingyou (packages/claude-plugin/src/wake) with Pending You’s guide 2.46.0; send changes there.
package/mod/hooks/wake.js CHANGED
@@ -391,12 +391,12 @@ function line(card) {
391
391
  if (state.handled === 'self')
392
392
  return [
393
393
  `your person will handle ${titled(card)} themselves`,
394
- `call ${get} to read it, don’t act on it, then ack_answer with its version and an outcome like “Left to you”`,
394
+ `call ${get} to read it, then close it out: take no action on it, leave things as they are and don’t follow up; ack_answer with its version and an outcome like “Left to you”`,
395
395
  ];
396
396
  if (state.handled === 'leave')
397
397
  return [
398
- `your person said to leave ${titled(card)}`,
399
- `call ${get} to read it, do nothing for it (no reply, no follow-up), then ack_answer with its version and an outcome like “Left it”`,
398
+ `your person won’t do ${titled(card)}`,
399
+ `call ${get} to read it, then close it out: don’t do it for them and don’t follow up; ack_answer with its version and an outcome like “Skipped”`,
400
400
  ];
401
401
  return [
402
402
  `your person answered ${titled(card)}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pendingyou",
3
- "version": "0.30.0",
3
+ "version": "0.31.1",
4
4
  "description": "Pending You for your coding agents: one command sets up Claude Code, Codex, OpenCode and Pi to ask you through Pending You and hear your answers, even while they sit idle.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://www.pendingyou.com",