aibroker 0.13.1 → 0.14.0

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.
Files changed (61) hide show
  1. package/dist/adapters/iterm/core.d.ts +11 -0
  2. package/dist/adapters/iterm/core.d.ts.map +1 -1
  3. package/dist/adapters/iterm/core.js +21 -13
  4. package/dist/adapters/iterm/core.js.map +1 -1
  5. package/dist/core/env.d.ts +14 -0
  6. package/dist/core/env.d.ts.map +1 -0
  7. package/dist/core/env.js +48 -0
  8. package/dist/core/env.js.map +1 -0
  9. package/dist/core/state.d.ts +27 -1
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/core/state.js +20 -1
  12. package/dist/core/state.js.map +1 -1
  13. package/dist/daemon/cli.js +6 -0
  14. package/dist/daemon/cli.js.map +1 -1
  15. package/dist/daemon/commands.d.ts.map +1 -1
  16. package/dist/daemon/commands.js +31 -10
  17. package/dist/daemon/commands.js.map +1 -1
  18. package/dist/daemon/core-handlers.d.ts.map +1 -1
  19. package/dist/daemon/core-handlers.js +120 -12
  20. package/dist/daemon/core-handlers.js.map +1 -1
  21. package/dist/daemon/dispatch.d.ts +8 -0
  22. package/dist/daemon/dispatch.d.ts.map +1 -1
  23. package/dist/daemon/dispatch.js +20 -3
  24. package/dist/daemon/dispatch.js.map +1 -1
  25. package/dist/daemon/index.d.ts.map +1 -1
  26. package/dist/daemon/index.js +32 -34
  27. package/dist/daemon/index.js.map +1 -1
  28. package/dist/daemon/mailbox-watch.d.ts +26 -0
  29. package/dist/daemon/mailbox-watch.d.ts.map +1 -0
  30. package/dist/daemon/mailbox-watch.js +69 -0
  31. package/dist/daemon/mailbox-watch.js.map +1 -0
  32. package/dist/daemon/ota.d.ts.map +1 -1
  33. package/dist/daemon/ota.js +9 -3
  34. package/dist/daemon/ota.js.map +1 -1
  35. package/dist/daemon/todoist-cli.d.ts +10 -0
  36. package/dist/daemon/todoist-cli.d.ts.map +1 -0
  37. package/dist/daemon/todoist-cli.js +108 -0
  38. package/dist/daemon/todoist-cli.js.map +1 -0
  39. package/dist/daemon/todoist-ingress.d.ts +47 -0
  40. package/dist/daemon/todoist-ingress.d.ts.map +1 -0
  41. package/dist/daemon/todoist-ingress.js +101 -0
  42. package/dist/daemon/todoist-ingress.js.map +1 -0
  43. package/dist/daemon/todoist-oauth.d.ts +69 -0
  44. package/dist/daemon/todoist-oauth.d.ts.map +1 -0
  45. package/dist/daemon/todoist-oauth.js +182 -0
  46. package/dist/daemon/todoist-oauth.js.map +1 -0
  47. package/dist/daemon/todoist-owners.d.ts +23 -0
  48. package/dist/daemon/todoist-owners.d.ts.map +1 -0
  49. package/dist/daemon/todoist-owners.js +60 -0
  50. package/dist/daemon/todoist-owners.js.map +1 -0
  51. package/dist/daemon/todoist-reply.d.ts +58 -0
  52. package/dist/daemon/todoist-reply.d.ts.map +1 -0
  53. package/dist/daemon/todoist-reply.js +135 -0
  54. package/dist/daemon/todoist-reply.js.map +1 -0
  55. package/dist/daemon/todoist-webhook.d.ts +66 -3
  56. package/dist/daemon/todoist-webhook.d.ts.map +1 -1
  57. package/dist/daemon/todoist-webhook.js +244 -17
  58. package/dist/daemon/todoist-webhook.js.map +1 -1
  59. package/dist/mcp/index.js +30 -2
  60. package/dist/mcp/index.js.map +1 -1
  61. package/package.json +1 -1
@@ -36,8 +36,74 @@ import { createServer } from "node:http";
36
36
  import { createHmac, timingSafeEqual } from "node:crypto";
37
37
  import { log } from "../core/log.js";
38
38
  import { audit } from "./audit.js";
39
+ import { handleOAuthCallback } from "./todoist-oauth.js";
39
40
  /** Prefix on anything an agent writes back to Todoist, so we ignore our own echo. */
40
41
  export const AGENT_MARK = "🤖";
42
+ /**
43
+ * Something that looked like an address but was not one.
44
+ *
45
+ * A task saying `PAI do the thing` or labelled `pai` reads, to a human, as an
46
+ * instruction about where it should go. Neither parses, and the silent outcome
47
+ * is that it lands on the default owner as though nothing had been asked for.
48
+ * That is the failure this project keeps having to fix: a suppression nobody
49
+ * counts is indistinguishable from an event that never happened. So we say it.
50
+ */
51
+ function detectNearMiss(labels, firstToken, addressed, known) {
52
+ const labelAttempt = labels.find((l) => {
53
+ const low = l.toLowerCase();
54
+ // A label that already routes is not a near miss, whichever form it took.
55
+ if (low.startsWith("pai:") || known.has(low))
56
+ return false;
57
+ return low.startsWith("pai");
58
+ });
59
+ if (labelAttempt)
60
+ return `label "${labelAttempt}" names nobody — use a session name, or pai:<name>`;
61
+ if (addressed && firstToken && !known.has(firstToken.toLowerCase())) {
62
+ return `"${firstToken}" reads as an address but no session by that name is known`;
63
+ }
64
+ return undefined;
65
+ }
66
+ /**
67
+ * Owner named by a label, in either accepted form.
68
+ *
69
+ * `pai:<name>` is explicit and works even for a name we have never heard of.
70
+ * A bare `<name>` label is the cheap form — one tap in Todoist's picker — and
71
+ * is accepted only when it matches something dispatch can actually resolve,
72
+ * so an ordinary label like `urgent` stays an ordinary label.
73
+ */
74
+ function ownerFromLabels(labels, known) {
75
+ for (const raw of labels.map((l) => l.trim())) {
76
+ const low = raw.toLowerCase();
77
+ if (low.startsWith("pai:")) {
78
+ const name = raw.slice(4).trim();
79
+ if (name)
80
+ return name;
81
+ }
82
+ if (known.has(low))
83
+ return low;
84
+ }
85
+ return undefined;
86
+ }
87
+ /**
88
+ * Pull a leading session name off the content.
89
+ *
90
+ * Typing a label is several taps on a phone and worse on a watch, so the
91
+ * cheapest possible address is the first word: "pai send a whatsapp message".
92
+ * Only names we already know are accepted — otherwise "home improvements"
93
+ * becomes a work order for the Home session — and an explicit `name:` or
94
+ * `name,` counts as addressing even when the name is unknown, so that a typo
95
+ * can be reported instead of silently ignored.
96
+ */
97
+ export function parseAddress(content, known) {
98
+ const m = /^([\p{L}\p{N}_-]+)([:,])?\s+([\s\S]+)$/u.exec(content.trim());
99
+ if (!m)
100
+ return { rest: content, firstToken: null, addressed: false };
101
+ const [, token, punct, rest] = m;
102
+ const addressed = Boolean(punct);
103
+ if (known.has(token.toLowerCase()))
104
+ return { owner: token.toLowerCase(), rest, firstToken: token, addressed: true };
105
+ return { rest: content, firstToken: token, addressed };
106
+ }
41
107
  /**
42
108
  * Verify Todoist's HMAC over the RAW body.
43
109
  *
@@ -70,7 +136,26 @@ export function eventKey(e) {
70
136
  * Pure, so the routing rules are testable without a socket: this function is
71
137
  * the entire security boundary of the ingress.
72
138
  */
73
- export function route(e, cfg) {
139
+ export function route(e, cfg, knownOwners = [],
140
+ /**
141
+ * The session already holding this task, when we know it.
142
+ *
143
+ * Only meaningful for a comment: a follow-up belongs to whoever did the work,
144
+ * not to whatever the project mapping would pick today.
145
+ */
146
+ heldBy) {
147
+ // Names we will accept as an address: every session the hub can see, plus
148
+ // every owner named in config. Config counts even when the session is not
149
+ // running, so "clickr do x" is understood and reported as undeliverable
150
+ // rather than being read as the first word of a shopping list.
151
+ const known = new Set();
152
+ for (const n of knownOwners)
153
+ if (n)
154
+ known.add(n.toLowerCase());
155
+ for (const o of cfg.projectOwners.values())
156
+ known.add(o.toLowerCase());
157
+ if (cfg.defaultOwner)
158
+ known.add(cfg.defaultOwner.toLowerCase());
74
159
  const data = e.event_data ?? {};
75
160
  const content = typeof data.content === "string" ? data.content : "";
76
161
  const description = typeof data.description === "string" ? data.description : "";
@@ -80,7 +165,7 @@ export function route(e, cfg) {
80
165
  if (content.startsWith(AGENT_MARK) || description.startsWith(AGENT_MARK)) {
81
166
  return { act: false, reason: "agent-authored content, ignored to avoid an echo loop" };
82
167
  }
83
- const ACTIONABLE = new Set(["item:added", "item:completed", "reminder:fired"]);
168
+ const ACTIONABLE = new Set(["item:added", "item:completed", "reminder:fired", "note:added"]);
84
169
  if (!ACTIONABLE.has(e.event_name)) {
85
170
  return { act: false, reason: `event ${e.event_name} is not actionable` };
86
171
  }
@@ -98,21 +183,52 @@ export function route(e, cfg) {
98
183
  return { act: false, reason: "task has no content" };
99
184
  }
100
185
  // Owner, most explicit first:
101
- // 1. a `pai:<name>` label — say exactly where it goes
102
- // 2. the project it was filed in — "put it in the Whazaa list"
103
- // 3. the configured default — the watch case: Inbox, no label, no project
186
+ // 1. a `pai:<name>` label — say exactly where it goes
187
+ // 2. a leading name in the text — "pai send a whatsapp message"
188
+ // 3. the session already holding it — a comment follows its work
189
+ // 4. the project it was filed in — "put it in the Whazaa list"
190
+ // 5. the configured default — the watch case: Inbox, no label, no text address
191
+ //
192
+ // Text beats project: what you wrote is more deliberate than where it landed,
193
+ // and on a watch the project is whatever the quick-capture button chose.
104
194
  const labels = Array.isArray(data.labels) ? data.labels.map(String) : [];
105
- const labelled = labels.map((l) => l.trim())
106
- .find((l) => l.toLowerCase().startsWith("pai:"))?.slice(4).trim();
107
- const owner = labelled || cfg.projectOwners.get(projectId) || cfg.defaultOwner;
195
+ const labelled = ownerFromLabels(labels, known);
196
+ const addr = parseAddress(content, known);
197
+ const nearMiss = detectNearMiss(labels, addr.firstToken, addr.addressed, known);
198
+ let owner;
199
+ let rule;
200
+ if (labelled) {
201
+ owner = labelled;
202
+ rule = "label";
203
+ }
204
+ else if (addr.owner) {
205
+ owner = addr.owner;
206
+ rule = "address";
207
+ }
208
+ else if (heldBy) {
209
+ owner = heldBy;
210
+ rule = "held";
211
+ }
212
+ else if (cfg.projectOwners.get(projectId)) {
213
+ owner = cfg.projectOwners.get(projectId);
214
+ rule = "project";
215
+ }
216
+ else {
217
+ owner = cfg.defaultOwner;
218
+ rule = "default";
219
+ }
108
220
  if (!owner) {
109
221
  return {
110
222
  act: false,
111
- reason: "no pai:<name> label, no owner for this project, and no default owner configured",
223
+ reason: "no pai:<name> label, no name in the text, no owner for this project, and no default owner configured",
224
+ nearMiss,
112
225
  };
113
226
  }
114
- const body = description.trim() ? `${content}\n\n${description}` : content;
115
- return { act: true, project: owner, body, taskId };
227
+ // Only the address rule consumed part of the title; every other rule leaves
228
+ // the text exactly as written.
229
+ const title = rule === "address" ? addr.rest : content;
230
+ const body = description.trim() ? `${title}\n\n${description}` : title;
231
+ return { act: true, project: owner, body, taskId, rule, nearMiss };
116
232
  }
117
233
  /** Bounded replay guard: Todoist retries, and a retry must not run work twice. */
118
234
  class SeenSet {
@@ -156,12 +272,22 @@ export function createWebhookServer(cfg, deps) {
156
272
  const seen = new SeenSet();
157
273
  return createServer((req, res) => {
158
274
  void (async () => {
275
+ // Ignore query strings on the webhook path; a proxy may append them. The
276
+ // OAuth landing is the one place here where the query IS the payload.
277
+ const reqPath = (req.url ?? "/").split("?")[0];
278
+ if (req.method === "GET" && reqPath === cfg.oauthPath) {
279
+ const url = new URL(req.url ?? "/", "http://localhost");
280
+ const { status, html } = await handleOAuthCallback(url, {
281
+ clientId: cfg.clientId,
282
+ clientSecret: cfg.secret,
283
+ });
284
+ res.writeHead(status, { "content-type": "text/html; charset=utf-8" }).end(html);
285
+ return;
286
+ }
159
287
  if (req.method !== "POST") {
160
288
  res.writeHead(405).end();
161
289
  return;
162
290
  }
163
- // Ignore query strings; a proxy may append them.
164
- const reqPath = (req.url ?? "/").split("?")[0];
165
291
  if (reqPath !== cfg.path) {
166
292
  res.writeHead(404).end();
167
293
  return;
@@ -202,22 +328,119 @@ export function createWebhookServer(cfg, deps) {
202
328
  return;
203
329
  }
204
330
  seen.add(key);
205
- const decision = route(event, cfg);
331
+ // Deleting the project revokes its ingress. A grant outliving the thing
332
+ // it points at is dead weight in a security boundary: it reads as though
333
+ // access is still open, and if the id is ever reused it silently is. The
334
+ // boundary should only ever shrink on its own.
335
+ if (event.event_name === "project:deleted") {
336
+ const gone = String(event.event_data?.id ?? "");
337
+ if (gone) {
338
+ const { revokeIngress } = await import("./todoist-ingress.js");
339
+ if (revokeIngress(gone)) {
340
+ log(`todoist-webhook: project ${gone} was deleted — its ingress grant is revoked`);
341
+ }
342
+ }
343
+ // Still not actionable as work; fall through to be recorded as ignored.
344
+ }
345
+ // A comment carries item_id and its own text and nothing else — no
346
+ // project, no labels — so the boundary cannot be evaluated until the
347
+ // parent task is resolved. Do it before routing, and let a failed lookup
348
+ // drop the event rather than route it against a missing project, which
349
+ // the allowlist would refuse anyway but for the wrong reason.
350
+ if (event.event_name === "note:added" && !event.event_data?.project_id) {
351
+ const parentId = String(event.event_data?.item_id ?? "");
352
+ if (!parentId) {
353
+ audit({
354
+ action: "webhook", actor: "todoist", target: "aibroker", outcome: "ignored",
355
+ reason: "comment carries no item_id", meta: { event: event.event_name },
356
+ });
357
+ return;
358
+ }
359
+ try {
360
+ const { fetchParentTask } = await import("./todoist-reply.js");
361
+ const parent = await fetchParentTask(parentId);
362
+ event.event_data = {
363
+ ...event.event_data,
364
+ id: parentId,
365
+ project_id: parent.projectId,
366
+ labels: parent.labels,
367
+ // Answer on the task, about the task: the comment is the
368
+ // instruction, the title is the context it makes sense in.
369
+ description: parent.content ? `(comment on "${parent.content}")` : "",
370
+ };
371
+ }
372
+ catch (err) {
373
+ const reason = `could not resolve the task a comment belongs to — ${err instanceof Error ? err.message : String(err)}`;
374
+ audit({
375
+ action: "webhook", actor: "todoist", target: "aibroker",
376
+ outcome: "ignored", reason, meta: { event: event.event_name, taskId: parentId },
377
+ });
378
+ log(`todoist-webhook: ${reason}`);
379
+ return;
380
+ }
381
+ }
382
+ const isComment = event.event_name === "note:added";
383
+ const parentId = String(event.event_data?.id ?? "");
384
+ const { ownerOf, rememberOwner } = await import("./todoist-owners.js");
385
+ // Grants made since the daemon started take effect now, not at the next
386
+ // restart. A project created and granted while you are using the system
387
+ // has to work immediately, or the grant is indistinguishable from a
388
+ // project that routes nowhere.
389
+ const { applyGrants } = await import("./todoist-ingress.js");
390
+ const live = applyGrants(cfg);
391
+ const decision = route(event, live, await (deps.knownOwners?.() ?? []), isComment ? ownerOf(parentId) : undefined);
206
392
  const who = event.initiator?.email ?? event.initiator?.full_name ?? "todoist";
393
+ if (decision.nearMiss) {
394
+ // Recorded whether or not the task was delivered: the point is that
395
+ // something was asked for and not honoured.
396
+ log(`todoist-webhook: near miss — ${decision.nearMiss}`);
397
+ }
207
398
  if (!decision.act) {
208
399
  audit({
209
400
  action: "webhook", actor: `todoist:${who}`, target: "aibroker",
210
401
  outcome: "ignored", reason: decision.reason,
211
- meta: { event: event.event_name, task: event.event_data?.content ?? undefined },
402
+ meta: {
403
+ event: event.event_name,
404
+ task: event.event_data?.content ?? undefined,
405
+ nearMiss: decision.nearMiss,
406
+ },
212
407
  });
213
408
  return;
214
409
  }
215
410
  try {
216
- const r = await deps.deliver(decision.project, decision.body);
411
+ // The id rides along so the session can answer on the task it came
412
+ // from. Without it the reply has nowhere to go but a terminal the
413
+ // asker is not looking at.
414
+ // Warn when the title is not unique in its project. Two tasks with the
415
+ // same name are indistinguishable in a list, so an answer posted on one
416
+ // looks — to whoever is watching the other — exactly like being ignored.
417
+ // The session is told, so it can say which id it answered on.
418
+ let twins = 0;
419
+ if (!isComment) {
420
+ try {
421
+ const { countTasksWithTitle } = await import("./todoist-reply.js");
422
+ twins = await countTasksWithTitle(String(event.event_data?.project_id ?? ""), String(event.event_data?.content ?? ""));
423
+ }
424
+ catch { /* a lookup failure must not block a delivery */ }
425
+ }
426
+ const twinWarning = twins > 1
427
+ ? `\n\n[note: ${twins} open tasks in this project share this title — say which id you answered on]`
428
+ : "";
429
+ const delivered = `${decision.body}${twinWarning}\n\n[todoist:${decision.taskId}]`;
430
+ const r = await deps.deliver(decision.project, delivered, isComment ? { prefix: "[Task:comment]" } : undefined);
431
+ // Remember who took it, so a later comment reaches the same session.
432
+ // Recorded on the way out and only on a real delivery: a task nobody
433
+ // accepted has no owner to inherit.
434
+ if (!isComment && r.outcome === "delivered")
435
+ rememberOwner(decision.taskId, decision.project);
217
436
  audit({
218
437
  action: "webhook", actor: `todoist:${who}`, target: r.session || decision.project,
219
438
  outcome: r.outcome, body: decision.body, reason: r.reason,
220
- meta: { event: event.event_name, taskId: decision.taskId },
439
+ meta: {
440
+ event: event.event_name, taskId: decision.taskId,
441
+ rule: decision.rule, nearMiss: decision.nearMiss,
442
+ duplicateTitles: twins > 1 ? twins : undefined,
443
+ },
221
444
  });
222
445
  }
223
446
  catch (err) {
@@ -254,6 +477,8 @@ export function webhookConfigFromEnv() {
254
477
  port: Number(process.env.TODOIST_WEBHOOK_PORT) || 8766,
255
478
  bind: process.env.TODOIST_WEBHOOK_BIND ?? "127.0.0.1",
256
479
  path: process.env.TODOIST_WEBHOOK_PATH ?? "/todoist",
480
+ clientId: process.env.TODOIST_CLIENT_ID,
481
+ oauthPath: process.env.TODOIST_OAUTH_PATH ?? "/oauth",
257
482
  ingressProjectIds: ids,
258
483
  projectOwners: owners,
259
484
  defaultOwner: process.env.TODOIST_DEFAULT_OWNER,
@@ -280,6 +505,8 @@ export function startTodoistWebhook(deps) {
280
505
  server.listen(cfg.port, cfg.bind, () => {
281
506
  log(`todoist-webhook: listening on ${cfg.bind}:${cfg.port}${cfg.path}, ` +
282
507
  `${cfg.ingressProjectIds.size} ingress project(s), default owner ${cfg.defaultOwner ?? "(none)"}`);
508
+ log(`todoist-webhook: OAuth landing on ${cfg.oauthPath}` +
509
+ (cfg.clientId ? "" : " — inert until TODOIST_CLIENT_ID is set"));
283
510
  });
284
511
  server.on("error", (err) => log(`todoist-webhook: server error — ${err.message}`));
285
512
  return server;
@@ -1 +1 @@
1
- {"version":3,"file":"todoist-webhook.js","sourceRoot":"","sources":["../../src/daemon/todoist-webhook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"todoist-webhook.js","sourceRoot":"","sources":["../../src/daemon/todoist-webhook.ts"],"names":[],"mappings":"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"}
package/dist/mcp/index.js CHANGED
@@ -159,11 +159,13 @@ const server = new McpServer({ name: "aibroker", version: "0.7.0" }, {
159
159
  "| `[PAILot]` | Text from PAILot app | `pailot_send` (text reply) |",
160
160
  "| `[PAILot:voice]` | Voice from PAILot app | `pailot_tts` (VOICE reply — NEVER pailot_send) |",
161
161
  "| `[Session:NAME]` | Text from another Claude Code session | `aibroker_send_to_session` (reply to NAME) |",
162
- "| `[Task]` | A dispatched work order from the task bus | **Do NOT reply** — act on it, then close it on the tracker |",
162
+ "| `[Task]` | A work order or question from the task bus | Act on it. If it asked anything, answer with `todoist_reply` using the id in the `[todoist:…]` trailer — the asker filed it from a phone and will not see this terminal. Leave the task open; closing it is theirs. |",
163
+ "| `[Task:comment]` | A comment on a task you already handled | A correction or follow-up to work in flight, NOT a new work order — adjust what you did, do not start over. Same `[todoist:…]` trailer, same reply route. |",
163
164
  "| _no prefix_ | User typing at the terminal | Terminal only — do NOT send to any channel |",
164
165
  "",
165
166
  "### Rules",
166
167
  "",
168
+ "- **NEVER open a blocking interactive prompt for a channel message.** Multi-select menus and any modal that waits for a keypress freeze the session, and the person who sent the message is not at this terminal to answer it — so the session is stuck until someone notices, and the answer they wanted never comes. This applies to every prefixed message: `[Task]`, `[Task:comment]`, `[PAILot]`, `[Whazaa]`, `[Telex]`, `[Session:…]`. Instead: decide it yourself if the choice is routine, and say which option you took and why; if it genuinely needs the human, ASK ON THE CHANNEL IT CAME FROM (`todoist_reply`, `pailot_send`, `whatsapp_send`, …) and stop there. A question asked on the channel can be answered from a phone; a modal cannot.",
167
169
  "- **Strip the prefix** before processing the message content.",
168
170
  "- **Match the medium**: text in → text out, voice in → voice out. This is NON-NEGOTIABLE.",
169
171
  "- **Same content**: send the same response as the terminal — do not shorten or paraphrase.",
@@ -419,7 +421,33 @@ server.tool("aibroker_get_cached_status", "Retrieve cached session status summar
419
421
  return err(e);
420
422
  }
421
423
  });
422
- server.tool("aibroker_send_to_session", "Send a message to another iTerm2 session by typing it into the session's terminal AND depositing it into that session's AIBP mailbox. The target can be a session index (e.g. '2'), a session name substring, or an iTerm2 session UUID. The receiving session can read structured messages via aibroker_receive. NOTE: The [Session:SENDER] prefix is auto-prepended by the hub — do NOT include it in the message.", {
424
+ server.tool("todoist_ingress", "List or change which Todoist projects may reach a session. A task filed into an allowed project becomes an instruction a session runs with the user's full rights, so this is a security boundary: grant deliberately, never speculatively, and tell the user what you granted. Takes effect immediately — no daemon restart. Every change is recorded in the audit trail.", {
425
+ action: z.enum(["list", "add", "remove"]).describe("list (default), add, or remove"),
426
+ projectId: z.string().optional().describe("Todoist project id. Required for add and remove."),
427
+ owner: z.string().optional().describe("Session that owns work filed there — a curated PAI alias, not merely a running tab name. Omit to fall through to the default owner."),
428
+ projectName: z.string().optional().describe("Human-readable label, so the stored grant is readable later"),
429
+ }, async ({ action, projectId, owner, projectName }) => {
430
+ try {
431
+ const r = await hub.call_raw("todoist_ingress", { action, projectId, owner, projectName });
432
+ return ok(JSON.stringify(r, null, 2));
433
+ }
434
+ catch (e) {
435
+ return err(e);
436
+ }
437
+ });
438
+ server.tool("todoist_reply", "Answer on the Todoist task a [Task] work order came from, as a comment. Use this whenever a task asked a question — the reply appears under the task on the asker's phone instead of only in this terminal. The 🤖 prefix is added automatically so the comment is not read back as a new instruction. Does NOT complete the task: leave that to the human, or the answer disappears from their list with it.", {
439
+ taskId: z.string().min(1).describe("Todoist task id, as reported in the audit trail for the delivery"),
440
+ text: z.string().min(1).describe("The answer. Plain text or Markdown; do not add the 🤖 prefix yourself."),
441
+ }, async ({ taskId, text }) => {
442
+ try {
443
+ const r = await hub.call_raw("todoist_reply", { taskId, text });
444
+ return ok(`Replied on task ${r.taskId ?? taskId}`);
445
+ }
446
+ catch (e) {
447
+ return err(e);
448
+ }
449
+ });
450
+ server.tool("aibroker_send_to_session", "Send a message to another iTerm2 session by typing it into the session's terminal AND depositing it into that session's AIBP mailbox. The target can be a session index (e.g. '2'), a session name substring, or an iTerm2 session UUID. The receiving session can read structured messages via aibroker_receive. NOTE: The [Session:SENDER] prefix is auto-prepended by the hub — do NOT include it in the message. The result distinguishes `delivered: true` (the target was observed taking it) from `delivered: false, queued: true` (typed but unconfirmed — the target is probably mid-task; the message is in its mailbox). Do not read ok:true as \"they have seen it\".", {
423
451
  target: z.string().min(1).describe("Session to send to: index (1-based), name substring, or iTerm2 session UUID"),
424
452
  message: z.string().min(1).describe("The raw message content. Do NOT include a [Session:...] prefix — the hub auto-prepends [Session:SENDER_NAME] for routing."),
425
453
  }, async ({ target, message }) => {