@skilldrunk/brain-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/activity.d.ts +19 -0
  2. package/dist/activity.d.ts.map +1 -0
  3. package/dist/activity.js +25 -0
  4. package/dist/activity.js.map +1 -0
  5. package/dist/archive.d.ts +8 -0
  6. package/dist/archive.d.ts.map +1 -0
  7. package/dist/archive.js +13 -0
  8. package/dist/archive.js.map +1 -0
  9. package/dist/ask-brain.d.ts +22 -0
  10. package/dist/ask-brain.d.ts.map +1 -0
  11. package/dist/ask-brain.js +30 -0
  12. package/dist/ask-brain.js.map +1 -0
  13. package/dist/catalog.d.ts +15 -0
  14. package/dist/catalog.d.ts.map +1 -0
  15. package/dist/catalog.js +17 -0
  16. package/dist/catalog.js.map +1 -0
  17. package/dist/dashboard.d.ts +8 -0
  18. package/dist/dashboard.d.ts.map +1 -0
  19. package/dist/dashboard.js +13 -0
  20. package/dist/dashboard.js.map +1 -0
  21. package/dist/index.d.ts +9 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +11 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inventory.d.ts +8 -0
  26. package/dist/inventory.d.ts.map +1 -0
  27. package/dist/inventory.js +11 -0
  28. package/dist/inventory.js.map +1 -0
  29. package/dist/search.d.ts +12 -0
  30. package/dist/search.d.ts.map +1 -0
  31. package/dist/search.js +15 -0
  32. package/dist/search.js.map +1 -0
  33. package/dist/server.d.ts +2 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +4 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/supabase-shim.d.ts +2 -0
  38. package/dist/supabase-shim.d.ts.map +1 -0
  39. package/dist/supabase-shim.js +2 -0
  40. package/dist/supabase-shim.js.map +1 -0
  41. package/dist/types.d.ts +96 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +5 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +35 -0
@@ -0,0 +1,19 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { BrainActivity, BrainSource, Realm } from "./types";
3
+ export interface LogActivityInput {
4
+ realm: Realm;
5
+ source: BrainSource;
6
+ event_type: string;
7
+ title: string;
8
+ body?: string | null;
9
+ url?: string | null;
10
+ item_id?: string | null;
11
+ occurred_at?: string;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ /**
15
+ * Append a single row to brain_activity.
16
+ * Called by ingestion scripts (vercel webhook handler, github watcher, jax ledger).
17
+ */
18
+ export declare function logActivity(supabase: SupabaseClient, input: LogActivityInput): Promise<BrainActivity>;
19
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,aAAa,CAAC,CAkBxB"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Append a single row to brain_activity.
3
+ * Called by ingestion scripts (vercel webhook handler, github watcher, jax ledger).
4
+ */
5
+ export async function logActivity(supabase, input) {
6
+ const { data, error } = await supabase
7
+ .from("brain_activity")
8
+ .insert({
9
+ realm: input.realm,
10
+ source: input.source,
11
+ event_type: input.event_type,
12
+ item_id: input.item_id ?? null,
13
+ title: input.title,
14
+ body: input.body ?? null,
15
+ url: input.url ?? null,
16
+ occurred_at: input.occurred_at ?? new Date().toISOString(),
17
+ metadata: input.metadata ?? {},
18
+ })
19
+ .select()
20
+ .single();
21
+ if (error)
22
+ throw error;
23
+ return data;
24
+ }
25
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAwB,EACxB,KAAuB;IAEvB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ;SACnC,IAAI,CAAC,gBAAgB,CAAC;SACtB,MAAM,CAAC;QACN,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1D,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;KAC/B,CAAC;SACD,MAAM,EAAE;SACR,MAAM,EAAE,CAAC;IACZ,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,IAAqB,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { BrainItem } from "./types";
3
+ /**
4
+ * Soft-delete a brain item — sets status='archived'.
5
+ * Goes through SECURITY DEFINER RPC because the table has no DELETE RLS policy.
6
+ */
7
+ export declare function archiveItem(supabase: SupabaseClient, id: string): Promise<BrainItem>;
8
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC,CAMpB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Soft-delete a brain item — sets status='archived'.
3
+ * Goes through SECURITY DEFINER RPC because the table has no DELETE RLS policy.
4
+ */
5
+ export async function archiveItem(supabase, id) {
6
+ const { data, error } = await supabase.rpc("brain_item_archive", {
7
+ p_id: id,
8
+ });
9
+ if (error)
10
+ throw error;
11
+ return data;
12
+ }
13
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAwB,EACxB,EAAU;IAEV,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,oBAAoB,EAAE;QAC/D,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,IAAiB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { BrainItem, Realm } from "./types";
3
+ export interface AskBrainOpts {
4
+ realm?: Realm | "auto";
5
+ domain?: "skilldrunk" | "skimsoulfat";
6
+ limit?: number;
7
+ }
8
+ export interface AskBrainResult {
9
+ answer: string;
10
+ sources: BrainItem[];
11
+ realm_resolved: Realm;
12
+ }
13
+ /**
14
+ * Stub for Faz 1 — Faz 4 will wire this to /api/brain/ask which uses
15
+ * embedding-based vector search + Claude Haiku synthesis.
16
+ *
17
+ * For now this falls back to FTS search via brain_search so dependent
18
+ * UI can render against a known shape (`searchBrain` results wrapped in
19
+ * an empty `answer`).
20
+ */
21
+ export declare function askBrain(supabase: SupabaseClient, query: string, opts?: AskBrainOpts): Promise<AskBrainResult>;
22
+ //# sourceMappingURL=ask-brain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-brain.d.ts","sourceRoot":"","sources":["../src/ask-brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,cAAc,CAAC,CAuBzB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Stub for Faz 1 — Faz 4 will wire this to /api/brain/ask which uses
3
+ * embedding-based vector search + Claude Haiku synthesis.
4
+ *
5
+ * For now this falls back to FTS search via brain_search so dependent
6
+ * UI can render against a known shape (`searchBrain` results wrapped in
7
+ * an empty `answer`).
8
+ */
9
+ export async function askBrain(supabase, query, opts = {}) {
10
+ const realm = opts.realm && opts.realm !== "auto"
11
+ ? opts.realm
12
+ : opts.domain === "skilldrunk"
13
+ ? "work"
14
+ : opts.domain === "skimsoulfat"
15
+ ? "personal"
16
+ : "shared";
17
+ const { data, error } = await supabase.rpc("brain_search", {
18
+ p_query: query,
19
+ p_realm: realm === "shared" ? null : realm,
20
+ p_limit: opts.limit ?? 8,
21
+ });
22
+ if (error)
23
+ throw error;
24
+ return {
25
+ answer: "[Faz 4 placeholder] AI sentezi henüz aktif değil — şu an FTS sonuçları döner.",
26
+ sources: (data ?? []),
27
+ realm_resolved: realm,
28
+ };
29
+ }
30
+ //# sourceMappingURL=ask-brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-brain.js","sourceRoot":"","sources":["../src/ask-brain.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAwB,EACxB,KAAa,EACb,OAAqB,EAAE;IAEvB,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;QACjC,CAAC,CAAC,IAAI,CAAC,KAAK;QACZ,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY;YAC5B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa;gBAC7B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,QAAQ,CAAC;IAEnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE;QACzD,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAC1C,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;KACzB,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IAEvB,OAAO;QACL,MAAM,EACJ,+EAA+E;QACjF,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAgB;QACpC,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { BrainItem, Domain } from "./types";
3
+ export interface FetchCatalogOpts {
4
+ domain: Domain;
5
+ category?: string | null;
6
+ limit?: number;
7
+ offset?: number;
8
+ }
9
+ /**
10
+ * Server-shuffled catalog feed for the /catalog page.
11
+ * Each call returns a different order (D-004) — set Cache-Control: no-store
12
+ * on the route that uses this.
13
+ */
14
+ export declare function fetchCatalog(supabase: SupabaseClient, opts: FetchCatalogOpts): Promise<BrainItem[]>;
15
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Server-shuffled catalog feed for the /catalog page.
3
+ * Each call returns a different order (D-004) — set Cache-Control: no-store
4
+ * on the route that uses this.
5
+ */
6
+ export async function fetchCatalog(supabase, opts) {
7
+ const { data, error } = await supabase.rpc("brain_catalog_shuffle", {
8
+ p_domain: opts.domain,
9
+ p_category: opts.category ?? null,
10
+ p_limit: opts.limit ?? 24,
11
+ p_offset: opts.offset ?? 0,
12
+ });
13
+ if (error)
14
+ throw error;
15
+ return (data ?? []);
16
+ }
17
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAwB,EACxB,IAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,uBAAuB,EAAE;QAClE,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QACjC,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACzB,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAgB,CAAC;AACrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { DashboardPayload, Realm } from "./types";
3
+ /**
4
+ * Single-call hydration for the /home dashboard.
5
+ * Returns kpi + today's digest + last 10 activity + 12-item catalog preview + counts.
6
+ */
7
+ export declare function fetchDashboard(supabase: SupabaseClient, realm: Realm): Promise<DashboardPayload>;
8
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEvD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,gBAAgB,CAAC,CAM3B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Single-call hydration for the /home dashboard.
3
+ * Returns kpi + today's digest + last 10 activity + 12-item catalog preview + counts.
4
+ */
5
+ export async function fetchDashboard(supabase, realm) {
6
+ const { data, error } = await supabase.rpc("brain_dashboard_payload", {
7
+ p_realm: realm,
8
+ });
9
+ if (error)
10
+ throw error;
11
+ return data;
12
+ }
13
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB,EACxB,KAAY;IAEZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,yBAAyB,EAAE;QACpE,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,IAAwB,CAAC;AAClC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { askBrain } from "./ask-brain";
2
+ export { fetchCatalog } from "./catalog";
3
+ export { fetchDashboard } from "./dashboard";
4
+ export { logActivity } from "./activity";
5
+ export { searchBrain } from "./search";
6
+ export { fetchInventory } from "./inventory";
7
+ export { archiveItem } from "./archive";
8
+ export type { Realm, Domain, BrainKind, BrainSource, BrainStatus, BrainItem, BrainActivity, BrainDigest, BrainKpi, DashboardPayload, InventoryReport, } from "./types";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,YAAY,EACV,KAAK,EACL,MAAM,EACN,SAAS,EACT,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,eAAe,GAChB,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // @skilldrunk/brain-client — Dual-Brain Web shared client.
2
+ // Faz 1 scope: typed wrappers around brain_* RPCs + tables.
3
+ // Consumers: skilldrunk apps (workspace alias), skimsoulfat-app (npm, after publish).
4
+ export { askBrain } from "./ask-brain";
5
+ export { fetchCatalog } from "./catalog";
6
+ export { fetchDashboard } from "./dashboard";
7
+ export { logActivity } from "./activity";
8
+ export { searchBrain } from "./search";
9
+ export { fetchInventory } from "./inventory";
10
+ export { archiveItem } from "./archive";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,4DAA4D;AAC5D,sFAAsF;AAEtF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { InventoryReport } from "./types";
3
+ /**
4
+ * Health snapshot — items per source/realm/status, stale items (>7d),
5
+ * embedding coverage. Used by /ops dashboards and CI smoke tests.
6
+ */
7
+ export declare function fetchInventory(supabase: SupabaseClient): Promise<InventoryReport>;
8
+ //# sourceMappingURL=inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,CAAC,CAI1B"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Health snapshot — items per source/realm/status, stale items (>7d),
3
+ * embedding coverage. Used by /ops dashboards and CI smoke tests.
4
+ */
5
+ export async function fetchInventory(supabase) {
6
+ const { data, error } = await supabase.rpc("brain_inventory_check");
7
+ if (error)
8
+ throw error;
9
+ return data;
10
+ }
11
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB;IAExB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACpE,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,IAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BrainSupabase as SupabaseClient } from "./supabase-shim";
2
+ import type { BrainItem, Realm } from "./types";
3
+ export interface SearchBrainOpts {
4
+ realm?: Realm | null;
5
+ limit?: number;
6
+ }
7
+ /**
8
+ * FTS + trigram fallback search across title/subtitle/description/category.
9
+ * Vector-based semantic search arrives in Faz 4 as `searchBrainVector`.
10
+ */
11
+ export declare function searchBrain(supabase: SupabaseClient, query: string, opts?: SearchBrainOpts): Promise<BrainItem[]>;
12
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,SAAS,EAAE,CAAC,CAQtB"}
package/dist/search.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * FTS + trigram fallback search across title/subtitle/description/category.
3
+ * Vector-based semantic search arrives in Faz 4 as `searchBrainVector`.
4
+ */
5
+ export async function searchBrain(supabase, query, opts = {}) {
6
+ const { data, error } = await supabase.rpc("brain_search", {
7
+ p_query: query,
8
+ p_realm: opts.realm ?? null,
9
+ p_limit: opts.limit ?? 20,
10
+ });
11
+ if (error)
12
+ throw error;
13
+ return (data ?? []);
14
+ }
15
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAwB,EACxB,KAAa,EACb,OAAwB,EAAE;IAE1B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE;QACzD,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QAC3B,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;KAC1B,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,KAAK,CAAC;IACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAgB,CAAC;AACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./index";
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,4 @@
1
+ // Server-only re-exports (Faz 4 will add openai client + Claude synthesis here).
2
+ // Split entry so client bundles don't pull in server-only deps when the time comes.
3
+ export * from "./index";
4
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,oFAAoF;AACpF,cAAc,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type BrainSupabase = any;
2
+ //# sourceMappingURL=supabase-shim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-shim.d.ts","sourceRoot":"","sources":["../src/supabase-shim.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supabase-shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-shim.js","sourceRoot":"","sources":["../src/supabase-shim.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ export type Realm = "work" | "personal" | "shared";
2
+ export type BrainKind = "project" | "prototype" | "tool" | "bot" | "note" | "external_app" | "service";
3
+ export type BrainSource = "vercel" | "github" | "replit" | "lovable" | "google_ai_studio" | "obsidian" | "manual" | "admin_app";
4
+ export type BrainStatus = "active" | "archived" | "draft" | "broken";
5
+ export type Domain = "skilldrunk" | "skimsoulfat";
6
+ export interface BrainItem {
7
+ id: string;
8
+ realm: Realm;
9
+ kind: BrainKind;
10
+ source: BrainSource;
11
+ external_id: string | null;
12
+ slug: string | null;
13
+ title: string;
14
+ subtitle: string | null;
15
+ description: string | null;
16
+ category: string | null;
17
+ status: BrainStatus;
18
+ url: string | null;
19
+ cover_url: string | null;
20
+ icon_url: string | null;
21
+ visible_skilldrunk: boolean;
22
+ visible_skimsoulfat: boolean;
23
+ ingested_at: string;
24
+ last_synced_at: string | null;
25
+ metadata: Record<string, unknown>;
26
+ embedding: number[] | null;
27
+ created_at: string;
28
+ updated_at: string;
29
+ }
30
+ export interface BrainActivity {
31
+ id: string;
32
+ realm: Realm;
33
+ source: BrainSource;
34
+ event_type: string;
35
+ item_id: string | null;
36
+ title: string;
37
+ body: string | null;
38
+ url: string | null;
39
+ occurred_at: string;
40
+ metadata: Record<string, unknown>;
41
+ created_at: string;
42
+ }
43
+ export interface BrainDigest {
44
+ id: number;
45
+ realm: Realm;
46
+ digest_date: string;
47
+ summary: string;
48
+ highlights: Array<Record<string, unknown>>;
49
+ generated_at: string;
50
+ }
51
+ export interface BrainKpi {
52
+ key: string;
53
+ value: number;
54
+ delta_pct: number | null;
55
+ captured_at: string;
56
+ }
57
+ /** Shape returned by `brain_dashboard_payload(p_realm)` RPC. */
58
+ export interface DashboardPayload {
59
+ realm: Realm;
60
+ as_of: string;
61
+ kpi: BrainKpi[];
62
+ digest: {
63
+ date: string;
64
+ summary: string;
65
+ highlights: Array<Record<string, unknown>>;
66
+ generated_at: string;
67
+ } | null;
68
+ activity: BrainActivity[];
69
+ catalog_preview: Array<Pick<BrainItem, "id" | "slug" | "title" | "subtitle" | "url" | "cover_url" | "icon_url" | "kind" | "category" | "source" | "status">>;
70
+ counts: {
71
+ items_total: number;
72
+ activity_24h: number;
73
+ archived: number;
74
+ };
75
+ }
76
+ /** Shape returned by `brain_inventory_check()` RPC. */
77
+ export interface InventoryReport {
78
+ by_source: Array<{
79
+ source: BrainSource;
80
+ count: number;
81
+ last_synced_at: string | null;
82
+ }>;
83
+ by_realm: Array<{
84
+ realm: Realm;
85
+ count: number;
86
+ }>;
87
+ by_status: Array<{
88
+ status: BrainStatus;
89
+ count: number;
90
+ }>;
91
+ stale_items: number;
92
+ embedding_coverage_pct: number;
93
+ total_items: number;
94
+ generated_at: string;
95
+ }
96
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEnD,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,WAAW,GACX,MAAM,GACN,KAAK,GACL,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,UAAU,GACV,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;AAElD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3C,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,KAAK,CACpB,IAAI,CACF,SAAS,EACP,IAAI,GACJ,MAAM,GACN,OAAO,GACP,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,CACX,CACF,CAAC;IACF,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACxF,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ // Shared TypeScript types mirroring 0020_brain_layer.sql enums + row shapes.
2
+ // Source of truth: supabase/migrations/0020_brain_layer.sql.
3
+ // Keep in sync — if migration changes, edit here too.
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6DAA6D;AAC7D,sDAAsD"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@skilldrunk/brain-client",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./server": {
15
+ "types": "./dist/server.d.ts",
16
+ "import": "./dist/server.js",
17
+ "default": "./dist/server.js"
18
+ }
19
+ },
20
+ "files": ["dist", "README.md"],
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.build.json",
23
+ "prepublishOnly": "pnpm run build"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "peerDependencies": {
29
+ "@supabase/supabase-js": "^2.x"
30
+ },
31
+ "devDependencies": {
32
+ "@supabase/supabase-js": "^2.103.0",
33
+ "typescript": "^5"
34
+ }
35
+ }