@theronap/agnoclast-mcp 0.9.217 → 0.9.219

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.
@@ -33,7 +33,7 @@ export const ALLOWED_TOOL_NAMES = [
33
33
  'list_records', 'read_record', 'page_history', 'page_diff', 'timeline_pull', 'my_brains', 'my_sessions', 'writing_style',
34
34
  'code_graph_query', 'my_retier_notices', 'list_page_grants', 'list_project_members', 'file_requests',
35
35
  // the questions agents used to answer with SQL (2026-10-07) — read-only, the caller's own view
36
- 'record_status', 'my_connectors', 'brain_stats', 'my_sends',
36
+ 'record_status', 'my_connectors', 'brain_stats', 'my_sends', 'find_arrivals',
37
37
  // live authoring core
38
38
  'authoring_context', 'author', 'log_session',
39
39
  // routine, reversible maintenance
package/lib/server.mjs CHANGED
@@ -4512,7 +4512,7 @@ function renderNudge(payload) {
4512
4512
  'list_records',
4513
4513
  {
4514
4514
  title: 'List activity records (filtered)',
4515
- description: 'List recent activity records you can see, filtered by type, project, page, source and recency. RLS-scoped. Use to enumerate "what happened on project X this week", "recent meetings", or EVERYTHING FILED ON A PAGE — pass `page` (its name or ref) to read a channel\'s items or a project page\'s records, with order:"oldest" to read a series in sequence, `offset` to page past 50, and `match` to narrow to records mentioning something. A long result holds whole records back and tells you the offset to resume from. Returns each record\'s FULL summary + id — never a truncated preview, so what you get back is the whole record you are permitted to read (use an id with request_file to ask its owner for the original file).',
4515
+ description: 'List recent activity records you can see, filtered by type, project, page, source and recency. RLS-scoped. Use to enumerate "what happened on project X this week", "recent meetings", or EVERYTHING FILED ON A PAGE — pass `page` (its name or ref) to read a channel\'s items or a project page\'s records, with order:"oldest" to read a series in sequence, `offset` to page past 50, and `match` to narrow to records mentioning something. A long result holds whole records back and tells you the offset to resume from. Returns each record\'s FULL summary + id — never a truncated preview, so what you get back is the whole record you are permitted to read (use an id with request_file to ask its owner for the original file). For HOW MANY rather than which, pass `group_by` ("emails per week", "which pages get the most", "who logged the most sessions"): counts over exactly the records the same filters would list.',
4516
4516
  inputSchema: {
4517
4517
  type: z.string().optional().describe("record type, e.g. 'meeting', 'comm', 'activity', 'ai_session', 'doc', 'note'"),
4518
4518
  project: z.string().optional().describe('project key to filter to (e.g. "cortex")'),
@@ -4526,10 +4526,12 @@ function renderNudge(payload) {
4526
4526
  match: z.string().optional().describe('only records whose title or text contains this (case-insensitive, literal) — e.g. one book on a channel that carries several, one ticket in a queue'),
4527
4527
  container: z.string().optional().describe('a container\'s record id (a class session, a meeting) — lists the records INSIDE it. read_record on the container shows the same list with its own content'),
4528
4528
  person: z.string().optional().describe('a member\'s exact display name or email — only the records they created (within what you can see)'),
4529
+ group_by: z.enum(['day', 'week', 'month', 'source', 'type', 'project', 'person', 'page']).optional().describe('return COUNTS instead of records, grouped by this — every other filter still applies (not container). Days and weeks are in your timezone (my_settings). Under "page" a record filed on several pages counts once per page, and a page you cannot read is never named'),
4529
4530
  },
4530
4531
  },
4531
- async ({ type, project, since_days, limit, session, page, source, order, offset, match, container, person }) => {
4532
+ async ({ type, project, since_days, limit, session, page, source, order, offset, match, container, person, group_by }) => {
4532
4533
  const qs = new URLSearchParams()
4534
+ if (group_by) qs.set('group_by', group_by)
4533
4535
  if (container) qs.set('container', container)
4534
4536
  if (person) qs.set('person', person)
4535
4537
  if (page) qs.set('page', page)
@@ -4660,6 +4662,34 @@ function renderNudge(payload) {
4660
4662
  },
4661
4663
  )
4662
4664
 
4665
+ server.registerTool(
4666
+ 'find_arrivals',
4667
+ {
4668
+ title: 'Ask the arrival pile a question',
4669
+ description: 'Search YOUR arrivals that are in no brain yet — both piles: STAGED (held because nothing could place them) and SEALED (private intake units waiting to be judged) — by identifier prefix, source and age. Use it for "which arrivals carry the files my PR touched?" (identifier: "file:owner/repo:path/" or "repo:owner/name"), "what email from dave@x.com is waiting?" (identifier: "email:dave@x.com"), "what has sat unfiled for 2+ days?" (older_than_hours: 48). Returns ids you can open with staged_look / intake_look and file with place_staged_record / intake_claim → intake_materialize. Plaintext metadata only: a sealed unit\'s content is never opened here. ⚠ A staged arrival matches only on the identifiers HOLDING it (the unclaimed ones).',
4670
+ inputSchema: {
4671
+ identifier: z.string().optional().describe('an identifier or the start of one, matched literally: "file:theronap/cortex:web/lib/", "repo:theronap/cortex", "email:someone@x.com"'),
4672
+ source: z.string().optional().describe("one source: 'email', 'email-in', 'github', 'claude-code', 'imessage', 'meeting'…"),
4673
+ older_than_hours: z.number().optional().describe('only arrivals waiting longer than this'),
4674
+ newer_than_hours: z.number().optional().describe('only arrivals from the last N hours'),
4675
+ pile: z.enum(['staged', 'sealed', 'both']).optional().describe('default both'),
4676
+ limit: z.number().optional().describe('default 30, max 100'),
4677
+ },
4678
+ },
4679
+ async ({ identifier, source, older_than_hours, newer_than_hours, pile, limit }) => {
4680
+ const qs = new URLSearchParams()
4681
+ if (identifier) qs.set('identifier', identifier)
4682
+ if (source) qs.set('source', source)
4683
+ if (older_than_hours != null) qs.set('older_than_hours', String(older_than_hours))
4684
+ if (newer_than_hours != null) qs.set('newer_than_hours', String(newer_than_hours))
4685
+ if (pile) qs.set('pile', pile)
4686
+ if (limit != null) qs.set('limit', String(limit))
4687
+ const r = await readText('search your arrivals', `${BASE}/api/arrivals?${qs}`)
4688
+ if (r.error) return r.error
4689
+ return { content: [{ type: 'text', text: r.json?.text ?? '' }] }
4690
+ },
4691
+ )
4692
+
4663
4693
  server.registerTool(
4664
4694
  'my_sends',
4665
4695
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theronap/agnoclast-mcp",
3
- "version": "0.9.217",
3
+ "version": "0.9.219",
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": {