Files
wiki/convex/_generated/api.d.ts
Wayne Sutton 5a8df46681 feat: Add semantic search with vector embeddings
Add vector-based semantic search to complement keyword search.
  Users can toggle between "Keyword" and "Semantic" modes in the
  search modal (Cmd+K, then Tab to switch).

  Semantic search:
  - Uses OpenAI text-embedding-ada-002 (1536 dimensions)
  - Finds content by meaning, not exact words
  - Shows similarity scores as percentages
  - ~300ms latency, ~$0.0001/query
  - Graceful fallback if OPENAI_API_KEY not set

  New files:
  - convex/embeddings.ts - Embedding generation actions
  - convex/embeddingsQueries.ts - Queries/mutations for embeddings
  - convex/semanticSearch.ts - Vector search action
  - convex/semanticSearchQueries.ts - Result hydration queries
  - content/pages/docs-search.md - Keyword search docs
  - content/pages/docs-semantic-search.md - Semantic search docs

  Changes:
  - convex/schema.ts: Add embedding field and by_embedding vectorIndex
  - SearchModal.tsx: Add mode toggle (TextAa/Brain icons)
  - sync-posts.ts: Generate embeddings after content sync
  - global.css: Search mode toggle styles

  Documentation updated:
  - changelog.md, TASK.md, files.md, about.md, home.md

  Configuration:
  npx convex env set OPENAI_API_KEY sk-your-key

  Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

  Status: Ready to commit. All semantic search files are staged. The TypeScript warnings are pre-existing (unused variables) and don't affect the build.
2026-01-05 18:30:48 -08:00

647 lines
16 KiB
TypeScript

/* eslint-disable */
/**
* Generated `api` utility.
*
* THIS CODE IS AUTOMATICALLY GENERATED.
*
* To regenerate, run `npx convex dev`.
* @module
*/
import type * as aiChatActions from "../aiChatActions.js";
import type * as aiChats from "../aiChats.js";
import type * as aiImageGeneration from "../aiImageGeneration.js";
import type * as cms from "../cms.js";
import type * as contact from "../contact.js";
import type * as contactActions from "../contactActions.js";
import type * as crons from "../crons.js";
import type * as embeddings from "../embeddings.js";
import type * as embeddingsQueries from "../embeddingsQueries.js";
import type * as http from "../http.js";
import type * as importAction from "../importAction.js";
import type * as newsletter from "../newsletter.js";
import type * as newsletterActions from "../newsletterActions.js";
import type * as pages from "../pages.js";
import type * as posts from "../posts.js";
import type * as rss from "../rss.js";
import type * as search from "../search.js";
import type * as semanticSearch from "../semanticSearch.js";
import type * as semanticSearchQueries from "../semanticSearchQueries.js";
import type * as stats from "../stats.js";
import type {
ApiFromModules,
FilterApi,
FunctionReference,
} from "convex/server";
declare const fullApi: ApiFromModules<{
aiChatActions: typeof aiChatActions;
aiChats: typeof aiChats;
aiImageGeneration: typeof aiImageGeneration;
cms: typeof cms;
contact: typeof contact;
contactActions: typeof contactActions;
crons: typeof crons;
embeddings: typeof embeddings;
embeddingsQueries: typeof embeddingsQueries;
http: typeof http;
importAction: typeof importAction;
newsletter: typeof newsletter;
newsletterActions: typeof newsletterActions;
pages: typeof pages;
posts: typeof posts;
rss: typeof rss;
search: typeof search;
semanticSearch: typeof semanticSearch;
semanticSearchQueries: typeof semanticSearchQueries;
stats: typeof stats;
}>;
/**
* A utility for referencing Convex functions in your app's public API.
*
* Usage:
* ```js
* const myFunctionReference = api.myModule.myFunction;
* ```
*/
export declare const api: FilterApi<
typeof fullApi,
FunctionReference<any, "public">
>;
/**
* A utility for referencing Convex functions in your app's internal API.
*
* Usage:
* ```js
* const myFunctionReference = internal.myModule.myFunction;
* ```
*/
export declare const internal: FilterApi<
typeof fullApi,
FunctionReference<any, "internal">
>;
export declare const components: {
pageViewsByPath: {
btree: {
aggregateBetween: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any },
{ count: number; sum: number }
>;
aggregateBetweenBatch: FunctionReference<
"query",
"internal",
{ queries: Array<{ k1?: any; k2?: any; namespace?: any }> },
Array<{ count: number; sum: number }>
>;
atNegativeOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffsetBatch: FunctionReference<
"query",
"internal",
{
queries: Array<{
k1?: any;
k2?: any;
namespace?: any;
offset: number;
}>;
},
Array<{ k: any; s: number; v: any }>
>;
get: FunctionReference<
"query",
"internal",
{ key: any; namespace?: any },
null | { k: any; s: number; v: any }
>;
offset: FunctionReference<
"query",
"internal",
{ k1?: any; key: any; namespace?: any },
number
>;
offsetUntil: FunctionReference<
"query",
"internal",
{ k2?: any; key: any; namespace?: any },
number
>;
paginate: FunctionReference<
"query",
"internal",
{
cursor?: string;
k1?: any;
k2?: any;
limit: number;
namespace?: any;
order: "asc" | "desc";
},
{
cursor: string;
isDone: boolean;
page: Array<{ k: any; s: number; v: any }>;
}
>;
paginateNamespaces: FunctionReference<
"query",
"internal",
{ cursor?: string; limit: number },
{ cursor: string; isDone: boolean; page: Array<any> }
>;
validate: FunctionReference<
"query",
"internal",
{ namespace?: any },
any
>;
};
inspect: {
display: FunctionReference<"query", "internal", { namespace?: any }, any>;
dump: FunctionReference<"query", "internal", { namespace?: any }, string>;
inspectNode: FunctionReference<
"query",
"internal",
{ namespace?: any; node?: string },
null
>;
listTreeNodes: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
aggregate?: { count: number; sum: number };
items: Array<{ k: any; s: number; v: any }>;
subtrees: Array<string>;
}>
>;
listTrees: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
maxNodeSize: number;
namespace?: any;
root: string;
}>
>;
};
public: {
clear: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
delete_: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
null
>;
deleteIfExists: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
any
>;
init: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
insert: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any; summand?: number; value: any },
null
>;
makeRootLazy: FunctionReference<
"mutation",
"internal",
{ namespace?: any },
null
>;
replace: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
null
>;
replaceOrInsert: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
any
>;
};
};
totalPageViews: {
btree: {
aggregateBetween: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any },
{ count: number; sum: number }
>;
aggregateBetweenBatch: FunctionReference<
"query",
"internal",
{ queries: Array<{ k1?: any; k2?: any; namespace?: any }> },
Array<{ count: number; sum: number }>
>;
atNegativeOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffsetBatch: FunctionReference<
"query",
"internal",
{
queries: Array<{
k1?: any;
k2?: any;
namespace?: any;
offset: number;
}>;
},
Array<{ k: any; s: number; v: any }>
>;
get: FunctionReference<
"query",
"internal",
{ key: any; namespace?: any },
null | { k: any; s: number; v: any }
>;
offset: FunctionReference<
"query",
"internal",
{ k1?: any; key: any; namespace?: any },
number
>;
offsetUntil: FunctionReference<
"query",
"internal",
{ k2?: any; key: any; namespace?: any },
number
>;
paginate: FunctionReference<
"query",
"internal",
{
cursor?: string;
k1?: any;
k2?: any;
limit: number;
namespace?: any;
order: "asc" | "desc";
},
{
cursor: string;
isDone: boolean;
page: Array<{ k: any; s: number; v: any }>;
}
>;
paginateNamespaces: FunctionReference<
"query",
"internal",
{ cursor?: string; limit: number },
{ cursor: string; isDone: boolean; page: Array<any> }
>;
validate: FunctionReference<
"query",
"internal",
{ namespace?: any },
any
>;
};
inspect: {
display: FunctionReference<"query", "internal", { namespace?: any }, any>;
dump: FunctionReference<"query", "internal", { namespace?: any }, string>;
inspectNode: FunctionReference<
"query",
"internal",
{ namespace?: any; node?: string },
null
>;
listTreeNodes: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
aggregate?: { count: number; sum: number };
items: Array<{ k: any; s: number; v: any }>;
subtrees: Array<string>;
}>
>;
listTrees: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
maxNodeSize: number;
namespace?: any;
root: string;
}>
>;
};
public: {
clear: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
delete_: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
null
>;
deleteIfExists: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
any
>;
init: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
insert: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any; summand?: number; value: any },
null
>;
makeRootLazy: FunctionReference<
"mutation",
"internal",
{ namespace?: any },
null
>;
replace: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
null
>;
replaceOrInsert: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
any
>;
};
};
uniqueVisitors: {
btree: {
aggregateBetween: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any },
{ count: number; sum: number }
>;
aggregateBetweenBatch: FunctionReference<
"query",
"internal",
{ queries: Array<{ k1?: any; k2?: any; namespace?: any }> },
Array<{ count: number; sum: number }>
>;
atNegativeOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffset: FunctionReference<
"query",
"internal",
{ k1?: any; k2?: any; namespace?: any; offset: number },
{ k: any; s: number; v: any }
>;
atOffsetBatch: FunctionReference<
"query",
"internal",
{
queries: Array<{
k1?: any;
k2?: any;
namespace?: any;
offset: number;
}>;
},
Array<{ k: any; s: number; v: any }>
>;
get: FunctionReference<
"query",
"internal",
{ key: any; namespace?: any },
null | { k: any; s: number; v: any }
>;
offset: FunctionReference<
"query",
"internal",
{ k1?: any; key: any; namespace?: any },
number
>;
offsetUntil: FunctionReference<
"query",
"internal",
{ k2?: any; key: any; namespace?: any },
number
>;
paginate: FunctionReference<
"query",
"internal",
{
cursor?: string;
k1?: any;
k2?: any;
limit: number;
namespace?: any;
order: "asc" | "desc";
},
{
cursor: string;
isDone: boolean;
page: Array<{ k: any; s: number; v: any }>;
}
>;
paginateNamespaces: FunctionReference<
"query",
"internal",
{ cursor?: string; limit: number },
{ cursor: string; isDone: boolean; page: Array<any> }
>;
validate: FunctionReference<
"query",
"internal",
{ namespace?: any },
any
>;
};
inspect: {
display: FunctionReference<"query", "internal", { namespace?: any }, any>;
dump: FunctionReference<"query", "internal", { namespace?: any }, string>;
inspectNode: FunctionReference<
"query",
"internal",
{ namespace?: any; node?: string },
null
>;
listTreeNodes: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
aggregate?: { count: number; sum: number };
items: Array<{ k: any; s: number; v: any }>;
subtrees: Array<string>;
}>
>;
listTrees: FunctionReference<
"query",
"internal",
{ take?: number },
Array<{
_creationTime: number;
_id: string;
maxNodeSize: number;
namespace?: any;
root: string;
}>
>;
};
public: {
clear: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
delete_: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
null
>;
deleteIfExists: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any },
any
>;
init: FunctionReference<
"mutation",
"internal",
{ maxNodeSize?: number; namespace?: any; rootLazy?: boolean },
null
>;
insert: FunctionReference<
"mutation",
"internal",
{ key: any; namespace?: any; summand?: number; value: any },
null
>;
makeRootLazy: FunctionReference<
"mutation",
"internal",
{ namespace?: any },
null
>;
replace: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
null
>;
replaceOrInsert: FunctionReference<
"mutation",
"internal",
{
currentKey: any;
namespace?: any;
newKey: any;
newNamespace?: any;
summand?: number;
value: any;
},
any
>;
};
};
};