@theronap/cortex-mcp 0.9.134 → 0.9.135

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 (2) hide show
  1. package/lib/server.mjs +14 -2
  2. package/package.json +1 -1
package/lib/server.mjs CHANGED
@@ -2418,7 +2418,7 @@ function renderNudge(payload) {
2418
2418
  'capture_meeting',
2419
2419
  {
2420
2420
  title: 'Capture a meeting transcript, joined to its calendar event',
2421
- description: "Capture a meeting transcript you were given — a paste, an export, notes — as a real record joined to the calendar event it came from. ⚠ CALL IT TWICE. Without `calendar_record_id` it WRITES NOTHING and returns candidate calendar events near that time; you pick one and call again. Overlap alone is not an answer — 90 of 120 calendar records are recurring birthdays and an all-day event overlaps its whole day, so each candidate carries `caveats` saying why it might be wrong. Read them before choosing. WHY THE JOIN MATTERS: a pasted transcript has no attendee list, so on its own it is reachable from nobody. The calendar event's attendee list is authoritative, and the captured meeting inherits it — that is what makes the transcript findable from the people who were in it. The brain follows from the matched event; you never pick one. Attendees who have no page come back as `unclaimed` — each is a person in the room nobody has authored, and authoring one reaches every past event they were in, not just this meeting. Meetings are stored `scoped`, never org-wide.",
2421
+ description: "Capture a meeting transcript you were given — a paste, an export, notes — as a real record joined to the calendar event it came from. ⚠ CALL IT TWICE. Without `calendar_record_id` it WRITES NOTHING and returns candidate calendar events near that time; you pick one and call again. Overlap alone is not an answer — 90 of 120 calendar records are recurring birthdays and an all-day event overlaps its whole day, so each candidate carries `caveats` saying why it might be wrong. Read them before choosing. WHY THE JOIN MATTERS: a pasted transcript has no attendee list, so on its own it is reachable from nobody. The calendar event's attendee list is authoritative, and the captured meeting inherits it — that is what makes the transcript findable from the people who were in it. The brain follows from the matched event; you never pick one. Attendees who have no page come back as `unclaimed` — each is a person in the room nobody has authored, and authoring one reaches their EXISTING records too, not only future meetings: claiming their identifier heals history in the same statement. Measured 2026-09-03 — ten calendar records spanning two months attached 49ms after the claim. ⚠ THE CONFIRMATION DOES NOT TELL YOU THAT. It says only that future events will attach, so a heal that just moved ten records is indistinguishable from one that did nothing. Verify by reading the page, never by trusting the reply. Meetings are stored `scoped`, never org-wide.",
2422
2422
  inputSchema: {
2423
2423
  occurred_at: z.string().describe('when the meeting STARTED, ISO 8601. Required for both the proposal and the capture.'),
2424
2424
  ends_at: z.string().optional().describe('when it ended, ISO 8601. Omit and the calendar event\'s end is inherited. NEVER guess one — unknown must stay unknown.'),
@@ -3339,7 +3339,19 @@ function renderNudge(payload) {
3339
3339
  const out = await res.json().catch(() => null)
3340
3340
  if (!res.ok) return toolError(`Could not set routing identifier: ${out?.error ?? res.status}`)
3341
3341
  const set = out?.set?.join(', ') ?? identifier
3342
- return { content: [{ type: 'text', text: `Routing identifier set on document ${out?.documentId ?? '?'}: ${set}. Future matching events will attach here (body mentions alone will not).` }] }
3342
+ // SAY WHAT ALREADY HAPPENED, NOT ONLY WHAT WILL. The claim heals history in the same
3343
+ // statement, so by the time this renders, existing records are ALREADY attached. The previous
3344
+ // wording mentioned only future events — true, and load-bearingly incomplete, which is harder
3345
+ // to catch than a false statement because checking it confirms it.
3346
+ // A ZERO IS EXPLAINED, not printed bare: an unexplained 0 recreates the same ambiguity one
3347
+ // level down, and identity claims (email:, thread:) attach only the CLAIMANT'S OWN records.
3348
+ const healed = typeof out?.attachedExisting === 'number' ? out.attachedExisting : null
3349
+ const healedLine = healed === null
3350
+ ? ''
3351
+ : healed > 0
3352
+ ? ` ${healed} existing record(s) ALREADY attached to this page as a result.`
3353
+ : ' 0 existing records attached — either nothing carries this identifier yet, or records do but belong to another owner (an identity claim only attaches your own).'
3354
+ return { content: [{ type: 'text', text: `Routing identifier set on document ${out?.documentId ?? '?'}: ${set}.${healedLine} Future matching events will attach here too (body mentions alone will not).` }] }
3343
3355
  },
3344
3356
  )
3345
3357
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theronap/cortex-mcp",
3
- "version": "0.9.134",
3
+ "version": "0.9.135",
4
4
  "description": "Connect your AI assistant to Cortex — your org's projects, activity, gaps, and directives, scoped to you.",
5
5
  "type": "module",
6
6
  "bin": {