@novaeo/brain-connector 0.1.0 → 0.3.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.
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  A standalone [Model Context Protocol](https://modelcontextprotocol.io) (MCP)
4
4
  connector for the **Novaeo Brain** — your company's permission-aware memory.
5
- It runs as a local **stdio** MCP server and exposes nine Brain tools to any MCP
6
- client (Claude Desktop, Cursor, Codex, or a generic stdio host). Every call is
7
- made over HTTPS to the Brain API, authenticated with your personal token. The
5
+ It runs as a local **stdio** MCP server and exposes twenty Brain tools to any
6
+ MCP client (Claude Desktop, Cursor, Codex, or a generic stdio host). Every call
7
+ is made over HTTPS to the Brain API, authenticated with your personal token. The
8
8
  token **is** your identity: the server resolves who you are and only ever
9
9
  returns what you are allowed to see.
10
10
 
@@ -18,14 +18,57 @@ and no secrets. Its only runtime dependencies are
18
18
  |---|---|
19
19
  | `search_brain` | Permission-filtered semantic search; returns ranked snippets with citations. |
20
20
  | `answer_from_brain` | Grounded answer to a question, with source citations. |
21
+ | `ask_novi` | The full Novi agent loop with your permissions — plans, calls tools, returns a cited answer. |
21
22
  | `write_brain_memory` | Write a draft note into the brain under a visibility policy. |
22
- | `list_action_items` | List action items (defaults to your own). |
23
- | `create_action_item` | Create an action item with owner, project, and due date. |
24
- | `update_action_item` | Update an action item's status or fields. |
23
+ | `get_me` | Your identity, capabilities, and admin/review flags. |
24
+ | `list_visibility_policies` | Visibility policies you may write to (ids for `write_brain_memory` / `create_action_item`). |
25
+ | `list_projects` | List projects (ids for task assignment and filters). |
26
+ | `list_pods` | List active pods (ids for task assignment and filters). |
27
+ | `list_directory` | List people in the workspace (identity ids for owners/assignees). |
28
+ | `list_action_items` | List action items (defaults to your own open items; rich filters, cursor pagination, server-side totals). |
29
+ | `get_action_item` | Get one action item, including its `updatedAt` and your capabilities. |
30
+ | `create_action_item` | Create an action item (full field set: priority, dates, frequency, pod, estimate, attachments, …). Returns the full created item including `updatedAt`. |
31
+ | `update_action_item` | Update an action item's status or fields (optimistic concurrency via `expectedUpdatedAt`). |
32
+ | `list_task_events` | Activity/event history of an action item. |
33
+ | `list_task_comments` | List comments on an action item. |
34
+ | `create_task_comment` | Comment on an action item (progress notes, findings). |
35
+ | `update_task_comment` | Edit or delete one of your comments. |
25
36
  | `create_reminder` | Create a reminder that inherits its trigger message's visibility. |
26
37
  | `summarize_thread` | Summarize a chat thread into a short, cited summary. |
27
38
  | `promote_to_curated_note` | Promote a reviewed note into the curated `novaeo-brain` vault. |
28
39
 
40
+ ### Listing action items without miscounting
41
+
42
+ `list_action_items` returns **one page**, capped at `limit` (max 100). Two habits keep
43
+ the results honest:
44
+
45
+ - **Paginate with `cursor`.** A non-null `nextCursor` in the response means more items
46
+ match. Pass it back as `cursor`, with the same filters and sort, to get the next page —
47
+ a cursor is bound to the filters that minted it, and reusing one after changing a filter
48
+ is an error rather than a silently short page.
49
+ - **Count with `includeStats`, never by counting rows.** `stats` is a server-side
50
+ aggregate over *every* item matching your filter (under your permissions), so it stays
51
+ correct when the page is capped. Its by-status buckets — `open`, `inProgress`,
52
+ `blocked`, `completed`, `cancelled` — sum to `total`. Add `includeClosed: true` for a
53
+ breakdown across all statuses. Counting the returned rows instead reports the page cap
54
+ as though it were a total.
55
+
56
+ Rows are a **compact projection** by default (`id`, `itemNumber`, `title`, `status`,
57
+ `priority`, `dueDate`, `ownerName`, `ownerIdentityId`, `lastActivityAt`, `updatedAt`) —
58
+ enough to identify, triage, and immediately update an item. Pass `verbose: true` for the
59
+ full field set. `lastActivityFrom` / `lastActivityTo` window the set on `last_activity_at`,
60
+ which is also the default sort key; items with no recorded activity fall outside any window.
61
+ Both take an ISO date (`YYYY-MM-DD`) or a full ISO instant, normalized to UTC — a date-only
62
+ bound covers that entire UTC day, so `lastActivityTo: "2026-08-19"` includes the 19th.
63
+
64
+ Unknown arguments are rejected with an MCP `InvalidParams` error rather than silently
65
+ dropped, so a call that works around a schema gap fails loudly instead of returning
66
+ correct-looking page-one data.
67
+
68
+ Two governance tools are hidden unless the connector starts with
69
+ `BRAIN_RULE_TIER_ENABLED=on` / `BRAIN_LAW_TIER_ENABLED=on`:
70
+ `promote_to_rule` and `set_law` (reviewer / Brain-admin enforced server-side).
71
+
29
72
  ## Configuration
30
73
 
31
74
  Two environment variables are **required**. The connector exits with a clear
@@ -0,0 +1,24 @@
1
+ /** The fields a listing needs to be useful: identify, triage, and act. */
2
+ export declare const COMPACT_ACTION_ITEM_FIELDS: readonly ["id", "itemNumber", "title", "status", "priority", "dueDate", "ownerName", "ownerIdentityId", "lastActivityAt", "updatedAt"];
3
+ /**
4
+ * Drop snake_case keys that merely duplicate a camelCase twin. A snake_case key
5
+ * with no twin (`closed_by_identity_id`, `updated_by_identity_id`) is renamed
6
+ * rather than dropped, so no *field* is lost by folding the casing. Where both
7
+ * casings are present the camelCase one wins outright — if the two ever
8
+ * disagreed the API would already be serialising one item two ways, and
9
+ * camelCase is the documented surface.
10
+ */
11
+ export declare function camelizeActionItem(item: Record<string, unknown>): Record<string, unknown>;
12
+ /** One item, full camelCase field set. Used for get/create responses. */
13
+ export declare function shapeActionItem(value: unknown): unknown;
14
+ /** `{ item, capabilities, correlationId }` — shape the nested item in place. */
15
+ export declare function shapeActionItemDetail(response: unknown): unknown;
16
+ /**
17
+ * A list response: camelCase items, compact unless `verbose`. Everything else
18
+ * on the envelope (`nextCursor`, `withheldCount`, `stats`, `correlationId`) is
19
+ * preserved untouched — those are how a caller knows the page is not the set.
20
+ */
21
+ export declare function shapeActionItemList(response: unknown, options: {
22
+ verbose: boolean;
23
+ }): unknown;
24
+ //# sourceMappingURL=action-item-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-item-shape.d.ts","sourceRoot":"","sources":["../src/action-item-shape.ts"],"names":[],"mappings":"AAYA,0EAA0E;AAC1E,eAAO,MAAM,0BAA0B,wIAc7B,CAAC;AAMX;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzF;AAMD,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEvD;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAGhE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAa7F"}
@@ -0,0 +1,89 @@
1
+ /* ---------------------------------------------------------------------------
2
+ * NOVI-387 — response shaping for action-item payloads.
3
+ *
4
+ * The Brain API serialises every action item in BOTH casings (`dueDate` and
5
+ * `due_date`, `actualMinutesByDate` and `actual_minutes_by_date`, ~25 fields
6
+ * deep) for a legacy consumer. That doubles the wire payload: 100 items came to
7
+ * ~223 KB, past MCP client output limits, so a routine list call spilled to a
8
+ * file the agent then had to parse. The connector's documented surface is
9
+ * camelCase, so the duplicates are folded away here — and a list defaults to a
10
+ * compact projection, with `verbose: true` for the full item.
11
+ * ------------------------------------------------------------------------- */
12
+ /** The fields a listing needs to be useful: identify, triage, and act. */
13
+ export const COMPACT_ACTION_ITEM_FIELDS = [
14
+ "id",
15
+ // The durable "#1247" that chat posts quote.
16
+ "itemNumber",
17
+ "title",
18
+ "status",
19
+ "priority",
20
+ "dueDate",
21
+ "ownerName",
22
+ "ownerIdentityId",
23
+ "lastActivityAt",
24
+ // Carried so an immediate follow-up edit needs no re-read: update_action_item
25
+ // requires it as expectedUpdatedAt.
26
+ "updatedAt",
27
+ ];
28
+ function toCamelCase(key) {
29
+ return key.replace(/_([a-z0-9])/g, (_match, char) => char.toUpperCase());
30
+ }
31
+ /**
32
+ * Drop snake_case keys that merely duplicate a camelCase twin. A snake_case key
33
+ * with no twin (`closed_by_identity_id`, `updated_by_identity_id`) is renamed
34
+ * rather than dropped, so no *field* is lost by folding the casing. Where both
35
+ * casings are present the camelCase one wins outright — if the two ever
36
+ * disagreed the API would already be serialising one item two ways, and
37
+ * camelCase is the documented surface.
38
+ */
39
+ export function camelizeActionItem(item) {
40
+ const out = {};
41
+ for (const [key, value] of Object.entries(item)) {
42
+ if (!key.includes("_")) {
43
+ out[key] = value;
44
+ continue;
45
+ }
46
+ const camel = toCamelCase(key);
47
+ if (camel === key || camel in item)
48
+ continue;
49
+ out[camel] = value;
50
+ }
51
+ return out;
52
+ }
53
+ function isRecord(value) {
54
+ return typeof value === "object" && value !== null && !Array.isArray(value);
55
+ }
56
+ /** One item, full camelCase field set. Used for get/create responses. */
57
+ export function shapeActionItem(value) {
58
+ return isRecord(value) ? camelizeActionItem(value) : value;
59
+ }
60
+ /** `{ item, capabilities, correlationId }` — shape the nested item in place. */
61
+ export function shapeActionItemDetail(response) {
62
+ if (!isRecord(response) || !isRecord(response.item))
63
+ return shapeActionItem(response);
64
+ return { ...response, item: camelizeActionItem(response.item) };
65
+ }
66
+ /**
67
+ * A list response: camelCase items, compact unless `verbose`. Everything else
68
+ * on the envelope (`nextCursor`, `withheldCount`, `stats`, `correlationId`) is
69
+ * preserved untouched — those are how a caller knows the page is not the set.
70
+ */
71
+ export function shapeActionItemList(response, options) {
72
+ if (!isRecord(response) || !Array.isArray(response.items))
73
+ return response;
74
+ const items = response.items.map((raw) => {
75
+ if (!isRecord(raw))
76
+ return raw;
77
+ const camel = camelizeActionItem(raw);
78
+ if (options.verbose)
79
+ return camel;
80
+ const compact = {};
81
+ for (const field of COMPACT_ACTION_ITEM_FIELDS) {
82
+ if (field in camel)
83
+ compact[field] = camel[field];
84
+ }
85
+ return compact;
86
+ });
87
+ return { ...response, items };
88
+ }
89
+ //# sourceMappingURL=action-item-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-item-shape.js","sourceRoot":"","sources":["../src/action-item-shape.ts"],"names":[],"mappings":"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"}
@@ -29,11 +29,29 @@ export interface SearchPayload {
29
29
  query: string;
30
30
  limit?: number;
31
31
  answerMode?: "private" | "shared";
32
+ sourceTypes?: string[];
33
+ functionSlug?: string;
34
+ projectId?: string;
35
+ /** Time window on source event time (ISO); sinceDays is a relative lookback. */
36
+ since?: string;
37
+ until?: string;
38
+ sinceDays?: number;
32
39
  }
33
40
  export interface AnswerPayload {
34
41
  query: string;
35
42
  limit?: number;
36
43
  answerMode?: "private" | "shared";
44
+ sourceTypes?: string[];
45
+ functionSlug?: string;
46
+ projectId?: string;
47
+ since?: string;
48
+ until?: string;
49
+ sinceDays?: number;
50
+ }
51
+ export interface AgentPayload {
52
+ query: string;
53
+ answerMode?: "private" | "shared";
54
+ threadId?: string;
37
55
  }
38
56
  export interface WriteMemoryPayload {
39
57
  title: string;
@@ -45,6 +63,27 @@ export interface ListActionItemsPayload {
45
63
  ownerIdentityId?: string;
46
64
  status?: "open" | "in_progress" | "blocked" | "done" | "cancelled";
47
65
  limit?: number;
66
+ projectId?: string;
67
+ includeClosed?: boolean;
68
+ priority?: Array<"urgent" | "high" | "normal" | "low" | "none">;
69
+ q?: string;
70
+ dueFrom?: string;
71
+ dueTo?: string;
72
+ pod?: string;
73
+ /** Opaque `nextCursor` from a previous page. Without it a caller with more
74
+ * than `limit` matching items simply cannot reach page two. */
75
+ cursor?: string;
76
+ /** Window on `last_activity_at`, which is also the default sort key. */
77
+ lastActivityFrom?: string;
78
+ lastActivityTo?: string;
79
+ sort?: "due_date" | "priority" | "last_activity_at" | "created_at";
80
+ dir?: "asc" | "desc";
81
+ /** Ask for server-side totals over the whole matching set, not the page. */
82
+ includeStats?: boolean;
83
+ }
84
+ export interface ActionItemAttachmentLink {
85
+ url: string;
86
+ label?: string;
48
87
  }
49
88
  export interface CreateActionItemPayload {
50
89
  title: string;
@@ -53,14 +92,45 @@ export interface CreateActionItemPayload {
53
92
  projectId?: string;
54
93
  sourceMessageId?: string;
55
94
  visibilityPolicyId?: string;
56
- dueDate?: string;
95
+ dueDate?: string | null;
96
+ dueDateFirmness?: "hard" | "medium" | "soft";
97
+ startDate?: string | null;
98
+ endDate?: string | null;
99
+ frequency?: "one_time" | "daily" | "weekly" | "monthly" | "weekdays" | "yearly";
100
+ estimatedDuration?: string;
101
+ estimatedMinutes?: number | null;
102
+ pod?: string;
103
+ taskType?: "task" | "reminder" | "time_off";
104
+ attachmentLinks?: ActionItemAttachmentLink[];
105
+ status?: "open" | "in_progress" | "blocked" | "done" | "cancelled";
106
+ assignedAt?: string;
107
+ priority?: "urgent" | "high" | "normal" | "low";
108
+ resolutionNotes?: string;
109
+ calendarSyncOptIn?: boolean;
57
110
  }
58
111
  export interface UpdateActionItemPayload {
59
112
  id: string;
113
+ expectedUpdatedAt: string;
60
114
  status?: "open" | "in_progress" | "blocked" | "done" | "cancelled";
61
115
  title?: string;
62
- dueDate?: string;
116
+ details?: string;
117
+ dueDate?: string | null;
118
+ dueDateFirmness?: "hard" | "medium" | "soft";
119
+ startDate?: string | null;
120
+ endDate?: string | null;
121
+ frequency?: "one_time" | "daily" | "weekly" | "monthly" | "weekdays" | "yearly";
122
+ estimatedDuration?: string;
123
+ estimatedMinutes?: number | null;
124
+ pod?: string | null;
125
+ taskType?: "task" | "reminder" | "time_off";
126
+ attachmentLinks?: ActionItemAttachmentLink[];
127
+ dueDateMoveReason?: string | null;
63
128
  ownerIdentityId?: string;
129
+ assignedAt?: string;
130
+ closedAt?: string | null;
131
+ resolutionNotes?: string | null;
132
+ priority?: "urgent" | "high" | "normal" | "low" | null;
133
+ calendarSyncOptIn?: boolean;
64
134
  }
65
135
  export interface CreateReminderPayload {
66
136
  remindAfter: string;
@@ -72,10 +142,24 @@ export interface CreateReminderPayload {
72
142
  export interface SummarizeThreadPayload {
73
143
  threadId: string;
74
144
  }
145
+ export interface CreateCommentPayload {
146
+ actionItemId: string;
147
+ body: string;
148
+ }
149
+ export interface UpdateCommentPayload {
150
+ actionItemId: string;
151
+ commentId: string;
152
+ body?: string;
153
+ isDeleted?: boolean;
154
+ }
75
155
  export interface PromoteNotePayload {
76
156
  noteId: string;
77
157
  dryRun?: boolean;
78
158
  }
159
+ export interface AuthorityTierPayload {
160
+ noteId: string;
161
+ comment?: string;
162
+ }
79
163
  export interface BrainHttpClientOptions {
80
164
  /** Injected for tests; defaults to the global `fetch`. */
81
165
  fetchImpl?: FetchLike;
@@ -89,11 +173,33 @@ export declare class BrainHttpClient {
89
173
  private call;
90
174
  search(payload: SearchPayload): Promise<unknown>;
91
175
  answer(payload: AnswerPayload): Promise<unknown>;
176
+ agent(payload: AgentPayload): Promise<unknown>;
92
177
  writeMemory(payload: WriteMemoryPayload): Promise<unknown>;
93
178
  listActionItems(payload: ListActionItemsPayload): Promise<unknown>;
94
179
  createActionItem(payload: CreateActionItemPayload): Promise<unknown>;
180
+ getActionItem(payload: {
181
+ id: string;
182
+ } | {
183
+ itemNumber: number;
184
+ }): Promise<unknown>;
185
+ listActionItemEvents(payload: {
186
+ id: string;
187
+ }): Promise<unknown>;
95
188
  updateActionItem(payload: UpdateActionItemPayload): Promise<unknown>;
189
+ listComments(payload: {
190
+ actionItemId: string;
191
+ }): Promise<unknown>;
192
+ createComment(payload: CreateCommentPayload): Promise<unknown>;
193
+ updateComment(payload: UpdateCommentPayload): Promise<unknown>;
194
+ getMe(): Promise<unknown>;
195
+ listWritableVisibility(): Promise<unknown>;
196
+ listProjects(): Promise<unknown>;
197
+ listPods(): Promise<unknown>;
198
+ listDirectory(): Promise<unknown>;
96
199
  createReminder(payload: CreateReminderPayload): Promise<unknown>;
97
200
  summarizeThread(payload: SummarizeThreadPayload): Promise<unknown>;
98
201
  promoteNote(payload: PromoteNotePayload): Promise<unknown>;
202
+ promoteToRule(payload: AuthorityTierPayload): Promise<unknown>;
203
+ setLaw(payload: AuthorityTierPayload): Promise<unknown>;
99
204
  }
205
+ //# sourceMappingURL=brain-http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-http-client.d.ts","sourceRoot":"","sources":["../src/brain-http-client.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { newCorrelationId } from "./config.js";
2
3
  /** Raised when the Brain API call fails (network or non-2xx response). */
3
4
  export class BrainApiError extends Error {
@@ -22,7 +23,7 @@ export class BrainHttpClient {
22
23
  this.fetchImpl = impl;
23
24
  }
24
25
  /** Issue an authenticated JSON request. The token resolves the identity. */
25
- async call(method, path, body) {
26
+ async call(method, path, body, extraHeaders) {
26
27
  const correlationId = newCorrelationId();
27
28
  const url = `${this.baseUrl}${path}`;
28
29
  let res;
@@ -33,6 +34,7 @@ export class BrainHttpClient {
33
34
  "content-type": "application/json",
34
35
  authorization: `Bearer ${this.token}`,
35
36
  "x-correlation-id": correlationId,
37
+ ...extraHeaders,
36
38
  },
37
39
  ...(body ? { body: JSON.stringify(body) } : {}),
38
40
  });
@@ -56,26 +58,78 @@ export class BrainHttpClient {
56
58
  }
57
59
  return (await res.json());
58
60
  }
59
- /* The 9 Brain tools → HTTP paths. requesterId is NEVER sent. */
61
+ /* Brain tools → HTTP paths. requesterId is NEVER sent. */
60
62
  search(payload) {
61
63
  return this.call("POST", "/v1/search", { ...payload });
62
64
  }
63
65
  answer(payload) {
64
66
  return this.call("POST", "/v1/answer", { ...payload });
65
67
  }
68
+ agent(payload) {
69
+ return this.call("POST", "/v1/agent", { ...payload });
70
+ }
66
71
  writeMemory(payload) {
67
72
  return this.call("POST", "/v1/notes", { ...payload });
68
73
  }
69
74
  listActionItems(payload) {
70
75
  return this.call("POST", "/v1/action-items/query", { ...payload });
71
76
  }
72
- createActionItem(payload) {
73
- return this.call("POST", "/v1/action-items", { ...payload });
77
+ async createActionItem(payload) {
78
+ const created = await this.call("POST", "/v1/action-items", { ...payload });
79
+ // The create response carries only id/visibilityPolicyId — follow up with a
80
+ // read so the caller gets the full item (including updatedAt, which
81
+ // update_action_item requires for optimistic concurrency). If the follow-up
82
+ // read fails, still return the create response.
83
+ try {
84
+ const detail = await this.call("GET", `/v1/action-items/${created.id}`);
85
+ return { ...detail.item, ...(detail.capabilities !== undefined ? { capabilities: detail.capabilities } : {}), correlationId: created.correlationId };
86
+ }
87
+ catch {
88
+ return created;
89
+ }
90
+ }
91
+ getActionItem(payload) {
92
+ // A durable number resolves through its own route, which applies the same
93
+ // visibility filter and 404s identically for an item the caller cannot see.
94
+ return "itemNumber" in payload
95
+ ? this.call("GET", `/v1/action-items/by-number/${payload.itemNumber}`)
96
+ : this.call("GET", `/v1/action-items/${payload.id}`);
97
+ }
98
+ listActionItemEvents(payload) {
99
+ return this.call("GET", `/v1/action-items/${payload.id}/events`);
74
100
  }
75
101
  updateActionItem(payload) {
76
102
  const { id, ...rest } = payload;
77
103
  return this.call("PATCH", `/v1/action-items/${id}`, { ...rest });
78
104
  }
105
+ listComments(payload) {
106
+ return this.call("GET", `/v1/action-items/${payload.actionItemId}/comments`);
107
+ }
108
+ createComment(payload) {
109
+ const { actionItemId, ...rest } = payload;
110
+ // The API requires an Idempotency-Key on comment creation; the connector
111
+ // generates one per call so agents don't have to manage it.
112
+ return this.call("POST", `/v1/action-items/${actionItemId}/comments`, { ...rest }, { "Idempotency-Key": randomUUID() });
113
+ }
114
+ updateComment(payload) {
115
+ const { actionItemId, commentId, ...rest } = payload;
116
+ return this.call("PATCH", `/v1/action-items/${actionItemId}/comments/${commentId}`, { ...rest });
117
+ }
118
+ getMe() {
119
+ return this.call("GET", "/v1/me");
120
+ }
121
+ listWritableVisibility() {
122
+ return this.call("GET", "/v1/visibility/writable");
123
+ }
124
+ listProjects() {
125
+ return this.call("GET", "/v1/projects");
126
+ }
127
+ listPods() {
128
+ return this.call("GET", "/v1/pods");
129
+ }
130
+ listDirectory() {
131
+ return this.call("GET", "/v1/directory");
132
+ }
79
133
  createReminder(payload) {
80
134
  return this.call("POST", "/v1/reminders", { ...payload });
81
135
  }
@@ -85,5 +139,13 @@ export class BrainHttpClient {
85
139
  promoteNote(payload) {
86
140
  return this.call("POST", "/v1/notes/promote", { ...payload });
87
141
  }
142
+ promoteToRule(payload) {
143
+ const { noteId, ...rest } = payload;
144
+ return this.call("POST", `/v1/notes/${noteId}/promote-to-rule`, { ...rest });
145
+ }
146
+ setLaw(payload) {
147
+ const { noteId, ...rest } = payload;
148
+ return this.call("POST", `/v1/notes/${noteId}/set-law`, { ...rest });
149
+ }
88
150
  }
89
151
  //# sourceMappingURL=brain-http-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-http-client.js","sourceRoot":"","sources":["../src/brain-http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,aAAa,CAAC;AA4BrE,0EAA0E;AAC1E,MAAM,OAAO,aAAc,SAAQ,KAAK;IAG3B;IAFX,YACE,OAAe,EACN,OAAiF;QAE1F,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,YAAO,GAAP,OAAO,CAA0E;QAG1F,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAgED,MAAM,OAAO,eAAe;IACT,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,SAAS,CAAY;IAEtC,YAAY,MAAuB,EAAE,UAAkC,EAAE;QACvE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAK,UAAU,CAAC,KAA0C,CAAC;QACzF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,4EAA4E;IACpE,KAAK,CAAC,IAAI,CAAI,MAAwB,EAAE,IAAY,EAAE,IAA8B;QAC1F,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,IAAI,GAAmC,CAAC;QACxC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;gBAC9B,MAAM;gBACN,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;oBACrC,kBAAkB,EAAE,aAAa;iBAClC;gBACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,MAAM,IAAI,aAAa,CAAC,sBAAsB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;gBACxF,IAAI;gBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAED,gEAAgE;IAEhE,MAAM,CAAC,OAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,OAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,WAAW,CAAC,OAA2B;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,OAA+B;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,gBAAgB,CAAC,OAAgC;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,gBAAgB,CAAC,OAAgC;QAC/C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,cAAc,CAAC,OAA8B;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,eAAe,CAAC,OAA+B;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,WAAW,CAAC,OAA2B;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;CACF"}
1
+ {"version":3,"file":"brain-http-client.js","sourceRoot":"","sources":["../src/brain-http-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/config.d.ts CHANGED
@@ -22,3 +22,4 @@ export declare class ConfigError extends Error {
22
22
  export declare function loadConfig(env?: NodeJS.ProcessEnv): ConnectorConfig;
23
23
  /** Correlation id stamped on every tool call for end-to-end audit tracing. */
24
24
  export declare function newCorrelationId(): string;
25
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,CA+BhF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- export { createBrainConnectorServer, BRAIN_TOOL_NAMES, type CreateServerOptions } from "./server.js";
1
+ export { createBrainConnectorServer, BRAIN_TOOL_NAMES, CONNECTOR_VERSION, type CreateServerOptions } from "./server.js";
2
+ export { camelizeActionItem, shapeActionItem, shapeActionItemDetail, shapeActionItemList, COMPACT_ACTION_ITEM_FIELDS } from "./action-item-shape.js";
2
3
  export { BrainHttpClient, BrainApiError, type FetchLike, type BrainHttpClientOptions } from "./brain-http-client.js";
3
4
  export { loadConfig, ConfigError, newCorrelationId, type ConnectorConfig } from "./config.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrJ,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- export { createBrainConnectorServer, BRAIN_TOOL_NAMES } from "./server.js";
1
+ export { createBrainConnectorServer, BRAIN_TOOL_NAMES, CONNECTOR_VERSION } from "./server.js";
2
+ export { camelizeActionItem, shapeActionItem, shapeActionItemDetail, shapeActionItemList, COMPACT_ACTION_ITEM_FIELDS } from "./action-item-shape.js";
2
3
  export { BrainHttpClient, BrainApiError } from "./brain-http-client.js";
3
4
  export { loadConfig, ConfigError, newCorrelationId } from "./config.js";
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAA4B,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,aAAa,EAA+C,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAwB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,iBAAiB,EAA4B,MAAM,aAAa,CAAC;AACxH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrJ,OAAO,EAAE,eAAe,EAAE,aAAa,EAA+C,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAwB,MAAM,aAAa,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,13 +1,29 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { BrainHttpClient } from "./brain-http-client.js";
3
+ /**
4
+ * The connector's own version, read from `package.json` rather than hardcoded.
5
+ * `src/` and `dist/` are both one directory below the package root, so the same
6
+ * relative path resolves whether this runs from source (vitest) or from the
7
+ * published build. A hardcoded literal is what made `initialize` advertise
8
+ * 0.1.0 from a 0.2.0 package, leaving clients unable to tell which build they
9
+ * were talking to.
10
+ */
11
+ export declare const CONNECTOR_VERSION: string;
3
12
  export interface CreateServerOptions {
4
13
  /** HTTP client to the Brain API. Tests inject one with a mock fetch. */
5
14
  client: BrainHttpClient;
15
+ /** Advertise the rule-tier governance tool. Defaults to BRAIN_RULE_TIER_ENABLED=on. */
16
+ enableRuleTier?: boolean;
17
+ /** Advertise the law-tier governance tool. Defaults to BRAIN_LAW_TIER_ENABLED=on. */
18
+ enableLawTier?: boolean;
6
19
  }
7
- /** The stable, ordered list of tool names this connector exposes. */
8
- export declare const BRAIN_TOOL_NAMES: readonly ["search_brain", "answer_from_brain", "write_brain_memory", "list_action_items", "create_action_item", "update_action_item", "create_reminder", "summarize_thread", "promote_to_curated_note"];
20
+ /** The stable, ordered list of tool names this connector exposes for the given feature flags. */
21
+ export declare function brainToolNames(options?: Pick<CreateServerOptions, "enableRuleTier" | "enableLawTier">): readonly string[];
22
+ /** The default, environment-gated tool list used by docs/tests that do not inject flags. */
23
+ export declare const BRAIN_TOOL_NAMES: readonly string[];
9
24
  /**
10
- * Build the public Brain MCP server with all nine tools registered. Connect the
25
+ * Build the public Brain MCP server with all registered tools. Connect the
11
26
  * returned server to a stdio (or any) transport.
12
27
  */
13
28
  export declare function createBrainConnectorServer(options: CreateServerOptions): McpServer;
29
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAazD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAU5B,CAAC;AAuBL,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,uFAAuF;IACvF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA6BD,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,eAAe,CAAM,GAAG,SAAS,MAAM,EAAE,CAK7H;AAED,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAkCjD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAiflF"}
package/dist/server.js CHANGED
@@ -1,6 +1,48 @@
1
+ import { readFileSync } from "node:fs";
1
2
  import { z } from "zod";
2
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
4
  import { BrainHttpClient } from "./brain-http-client.js";
5
+ import { shapeActionItem, shapeActionItemDetail, shapeActionItemList } from "./action-item-shape.js";
6
+ /* ---------------------------------------------------------------------------
7
+ * DER-274 — Public Brain MCP connector.
8
+ *
9
+ * A standalone, DB-free, dependency-self-contained stdio MCP server exposing
10
+ * the Brain tools. Each tool validates its input with zod and calls the
11
+ * Brain API over HTTPS via a `BrainHttpClient`. The per-user token IS the
12
+ * identity, so tools accept only their functional arguments — never a
13
+ * requesterId.
14
+ * ------------------------------------------------------------------------- */
15
+ /**
16
+ * The connector's own version, read from `package.json` rather than hardcoded.
17
+ * `src/` and `dist/` are both one directory below the package root, so the same
18
+ * relative path resolves whether this runs from source (vitest) or from the
19
+ * published build. A hardcoded literal is what made `initialize` advertise
20
+ * 0.1.0 from a 0.2.0 package, leaving clients unable to tell which build they
21
+ * were talking to.
22
+ */
23
+ export const CONNECTOR_VERSION = (() => {
24
+ try {
25
+ const raw = readFileSync(new URL("../package.json", import.meta.url), "utf8");
26
+ const parsed = JSON.parse(raw);
27
+ const version = parsed.version;
28
+ if (typeof version === "string" && version.length > 0)
29
+ return version;
30
+ }
31
+ catch {
32
+ /* fall through to the unknown marker below */
33
+ }
34
+ return "0.0.0-unknown";
35
+ })();
36
+ /**
37
+ * Every tool's declared JSON Schema says `additionalProperties: false`; passing
38
+ * a strict Zod object (rather than a bare shape, which the SDK turns into a
39
+ * stripping object) makes the runtime match the declaration. A caller who
40
+ * works around a schema gap by injecting an argument now gets an MCP error
41
+ * instead of silently correct-looking page-one data.
42
+ */
43
+ function strict(shape) {
44
+ return z.object(shape).strict();
45
+ }
4
46
  function ok(data) {
5
47
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
6
48
  }
@@ -8,37 +50,90 @@ function fail(e) {
8
50
  const message = e instanceof Error ? e.message : String(e);
9
51
  return { content: [{ type: "text", text: JSON.stringify({ error: message }) }], isError: true };
10
52
  }
11
- /** The stable, ordered list of tool names this connector exposes. */
12
- export const BRAIN_TOOL_NAMES = [
53
+ const BASE_BRAIN_TOOL_NAMES = [
13
54
  "search_brain",
14
55
  "answer_from_brain",
56
+ "ask_novi",
15
57
  "write_brain_memory",
16
58
  "list_action_items",
59
+ "get_action_item",
17
60
  "create_action_item",
18
61
  "update_action_item",
62
+ "list_task_events",
63
+ "list_task_comments",
64
+ "create_task_comment",
65
+ "update_task_comment",
19
66
  "create_reminder",
20
67
  "summarize_thread",
21
68
  "promote_to_curated_note",
69
+ "get_me",
70
+ "list_visibility_policies",
71
+ "list_projects",
72
+ "list_pods",
73
+ "list_directory",
22
74
  ];
75
+ function isFlagEnabled(name) {
76
+ return process.env[name] === "on";
77
+ }
78
+ /** The stable, ordered list of tool names this connector exposes for the given feature flags. */
79
+ export function brainToolNames(options = {}) {
80
+ const names = [...BASE_BRAIN_TOOL_NAMES];
81
+ if (options.enableRuleTier ?? isFlagEnabled("BRAIN_RULE_TIER_ENABLED"))
82
+ names.push("promote_to_rule");
83
+ if (options.enableLawTier ?? isFlagEnabled("BRAIN_LAW_TIER_ENABLED"))
84
+ names.push("set_law");
85
+ return names;
86
+ }
87
+ /** The default, environment-gated tool list used by docs/tests that do not inject flags. */
88
+ export const BRAIN_TOOL_NAMES = brainToolNames();
23
89
  const answerMode = z
24
90
  .enum(["private", "shared"])
25
91
  .optional()
26
92
  .describe("DM (private) vs group/channel (shared). Defaults server-side to private.");
93
+ const retrievalFilters = {
94
+ sourceTypes: z.array(z.string().min(1)).optional().describe("Optional source types to include, such as note, document, or message."),
95
+ functionSlug: z.string().min(1).optional().describe("Optional function slug filter for note memory."),
96
+ projectId: z.string().uuid().optional().describe("Optional project id filter for notes and documents."),
97
+ };
98
+ /* Action-item field schemas mirror the Brain API route contract (work.ts).
99
+ * Dates are date-only (YYYY-MM-DD); nullable means "clear the field" on update. */
100
+ const actionItemStatus = z.enum(["open", "in_progress", "blocked", "done", "cancelled"]);
101
+ const actionItemPriority = z.enum(["urgent", "high", "normal", "low"]);
102
+ const actionItemFrequency = z.enum(["one_time", "daily", "weekly", "monthly", "weekdays", "yearly"]);
103
+ const actionItemTaskType = z.enum(["task", "reminder", "time_off"]);
104
+ const actionItemFirmness = z.enum(["hard", "medium", "soft"]);
105
+ const dateOnly = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "date-only, YYYY-MM-DD");
106
+ const attachmentLinks = z
107
+ .array(z
108
+ .object({
109
+ url: z.string().url().startsWith("https://"),
110
+ label: z.string().trim().min(1).max(120).optional(),
111
+ })
112
+ .strict())
113
+ .max(10)
114
+ .optional()
115
+ .describe("Reference links (https only, max 10).");
27
116
  /**
28
- * Build the public Brain MCP server with all nine tools registered. Connect the
117
+ * Build the public Brain MCP server with all registered tools. Connect the
29
118
  * returned server to a stdio (or any) transport.
30
119
  */
31
120
  export function createBrainConnectorServer(options) {
32
121
  const { client } = options;
33
- const server = new McpServer({ name: "novaeo-brain-connector", version: "0.1.0" });
122
+ const server = new McpServer({ name: "novaeo-brain-connector", version: CONNECTOR_VERSION });
123
+ const registerRuleTool = options.enableRuleTier ?? isFlagEnabled("BRAIN_RULE_TIER_ENABLED");
124
+ const registerLawTool = options.enableLawTier ?? isFlagEnabled("BRAIN_LAW_TIER_ENABLED");
34
125
  // 1. search_brain → POST /v1/search
35
126
  server.registerTool("search_brain", {
36
- description: "Search company memory for relevant snippets (permission-filtered to your access). Returns ranked results with citations.",
37
- inputSchema: {
127
+ description: "Search company memory for relevant snippets (permission-filtered to your access). Returns ranked results with citations. Optionally scope to a time window on the source event time (when the chat/meeting/Loom happened).",
128
+ inputSchema: strict({
38
129
  query: z.string().min(1).describe("What to search for."),
39
130
  limit: z.number().int().positive().max(50).optional(),
131
+ since: z.string().optional().describe("ISO date/time: only content at or after this source event time."),
132
+ until: z.string().optional().describe("ISO date/time: only content at or before this source event time."),
133
+ sinceDays: z.number().optional().describe("Relative window: only content from the last N days by source event time."),
134
+ ...retrievalFilters,
40
135
  answerMode,
41
- },
136
+ }),
42
137
  }, async (args) => {
43
138
  try {
44
139
  return ok(await client.search(args));
@@ -49,12 +144,16 @@ export function createBrainConnectorServer(options) {
49
144
  });
50
145
  // 2. answer_from_brain → POST /v1/answer
51
146
  server.registerTool("answer_from_brain", {
52
- description: "Answer a question grounded in company memory, permission-filtered to your access, with source citations.",
53
- inputSchema: {
147
+ description: "Answer a question grounded in company memory, permission-filtered to your access, with source citations. Optionally scope to a time window on the source event time.",
148
+ inputSchema: strict({
54
149
  query: z.string().min(1).describe("The question to answer."),
55
150
  limit: z.number().int().positive().max(50).optional(),
151
+ since: z.string().optional().describe("ISO date/time: only content at or after this source event time."),
152
+ until: z.string().optional().describe("ISO date/time: only content at or before this source event time."),
153
+ sinceDays: z.number().optional().describe("Relative window: only content from the last N days by source event time."),
154
+ ...retrievalFilters,
56
155
  answerMode,
57
- },
156
+ }),
58
157
  }, async (args) => {
59
158
  try {
60
159
  return ok(await client.answer(args));
@@ -63,15 +162,35 @@ export function createBrainConnectorServer(options) {
63
162
  return fail(e);
64
163
  }
65
164
  });
165
+ // 2b. ask_novi → POST /v1/agent — the full agent loop (plan → tools →
166
+ // synthesize) with YOUR permissions. Beyond a single search/answer, it can
167
+ // search the brain, summarize threads, manage your action items, read live
168
+ // SC15 operational data, search Drive (DM/private context), and delegate to
169
+ // Hermes — gated to what your token may read/write. MCP parity with Novi.
170
+ server.registerTool("ask_novi", {
171
+ description: "Ask Novi using the full agent loop with your permissions — it plans, calls the right tools (brain search, thread summary, action-item management, live SC15 ops reads, Drive search, delegate-to-Hermes), and returns a cited answer plus the tools it used. Use for anything beyond a one-shot search/answer.",
172
+ inputSchema: strict({
173
+ query: z.string().min(1).describe("Your request in plain language."),
174
+ answerMode,
175
+ threadId: z.string().optional().describe("Conversation id for follow-up context (optional)."),
176
+ }),
177
+ }, async (args) => {
178
+ try {
179
+ return ok(await client.agent(args));
180
+ }
181
+ catch (e) {
182
+ return fail(e);
183
+ }
184
+ });
66
185
  // 3. write_brain_memory → POST /v1/notes
67
186
  server.registerTool("write_brain_memory", {
68
187
  description: "Write a memory (draft note) into the brain under a given visibility policy.",
69
- inputSchema: {
188
+ inputSchema: strict({
70
189
  title: z.string().min(1),
71
190
  body: z.string().min(1),
72
191
  visibilityPolicyId: z.string().uuid().describe("Visibility policy the note inherits."),
73
192
  noteType: z.enum(["decision", "sop", "summary", "fact"]).optional(),
74
- },
193
+ }),
75
194
  }, async (args) => {
76
195
  try {
77
196
  return ok(await client.writeMemory(args));
@@ -82,15 +201,49 @@ export function createBrainConnectorServer(options) {
82
201
  });
83
202
  // 4. list_action_items → POST /v1/action-items/query
84
203
  server.registerTool("list_action_items", {
85
- description: "List action items (permission-filtered). Defaults to your own items; an owner filter for another user requires admin.",
86
- inputSchema: {
204
+ description: "List action items (permission-filtered). Defaults to your own open items; an owner filter for another user requires admin. " +
205
+ "This returns ONE PAGE, capped at `limit` (max 100): if `nextCursor` comes back non-null there are more items — pass it as `cursor` for the next page. " +
206
+ "Never count the returned rows to answer 'how many' — pass `includeStats: true` and read `stats`, which is a server-side count over every matching item. " +
207
+ "Rows are a compact projection by default; pass `verbose: true` for the full field set.",
208
+ inputSchema: strict({
87
209
  ownerIdentityId: z.string().uuid().optional(),
88
- status: z.enum(["open", "in_progress", "blocked", "done", "cancelled"]).optional(),
89
- limit: z.number().int().positive().max(100).optional(),
90
- },
210
+ status: actionItemStatus.optional(),
211
+ includeClosed: z.boolean().optional().describe("Include done/cancelled items."),
212
+ priority: z.array(z.enum(["urgent", "high", "normal", "low", "none"])).optional(),
213
+ projectId: z.string().uuid().optional(),
214
+ pod: z.string().min(1).optional(),
215
+ q: z.string().optional().describe("Free-text filter over title/details."),
216
+ dueFrom: dateOnly.optional().describe("Only items due on/after this date (YYYY-MM-DD)."),
217
+ dueTo: dateOnly.optional().describe("Only items due on/before this date (YYYY-MM-DD)."),
218
+ lastActivityFrom: z.string().min(1).optional().describe("ISO date/time: only items whose last activity is at or after this. Items with no recorded activity are excluded by any window."),
219
+ lastActivityTo: z.string().min(1).optional().describe("ISO date/time: only items whose last activity is at or before this. Items with no recorded activity are excluded by any window."),
220
+ sort: z.enum(["due_date", "priority", "last_activity_at", "created_at"]).optional().describe("Sort key. Defaults to last_activity_at."),
221
+ dir: z.enum(["asc", "desc"]).optional().describe("Sort direction. Defaults to desc."),
222
+ cursor: z.string().min(1).optional().describe("The `nextCursor` from the previous page. Must be paired with the same filters and sort."),
223
+ includeStats: z.boolean().optional().describe("Return `stats`: server-side totals over every matching item, not just this page."),
224
+ verbose: z.boolean().optional().describe("Return every field on each item instead of the compact projection."),
225
+ limit: z.number().int().positive().max(100).optional().describe("Rows per page (max 100). Caps the page, never `stats`."),
226
+ }),
227
+ }, async (args) => {
228
+ try {
229
+ // `verbose` shapes the response here and is not an API filter.
230
+ const { verbose, ...payload } = args;
231
+ return ok(shapeActionItemList(await client.listActionItems(payload), { verbose: verbose === true }));
232
+ }
233
+ catch (e) {
234
+ return fail(e);
235
+ }
236
+ });
237
+ // 4b. get_action_item → GET /v1/action-items/:id or /by-number/:number
238
+ server.registerTool("get_action_item", {
239
+ description: "Get a single action item by id or by its durable number (the '#1247' shown in chat posts), including its updatedAt value (needed for updates) and your capabilities on it. Pass exactly one of id or itemNumber. Resolve a number here first when you only have the number, then call update_action_item with the returned id.",
240
+ inputSchema: strict({ id: z.string().uuid().optional(), itemNumber: z.number().int().positive().optional() }),
91
241
  }, async (args) => {
92
242
  try {
93
- return ok(await client.listActionItems(args));
243
+ if ((args.id === undefined) === (args.itemNumber === undefined)) {
244
+ return fail(new Error("Pass exactly one of id or itemNumber."));
245
+ }
246
+ return ok(shapeActionItemDetail(await client.getActionItem(args.id !== undefined ? { id: args.id } : { itemNumber: args.itemNumber })));
94
247
  }
95
248
  catch (e) {
96
249
  return fail(e);
@@ -98,19 +251,33 @@ export function createBrainConnectorServer(options) {
98
251
  });
99
252
  // 5. create_action_item → POST /v1/action-items
100
253
  server.registerTool("create_action_item", {
101
- description: "Create an action item with an owner, optional project, source message, and due date.",
102
- inputSchema: {
254
+ description: "Create an action item. Returns the full created item including updatedAt (use it as expectedUpdatedAt for updates).",
255
+ inputSchema: strict({
103
256
  title: z.string().min(1),
104
257
  details: z.string().optional(),
105
- ownerIdentityId: z.string().uuid().optional(),
106
- projectId: z.string().uuid().optional(),
258
+ ownerIdentityId: z.string().uuid().optional().describe("Defaults to you."),
259
+ projectId: z.string().uuid().optional().describe("From list_projects."),
107
260
  sourceMessageId: z.string().uuid().optional().describe("Message the item derives visibility from."),
108
- visibilityPolicyId: z.string().uuid().optional().describe("Explicit visibility policy if no source message."),
109
- dueDate: z.string().optional(),
110
- },
261
+ visibilityPolicyId: z.string().uuid().optional().describe("Explicit visibility if no source message; from list_visibility_policies."),
262
+ dueDate: dateOnly.nullable().optional().describe("Date-only (YYYY-MM-DD); no times."),
263
+ dueDateFirmness: actionItemFirmness.optional(),
264
+ startDate: dateOnly.nullable().optional(),
265
+ endDate: dateOnly.nullable().optional(),
266
+ frequency: actionItemFrequency.optional().describe("Defaults to one_time."),
267
+ estimatedDuration: z.string().optional().describe("Free-form estimate, e.g. '2h'."),
268
+ estimatedMinutes: z.number().int().positive().nullable().optional(),
269
+ pod: z.string().min(1).optional().describe("From list_pods."),
270
+ taskType: actionItemTaskType.optional(),
271
+ attachmentLinks,
272
+ status: actionItemStatus.optional(),
273
+ assignedAt: z.string().optional(),
274
+ priority: actionItemPriority.optional().describe("Omit for no priority."),
275
+ resolutionNotes: z.string().optional(),
276
+ calendarSyncOptIn: z.boolean().optional(),
277
+ }),
111
278
  }, async (args) => {
112
279
  try {
113
- return ok(await client.createActionItem(args));
280
+ return ok(shapeActionItem(await client.createActionItem(args)));
114
281
  }
115
282
  catch (e) {
116
283
  return fail(e);
@@ -118,14 +285,31 @@ export function createBrainConnectorServer(options) {
118
285
  });
119
286
  // 6. update_action_item → PATCH /v1/action-items/:id
120
287
  server.registerTool("update_action_item", {
121
- description: "Update an action item's status or fields. Only the owner or an admin may modify it.",
122
- inputSchema: {
288
+ description: "Update an action item's status or fields using the item updatedAt value for optimistic concurrency. On a 409 conflict, re-read the item and retry with the fresh updatedAt.",
289
+ inputSchema: strict({
123
290
  id: z.string().uuid(),
124
- status: z.enum(["open", "in_progress", "blocked", "done", "cancelled"]).optional(),
291
+ expectedUpdatedAt: z.string().describe("The current item updatedAt value returned by list_action_items, get_action_item, or create_action_item."),
292
+ status: actionItemStatus.optional(),
125
293
  title: z.string().min(1).optional(),
126
- dueDate: z.string().optional(),
127
- ownerIdentityId: z.string().uuid().optional(),
128
- },
294
+ details: z.string().optional(),
295
+ dueDate: dateOnly.nullable().optional().describe("Date-only (YYYY-MM-DD); null clears."),
296
+ dueDateFirmness: actionItemFirmness.optional(),
297
+ startDate: dateOnly.nullable().optional(),
298
+ endDate: dateOnly.nullable().optional(),
299
+ frequency: actionItemFrequency.optional(),
300
+ estimatedDuration: z.string().optional(),
301
+ estimatedMinutes: z.number().int().positive().nullable().optional(),
302
+ pod: z.string().min(1).nullable().optional(),
303
+ taskType: actionItemTaskType.optional(),
304
+ attachmentLinks,
305
+ dueDateMoveReason: z.string().nullable().optional().describe("Why the due date moved."),
306
+ ownerIdentityId: z.string().uuid().optional().describe("Reassign; from list_directory."),
307
+ assignedAt: z.string().optional(),
308
+ closedAt: z.string().nullable().optional(),
309
+ resolutionNotes: z.string().nullable().optional(),
310
+ priority: actionItemPriority.nullable().optional().describe("Null clears the priority."),
311
+ calendarSyncOptIn: z.boolean().optional(),
312
+ }),
129
313
  }, async (args) => {
130
314
  try {
131
315
  return ok(await client.updateActionItem(args));
@@ -134,16 +318,72 @@ export function createBrainConnectorServer(options) {
134
318
  return fail(e);
135
319
  }
136
320
  });
321
+ // 6b. list_task_events → GET /v1/action-items/:id/events
322
+ server.registerTool("list_task_events", {
323
+ description: "List the activity/event history of an action item (status changes, edits, comments).",
324
+ inputSchema: strict({ id: z.string().uuid() }),
325
+ }, async (args) => {
326
+ try {
327
+ return ok(await client.listActionItemEvents(args));
328
+ }
329
+ catch (e) {
330
+ return fail(e);
331
+ }
332
+ });
333
+ // 6c. list_task_comments → GET /v1/action-items/:id/comments
334
+ server.registerTool("list_task_comments", {
335
+ description: "List comments on an action item.",
336
+ inputSchema: strict({ actionItemId: z.string().uuid() }),
337
+ }, async (args) => {
338
+ try {
339
+ return ok(await client.listComments(args));
340
+ }
341
+ catch (e) {
342
+ return fail(e);
343
+ }
344
+ });
345
+ // 6d. create_task_comment → POST /v1/action-items/:id/comments
346
+ server.registerTool("create_task_comment", {
347
+ description: "Add a comment to an action item. Use for progress notes, findings, or hand-off context.",
348
+ inputSchema: strict({
349
+ actionItemId: z.string().uuid(),
350
+ body: z.string().min(1),
351
+ }),
352
+ }, async (args) => {
353
+ try {
354
+ return ok(await client.createComment(args));
355
+ }
356
+ catch (e) {
357
+ return fail(e);
358
+ }
359
+ });
360
+ // 6e. update_task_comment → PATCH /v1/action-items/:id/comments/:commentId
361
+ server.registerTool("update_task_comment", {
362
+ description: "Edit or delete one of your comments on an action item.",
363
+ inputSchema: strict({
364
+ actionItemId: z.string().uuid(),
365
+ commentId: z.string().uuid(),
366
+ body: z.string().min(1).optional().describe("New comment text (edit)."),
367
+ isDeleted: z.boolean().optional().describe("Set true to delete the comment."),
368
+ }),
369
+ }, async (args) => {
370
+ try {
371
+ return ok(await client.updateComment(args));
372
+ }
373
+ catch (e) {
374
+ return fail(e);
375
+ }
376
+ });
137
377
  // 7. create_reminder → POST /v1/reminders
138
378
  server.registerTool("create_reminder", {
139
379
  description: "Create a reminder that fires after a given time, inheriting the trigger message's visibility.",
140
- inputSchema: {
380
+ inputSchema: strict({
141
381
  remindAfter: z.string().describe("ISO timestamp to remind after."),
142
382
  triggerMessageId: z.string().uuid().describe("Message the reminder derives visibility from."),
143
383
  spaceId: z.string().uuid().optional(),
144
384
  threadId: z.string().optional(),
145
385
  mentionedIdentityId: z.string().uuid().optional(),
146
- },
386
+ }),
147
387
  }, async (args) => {
148
388
  try {
149
389
  return ok(await client.createReminder(args));
@@ -155,9 +395,9 @@ export function createBrainConnectorServer(options) {
155
395
  // 8. summarize_thread → POST /v1/summarize-thread
156
396
  server.registerTool("summarize_thread", {
157
397
  description: "Summarize a chat thread (permission-filtered) into a short, cited summary.",
158
- inputSchema: {
398
+ inputSchema: strict({
159
399
  threadId: z.string().min(1),
160
- },
400
+ }),
161
401
  }, async (args) => {
162
402
  try {
163
403
  return ok(await client.summarizeThread(args));
@@ -169,10 +409,10 @@ export function createBrainConnectorServer(options) {
169
409
  // 9. promote_to_curated_note → POST /v1/notes/promote
170
410
  server.registerTool("promote_to_curated_note", {
171
411
  description: "Promote a reviewed brain note into the curated novaeo-brain vault. Defaults to a dry run; sensitive promotions require admin.",
172
- inputSchema: {
412
+ inputSchema: strict({
173
413
  noteId: z.string().uuid(),
174
414
  dryRun: z.boolean().optional().describe("Preview without writing. Defaults to true server-side."),
175
- },
415
+ }),
176
416
  }, async (args) => {
177
417
  try {
178
418
  return ok(await client.promoteNote(args));
@@ -181,6 +421,98 @@ export function createBrainConnectorServer(options) {
181
421
  return fail(e);
182
422
  }
183
423
  });
424
+ // 10. get_me → GET /v1/me
425
+ server.registerTool("get_me", {
426
+ description: "Your identity, capabilities, and admin/review flags. Call first to learn who the token acts as.",
427
+ inputSchema: strict({}),
428
+ }, async () => {
429
+ try {
430
+ return ok(await client.getMe());
431
+ }
432
+ catch (e) {
433
+ return fail(e);
434
+ }
435
+ });
436
+ // 11. list_visibility_policies → GET /v1/visibility/writable
437
+ server.registerTool("list_visibility_policies", {
438
+ description: "Visibility policies you may write to. Use a policy id from here for write_brain_memory or create_action_item.",
439
+ inputSchema: strict({}),
440
+ }, async () => {
441
+ try {
442
+ return ok(await client.listWritableVisibility());
443
+ }
444
+ catch (e) {
445
+ return fail(e);
446
+ }
447
+ });
448
+ // 12. list_projects → GET /v1/projects
449
+ server.registerTool("list_projects", {
450
+ description: "List projects (for projectId filters and task assignment).",
451
+ inputSchema: strict({}),
452
+ }, async () => {
453
+ try {
454
+ return ok(await client.listProjects());
455
+ }
456
+ catch (e) {
457
+ return fail(e);
458
+ }
459
+ });
460
+ // 13. list_pods → GET /v1/pods
461
+ server.registerTool("list_pods", {
462
+ description: "List active pods (for pod filters and task assignment).",
463
+ inputSchema: strict({}),
464
+ }, async () => {
465
+ try {
466
+ return ok(await client.listPods());
467
+ }
468
+ catch (e) {
469
+ return fail(e);
470
+ }
471
+ });
472
+ // 14. list_directory → GET /v1/directory
473
+ server.registerTool("list_directory", {
474
+ description: "List people in the workspace directory (identity ids for owners, assignees, mentions).",
475
+ inputSchema: strict({}),
476
+ }, async () => {
477
+ try {
478
+ return ok(await client.listDirectory());
479
+ }
480
+ catch (e) {
481
+ return fail(e);
482
+ }
483
+ });
484
+ if (registerRuleTool) {
485
+ server.registerTool("promote_to_rule", {
486
+ description: "Promote a reviewed/accepted durable memory note to rule tier. The Brain API enforces feature flags and reviewer/lead permissions.",
487
+ inputSchema: strict({
488
+ noteId: z.string().uuid(),
489
+ comment: z.string().optional(),
490
+ }),
491
+ }, async (args) => {
492
+ try {
493
+ return ok(await client.promoteToRule(args));
494
+ }
495
+ catch (e) {
496
+ return fail(e);
497
+ }
498
+ });
499
+ }
500
+ if (registerLawTool) {
501
+ server.registerTool("set_law", {
502
+ description: "Set a reviewed/accepted durable memory note to law tier. The Brain API enforces feature flags and Brain admin authorization.",
503
+ inputSchema: strict({
504
+ noteId: z.string().uuid(),
505
+ comment: z.string().optional(),
506
+ }),
507
+ }, async (args) => {
508
+ try {
509
+ return ok(await client.setLaw(args));
510
+ }
511
+ catch (e) {
512
+ return fail(e);
513
+ }
514
+ });
515
+ }
184
516
  return server;
185
517
  }
186
518
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAErG;;;;;;;;+EAQ+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAW,CAAC,GAAW,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAI,MAAgC,CAAC,OAAO,CAAC;QAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC,EAAE,CAAC;AAEL;;;;;;GAMG;AACH,SAAS,MAAM,CAA0B,KAAQ;IAC/C,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AAClC,CAAC;AAID,SAAS,EAAE,CAAC,IAAa;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC;AACD,SAAS,IAAI,CAAC,CAAU;IACtB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClG,CAAC;AAWD,MAAM,qBAAqB,GAAG;IAC5B,cAAc;IACd,mBAAmB;IACnB,UAAU;IACV,oBAAoB;IACpB,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;IACrB,qBAAqB;IACrB,iBAAiB;IACjB,kBAAkB;IAClB,yBAAyB;IACzB,QAAQ;IACR,0BAA0B;IAC1B,eAAe;IACf,WAAW;IACX,gBAAgB;CACR,CAAC;AAEX,SAAS,aAAa,CAAC,IAA0D;IAC/E,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACpC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,cAAc,CAAC,UAAyE,EAAE;IACxG,MAAM,KAAK,GAAa,CAAC,GAAG,qBAAqB,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,cAAc,IAAI,aAAa,CAAC,yBAAyB,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtG,IAAI,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,wBAAwB,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,EAAE,CAAC;AAEjD,MAAM,UAAU,GAAG,CAAC;KACjB,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;KAC3B,QAAQ,EAAE;KACV,QAAQ,CAAC,0EAA0E,CAAC,CAAC;AAExF,MAAM,gBAAgB,GAAG;IACvB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;IACpI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACrG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;CACxG,CAAC;AAEF;mFACmF;AACnF,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACzF,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACvE,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACrG,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACpE,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AAClF,MAAM,eAAe,GAAG,CAAC;KACtB,KAAK,CACJ,CAAC;KACE,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC;KACD,MAAM,EAAE,CACZ;KACA,GAAG,CAAC,EAAE,CAAC;KACP,QAAQ,EAAE;KACV,QAAQ,CAAC,uCAAuC,CAAC,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAA4B;IACrE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,IAAI,aAAa,CAAC,yBAAyB,CAAC,CAAC;IAC5F,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAEzF,oCAAoC;IACpC,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,4NAA4N;QAC9N,WAAW,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;YACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;YACxG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;YACzG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;YACrH,GAAG,gBAAgB;YACnB,UAAU;SACX,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EACT,sKAAsK;QACxK,WAAW,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;YACrD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;YACxG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;YACzG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;YACrH,GAAG,gBAAgB;YACnB,UAAU;SACX,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sEAAsE;IACtE,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EACT,gTAAgT;QAClT,WAAW,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpE,UAAU;YACV,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;SAC9F,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,6EAA6E;QAC1F,WAAW,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACtF,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;SACpE,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qDAAqD;IACrD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EACT,6HAA6H;YAC7H,wJAAwJ;YACxJ,0JAA0J;YAC1J,wFAAwF;QAC1F,WAAW,EAAE,MAAM,CAAC;YAClB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;YAC7C,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE;YACnC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC/E,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;YACvC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACjC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACzE,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YACxF,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;YACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gIAAgI,CAAC;YACzL,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iIAAiI,CAAC;YACxL,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACvI,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACrF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yFAAyF,CAAC;YACxI,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;YACjI,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;YAC9G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;SAC1H,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;YACrC,OAAO,EAAE,CAAC,mBAAmB,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,gUAAgU;QAClU,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC9G,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;gBAChE,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,EAAE,CAAC,qBAAqB,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3I,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gDAAgD;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,qHAAqH;QACvH,WAAW,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAC1E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACvE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACnG,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;YACrI,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACrF,eAAe,EAAE,kBAAkB,CAAC,QAAQ,EAAE;YAC9C,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACzC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACvC,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC3E,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACnF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACnE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC7D,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE;YACvC,eAAe;YACf,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE;YACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACjC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACzE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACtC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC1C,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,eAAe,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qDAAqD;IACrD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,6KAA6K;QAC/K,WAAW,EAAE,MAAM,CAAC;YAClB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;YACrB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yGAAyG,CAAC;YACjJ,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE;YACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACxF,eAAe,EAAE,kBAAkB,CAAC,QAAQ,EAAE;YAC9C,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACzC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACvC,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE;YACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACxC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACnE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAC5C,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE;YACvC,eAAe;YACf,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACvF,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACxF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAC1C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACjD,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YACxF,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC1C,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,yDAAyD;IACzD,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,sFAAsF;QACnG,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;KAC/C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,kCAAkC;QAC/C,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;KACzD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,+DAA+D;IAC/D,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EAAE,yFAAyF;QACtG,WAAW,EAAE,MAAM,CAAC;YAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACxB,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,2EAA2E;IAC3E,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,MAAM,CAAC;YAClB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;YAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;YAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACvE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SAC9E,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0CAA0C;IAC1C,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,+FAA+F;QAC5G,WAAW,EAAE,MAAM,CAAC;YAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAClE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;YACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;SAClD,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kDAAkD;IAClD,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC5B,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sDAAsD;IACtD,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EACT,+HAA+H;QACjI,WAAW,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;YACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;SAClG,CAAC;KACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;KACxB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,WAAW,EACT,+GAA+G;QACjH,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;KACxB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE,4DAA4D;QACzE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;KACxB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,+BAA+B;IAC/B,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,WAAW,EAAE,yDAAyD;QACtE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;KACxB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EAAE,wFAAwF;QACrG,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;KACxB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;YACE,WAAW,EACT,mIAAmI;YACrI,WAAW,EAAE,MAAM,CAAC;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;YACE,WAAW,EACT,8HAA8H;YAChI,WAAW,EAAE,MAAM,CAAC;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,CAAC;gBACH,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novaeo/brain-connector",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Standalone stdio MCP connector for the Novaeo Brain. Exposes search, answer, memory, action-item, reminder, summarize, and promote tools over HTTPS using a per-user token.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -20,9 +20,7 @@
20
20
  }
21
21
  },
22
22
  "scripts": {
23
- "build": "tsc",
24
- "prepublishOnly": "tsc",
25
- "test": "vitest run",
23
+ "build": "tsc -b",
26
24
  "start": "node ./dist/cli.js"
27
25
  },
28
26
  "keywords": [
@@ -38,10 +36,5 @@
38
36
  "dependencies": {
39
37
  "@modelcontextprotocol/sdk": "^1.29.0",
40
38
  "zod": "^3.24.1"
41
- },
42
- "devDependencies": {
43
- "@types/node": "^22.10.0",
44
- "typescript": "^5.7.2",
45
- "vitest": "^2.1.8"
46
39
  }
47
40
  }
package/LICENSE DELETED
@@ -1,15 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Novaeo
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.