@theronap/agnoclast-mcp 0.9.192 → 0.9.194

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.
@@ -36,7 +36,14 @@ export function renderTriage(t, name) {
36
36
  // their manager's pages as stubs, reported the manager had done "no work at all", and recommended
37
37
  // authoring them: duplicates of pages someone else runs. Additive flag, checked after `demoted` and
38
38
  // before `category`, so an older server that omits it gets the old wording.
39
- return `\n\n[[${name}]] EXISTS, but it has not been shared with you — it is authored, you just cannot read it. It is NOT missing, and it does not mean nobody has worked on it.${refs} Do NOT author it: that would create a duplicate of a page someone else is responsible for. If you need what is on it, ask the person responsible for that work to share it with you (\`grant_page_access\`).`
39
+ // 2026-10-01 — WHO TO ASK. The server names the hidden page's owner when that is someone this
40
+ // reader can already see (Theron, 2026-09-30: a hidden page met through a link should say who to
41
+ // ask, not just stop you). Additive: an older server omits `askOwners` and the generic line stands.
42
+ const who = Array.isArray(t.askOwners) ? t.askOwners.filter((n) => typeof n === 'string' && n.trim()) : []
43
+ const ask = who.length
44
+ ? `${who.length === 1 ? `${who[0]} is` : `${who.slice(0, -1).join(', ')} and ${who[who.length - 1]} are`} responsible for it. If you need what is on it, ask ${who.length === 1 ? 'them' : 'one of them'} to share it with you (\`grant_page_access\`).`
45
+ : 'If you need what is on it, ask the person responsible for that work to share it with you (`grant_page_access`).'
46
+ return `\n\n[[${name}]] EXISTS, but it has not been shared with you — it is authored, you just cannot read it. It is NOT missing, and it does not mean nobody has worked on it.${refs} Do NOT author it: that would create a duplicate of a page someone else is responsible for. ${ask}`
40
47
  }
41
48
  if (t.category === 'node') {
42
49
  return `\n\n[[${name}]] is a wanted page — a ${t.isPerson ? 'person' : 'node'} exists but has no page yet.${refs} Either author it now with \`author\`, or ${aliasHint}.`
package/lib/server.mjs CHANGED
@@ -559,7 +559,7 @@ function renderNudge(payload) {
559
559
  title: z.string().optional().describe('short title for the session'),
560
560
  sessionId: z.string().optional().describe('the Claude Code session id — DEFAULTS to the current session, so omit it unless you are logging on behalf of another one. It is shared by every segment and the only thing pairing them, and it is also the join to the pages this session wrote (page_revisions.session_key); without it the record is unattributable forever, since the fallback dedupe key is a timestamp. Deliberately NOT a link: segments never reference each other, so a reader cleared for one brain cannot tell the others exist, while you can join on it across brains'),
561
561
  brain: z.string().optional().describe('which brain to record this session in (name or org id, one of your own). REQUIRED IN EFFECT for a multi-brain member: session-class sources route only by an explicit brain or a sole membership, so omitting it stages the log instead of recording it.'),
562
- privacy: z.enum(['accessible', 'scoped', 'confidential']).optional().describe('tier this record AT WRITE TIME. Use when the summary names confidential work (a candidate evaluation, a security finding) — safer than letting it land org-visible and re-tiering after, which leaves it readable in between.'),
562
+ privacy: z.enum(['accessible', 'scoped', 'confidential']).optional().describe('tier this record AT WRITE TIME. A record is normally read by whoever can read the page it is filed under. Pass "confidential" when the summary names confidential work (a candidate evaluation, a security finding) so it is yours alone from the start — safer than letting it land page-visible and locking it after, which leaves it readable in between. Pass "scoped" to lock it to you and your managers. OMIT it for ordinary work: the record then follows its page, which is what makes it visible to the people working on that page with you.'),
563
563
  },
564
564
  },
565
565
  async ({ summary, segments, project, title, sessionId, brain, privacy }) => {
@@ -4404,10 +4404,10 @@ function renderNudge(payload) {
4404
4404
  'set_record_privacy',
4405
4405
  {
4406
4406
  title: 'Set a record\'s privacy tier',
4407
- description: 'Reclassify the access tier of one of YOUR OWN records: "accessible" (anyone in the org), "scoped" (you + your management chain), or "confidential" (you + people you explicitly grant access). Get record_id from a `list_records` result or the "id:" on a `my_context` activity line. Only affects records you own — others return an error.',
4407
+ description: 'Lock or release one of YOUR OWN records. A record is read by whoever can read the PAGE it is filed under; this is how you make one tighter than its page, or let it follow its page again. "accessible" = no lock, the record follows its page · "scoped" = locked to you and your managers, within the page\'s audience · "confidential" = you only, plus people you explicitly grant. Naming a tier IS the deliberate act: setting "scoped" on a record that already reads scoped locks it (most records are born scoped by default, which restricts nothing). Session summaries captured before 2026-10-01 are locked at scoped until you release them with "accessible". A record filed under no page is yours alone whatever its tier. Get record_id from a `list_records` result or the "id:" on a `my_context` activity line. Only affects records you own — others return an error.',
4408
4408
  inputSchema: {
4409
4409
  record_id: z.string().describe('the record id (uuid), e.g. the "id:" on a list_records line'),
4410
- privacy: z.enum(['accessible', 'scoped', 'confidential']).describe('the new access tier'),
4410
+ privacy: z.enum(['accessible', 'scoped', 'confidential']).describe('accessible = follow the page (no lock); scoped = lock to you + your managers; confidential = you only'),
4411
4411
  },
4412
4412
  },
4413
4413
  async ({ record_id, privacy }) => {
@@ -5069,7 +5069,7 @@ function renderNudge(payload) {
5069
5069
  'set_page_privacy',
5070
5070
  {
5071
5071
  title: 'Change who can see a wiki page',
5072
- description: `Re-tier a wiki page you own or may edit. ${PAGE_TIER_GLOSS}. Every tier but confidential is also readable by the page owner's managers. ⚠ reports / peers / down are RELATIVE TO THE PAGE'S OWNER, computed live: the audience is the OWNER's team, it changes when the owner moves in the org chart or the page is transferred, and ONLY the owner can move a page to or from one of them. They never change a record — records filed under the page are read by that same audience, each still capped by its own tier. Demoting a PROJECT page to scoped or confidential also demotes its evidence records (demote-only; each record's owner is notified and can revert). Promotions never touch records. Org admins may narrow any page to scoped or confidential, never widen.`,
5072
+ description: `Re-tier a wiki page you own or may edit. ${PAGE_TIER_GLOSS}. Every tier but confidential is also readable by the page owner's managers. ⚠ reports / peers / down are RELATIVE TO THE PAGE'S OWNER, computed live: the audience is the OWNER's team, it changes when the owner moves in the org chart or the page is transferred, and ONLY the owner can move a page to or from one of them. RECORDS FOLLOW THE PAGE: a record filed under a page is read by whoever can read that page, so widening a page widens its records and narrowing it narrows them — except a record its owner locked (set_record_privacy) or made confidential, which stays tighter. Demoting a PROJECT page to scoped or confidential also rewrites its evidence records' own tier to match (each record's owner is notified and can revert). Org admins may narrow any page to scoped or confidential, never widen.`,
5073
5073
  inputSchema: {
5074
5074
  kind: z.enum(['project', 'person', 'org', 'user']).describe('the page kind'),
5075
5075
  name: z.string().optional().describe('the exact page name (or pass `ref` instead — one of the two is required)'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theronap/agnoclast-mcp",
3
- "version": "0.9.192",
3
+ "version": "0.9.194",
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": {