@memoire-ai/sdk 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.
@@ -0,0 +1,105 @@
1
+ import type { MemoireEvent, IngestEventResponse, ContextSearchRequest, ContextSearchResponse, ContextTimelineRequest, ContextTimelineResponse, ContextProfileRequest, ContextProfileResponse, ContextFactsRequest, ContextFactsResponse, ContextAssembleRequest, ContextAssembleResponse, GraphSearchRequest, GraphSearchResponse, GraphNeighborhoodRequest, GraphNeighborhoodResult, IndexDocsRequest, IndexDocsResponse, SearchDocsRequest, SearchDocsResponse, DocsRegistryResponse, DocsStatusRequest, DocsStatusResponse, AutoSubscribeRequest, AutoSubscribeResponse, IndexUrlDocsRequest, IndexUrlDocsResponse, DocsAnnotateRequest, DocsAnnotateResponse, DocsFeedbackRequest, DocsFeedbackResponse, DocsCurateRequest, DocsCurateResponse, DashboardSummaryRequest, DashboardSummaryResponse, DashboardUsageResponse, DashboardMemoryHealthResponse, DashboardActivityResponse, DashboardMembersResponse, DashboardIntegrationsResponse, ApiKeyInfo, ListApiKeysResponse, CreateApiKeyRequest, CreateApiKeyResponse, RevokeApiKeyRequest, RegisterClientRequest, RegisterClientResponse, ListProjectsResponse, CreateProjectRequest, CreateProjectResponse, BootstrapWorkspaceRequest, BootstrapWorkspaceResponse, CreateInviteRequest, CreateInviteResponse, ListInvitesRequest, ListInvitesResponse, RevokeInviteRequest, RevokeInviteResponse, AcceptInviteRequest, AcceptInviteResponse, CreateHandoffRequest, CreateHandoffResponse, ListHandoffsRequest, ListHandoffsResponse, GetHandoffRequest, GetHandoffResponse, GitHubSearchRequest, GitHubSearchResponse, RunTestsRequest, RunTestsResponse, RecordDemoRequest, RecordDemoResponse, DemoJobResult } from '@memoire-ai/shared';
2
+ export interface MemoireClientOptions {
3
+ apiUrl: string;
4
+ apiKey: string;
5
+ clientId?: string;
6
+ /** Timeout in ms, default 10000 */
7
+ timeout?: number;
8
+ }
9
+ export declare class MemoireClient {
10
+ private apiUrl;
11
+ private apiKey;
12
+ private clientId?;
13
+ private timeout;
14
+ constructor(opts: MemoireClientOptions);
15
+ private request;
16
+ ingestEvents(eventList: MemoireEvent[]): Promise<IngestEventResponse>;
17
+ ingestEvent(event: MemoireEvent): Promise<IngestEventResponse>;
18
+ searchContext(req: ContextSearchRequest): Promise<ContextSearchResponse>;
19
+ timelineContext(req: ContextTimelineRequest): Promise<ContextTimelineResponse>;
20
+ projectProfile(req: ContextProfileRequest): Promise<ContextProfileResponse>;
21
+ projectFacts(req: ContextFactsRequest): Promise<ContextFactsResponse>;
22
+ assembleContext(req: ContextAssembleRequest): Promise<ContextAssembleResponse>;
23
+ graphSearch(req: GraphSearchRequest): Promise<GraphSearchResponse>;
24
+ graphNeighborhood(req: GraphNeighborhoodRequest): Promise<GraphNeighborhoodResult>;
25
+ indexDocs(req: IndexDocsRequest): Promise<IndexDocsResponse>;
26
+ searchDocs(req: SearchDocsRequest): Promise<SearchDocsResponse>;
27
+ docsStatus(req: DocsStatusRequest): Promise<DocsStatusResponse>;
28
+ docsRegistry(req: DocsStatusRequest): Promise<DocsRegistryResponse>;
29
+ autoSubscribeDocs(req: AutoSubscribeRequest): Promise<AutoSubscribeResponse>;
30
+ searchGitHub(req: GitHubSearchRequest): Promise<GitHubSearchResponse>;
31
+ runTests(req: RunTestsRequest): Promise<RunTestsResponse>;
32
+ recordDemo(req: RecordDemoRequest): Promise<RecordDemoResponse>;
33
+ demoStatus(jobId: string): Promise<DemoJobResult>;
34
+ keepDemo(jobId: string): Promise<DemoJobResult>;
35
+ indexUrlDocs(req: IndexUrlDocsRequest): Promise<IndexUrlDocsResponse>;
36
+ annotateDocs(req: DocsAnnotateRequest): Promise<DocsAnnotateResponse>;
37
+ feedbackDocs(req: DocsFeedbackRequest): Promise<DocsFeedbackResponse>;
38
+ curateDocs(req: DocsCurateRequest): Promise<DocsCurateResponse>;
39
+ dashboardSummary(req: DashboardSummaryRequest): Promise<DashboardSummaryResponse>;
40
+ listProjects(): Promise<ListProjectsResponse>;
41
+ createProject(req: CreateProjectRequest): Promise<CreateProjectResponse>;
42
+ bootstrapWorkspace(req: BootstrapWorkspaceRequest): Promise<BootstrapWorkspaceResponse>;
43
+ acceptInvite(req: AcceptInviteRequest): Promise<AcceptInviteResponse>;
44
+ createInvite(req: CreateInviteRequest): Promise<CreateInviteResponse>;
45
+ listInvites(req: ListInvitesRequest): Promise<ListInvitesResponse>;
46
+ revokeInvite(req: RevokeInviteRequest): Promise<RevokeInviteResponse>;
47
+ createHandoff(req: CreateHandoffRequest): Promise<CreateHandoffResponse>;
48
+ listHandoffs(req: ListHandoffsRequest): Promise<ListHandoffsResponse>;
49
+ getHandoff(req: GetHandoffRequest): Promise<GetHandoffResponse>;
50
+ registerClient(req: RegisterClientRequest): Promise<RegisterClientResponse>;
51
+ me(): Promise<ApiKeyInfo>;
52
+ listApiKeys(): Promise<ListApiKeysResponse>;
53
+ createApiKey(req: CreateApiKeyRequest): Promise<CreateApiKeyResponse>;
54
+ revokeApiKey(req: RevokeApiKeyRequest): Promise<{
55
+ ok: true;
56
+ }>;
57
+ dashboardUsage(req: {
58
+ org_id: string;
59
+ project_id: string;
60
+ }): Promise<DashboardUsageResponse>;
61
+ dashboardMemoryHealth(req: {
62
+ org_id: string;
63
+ project_id: string;
64
+ }): Promise<DashboardMemoryHealthResponse>;
65
+ dashboardActivity(req: {
66
+ org_id: string;
67
+ project_id: string;
68
+ days?: number;
69
+ }): Promise<DashboardActivityResponse>;
70
+ dashboardMembers(req: {
71
+ org_id: string;
72
+ project_id: string;
73
+ }): Promise<DashboardMembersResponse>;
74
+ dashboardIntegrations(req: {
75
+ org_id: string;
76
+ project_id: string;
77
+ }): Promise<DashboardIntegrationsResponse>;
78
+ rateFeedback(req: {
79
+ org_id: string;
80
+ project_id: string;
81
+ event_id: string;
82
+ user_id: string;
83
+ rating: 1 | -1;
84
+ label?: string;
85
+ note?: string;
86
+ }): Promise<{
87
+ ok: true;
88
+ feedback_score: number;
89
+ }>;
90
+ feedbackSummary(req: {
91
+ event_id: string;
92
+ }): Promise<{
93
+ event_id: string;
94
+ total_up: number;
95
+ total_down: number;
96
+ feedback_score: number;
97
+ labels: string[];
98
+ notes: string[];
99
+ }>;
100
+ health(): Promise<{
101
+ status: string;
102
+ version: string;
103
+ }>;
104
+ }
105
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,191 @@
1
+ export class MemoireClient {
2
+ apiUrl;
3
+ apiKey;
4
+ clientId;
5
+ timeout;
6
+ constructor(opts) {
7
+ this.apiUrl = opts.apiUrl.replace(/\/$/, '');
8
+ this.apiKey = opts.apiKey;
9
+ this.clientId = opts.clientId;
10
+ this.timeout = opts.timeout ?? 10000;
11
+ }
12
+ async request(path, body) {
13
+ const url = `${this.apiUrl}/v1${path}`;
14
+ const controller = new AbortController();
15
+ const timer = setTimeout(() => controller.abort(), this.timeout);
16
+ try {
17
+ const res = await fetch(url, {
18
+ method: body ? 'POST' : 'GET',
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ Authorization: `Bearer ${this.apiKey}`,
22
+ ...(this.clientId ? { 'X-Memoire-Client-Id': this.clientId } : {}),
23
+ },
24
+ body: body ? JSON.stringify(body) : undefined,
25
+ signal: controller.signal,
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text().catch(() => '');
29
+ throw new Error(`Memoire API error ${res.status}: ${text}`);
30
+ }
31
+ return (await res.json());
32
+ }
33
+ finally {
34
+ clearTimeout(timer);
35
+ }
36
+ }
37
+ // ── Ingest ─────────────────────────────────────────────────────────
38
+ async ingestEvents(eventList) {
39
+ return this.request('/events', { events: eventList });
40
+ }
41
+ async ingestEvent(event) {
42
+ return this.ingestEvents([event]);
43
+ }
44
+ // ── Retrieval ──────────────────────────────────────────────────────
45
+ async searchContext(req) {
46
+ return this.request('/context/search', req);
47
+ }
48
+ async timelineContext(req) {
49
+ return this.request('/context/timeline', req);
50
+ }
51
+ async projectProfile(req) {
52
+ return this.request('/context/profile', req);
53
+ }
54
+ async projectFacts(req) {
55
+ return this.request('/context/facts', req);
56
+ }
57
+ async assembleContext(req) {
58
+ return this.request('/context/assemble', req);
59
+ }
60
+ async graphSearch(req) {
61
+ return this.request('/context/graph/search', req);
62
+ }
63
+ async graphNeighborhood(req) {
64
+ return this.request('/context/graph/neighborhood', req);
65
+ }
66
+ // ── Indexed Docs ────────────────────────────────────────────────────
67
+ async indexDocs(req) {
68
+ return this.request('/docs/index', req);
69
+ }
70
+ async searchDocs(req) {
71
+ return this.request('/docs/search', req);
72
+ }
73
+ async docsStatus(req) {
74
+ return this.request('/docs/status', req);
75
+ }
76
+ async docsRegistry(req) {
77
+ return this.request('/docs/registry', req);
78
+ }
79
+ async autoSubscribeDocs(req) {
80
+ return this.request('/docs/auto-subscribe', req);
81
+ }
82
+ // ── GitHub Search ─────────────────────────────────────────────────
83
+ async searchGitHub(req) {
84
+ return this.request('/github/search', req);
85
+ }
86
+ // ── Sandbox ──────────────────────────────────────────────────────────
87
+ async runTests(req) {
88
+ return this.request('/sandbox/run-tests', req);
89
+ }
90
+ async recordDemo(req) {
91
+ return this.request('/sandbox/record-demo', req);
92
+ }
93
+ async demoStatus(jobId) {
94
+ return this.request('/sandbox/demo-status', { job_id: jobId });
95
+ }
96
+ async keepDemo(jobId) {
97
+ return this.request('/sandbox/demo-keep', { job_id: jobId });
98
+ }
99
+ async indexUrlDocs(req) {
100
+ return this.request('/docs/index-url', req);
101
+ }
102
+ async annotateDocs(req) {
103
+ return this.request('/docs/annotate', req);
104
+ }
105
+ async feedbackDocs(req) {
106
+ return this.request('/docs/feedback', req);
107
+ }
108
+ async curateDocs(req) {
109
+ return this.request('/docs/curate', req);
110
+ }
111
+ // ── Dashboard ──────────────────────────────────────────────────────
112
+ async dashboardSummary(req) {
113
+ return this.request('/dashboard/summary', req);
114
+ }
115
+ // ── Projects ───────────────────────────────────────────────────────
116
+ async listProjects() {
117
+ return this.request('/projects');
118
+ }
119
+ async createProject(req) {
120
+ return this.request('/projects', req);
121
+ }
122
+ async bootstrapWorkspace(req) {
123
+ return this.request('/setup/bootstrap', req);
124
+ }
125
+ async acceptInvite(req) {
126
+ return this.request('/setup/accept-invite', req);
127
+ }
128
+ async createInvite(req) {
129
+ return this.request('/invites', req);
130
+ }
131
+ async listInvites(req) {
132
+ return this.request('/invites/list', req);
133
+ }
134
+ async revokeInvite(req) {
135
+ return this.request('/invites/revoke', req);
136
+ }
137
+ async createHandoff(req) {
138
+ return this.request('/handoffs/create', req);
139
+ }
140
+ async listHandoffs(req) {
141
+ return this.request('/handoffs/list', req);
142
+ }
143
+ async getHandoff(req) {
144
+ return this.request('/handoffs/get', req);
145
+ }
146
+ // ── Install ────────────────────────────────────────────────────────
147
+ async registerClient(req) {
148
+ return this.request('/install/register-client', req);
149
+ }
150
+ async me() {
151
+ return this.request('/me');
152
+ }
153
+ async listApiKeys() {
154
+ return this.request('/api-keys');
155
+ }
156
+ async createApiKey(req) {
157
+ return this.request('/api-keys', req);
158
+ }
159
+ async revokeApiKey(req) {
160
+ return this.request('/api-keys/revoke', req);
161
+ }
162
+ // ── Analytics ──────────────────────────────────────────────────────
163
+ async dashboardUsage(req) {
164
+ return this.request('/dashboard/usage', req);
165
+ }
166
+ async dashboardMemoryHealth(req) {
167
+ return this.request('/dashboard/memory-health', req);
168
+ }
169
+ async dashboardActivity(req) {
170
+ return this.request('/dashboard/activity', req);
171
+ }
172
+ async dashboardMembers(req) {
173
+ return this.request('/dashboard/members', req);
174
+ }
175
+ async dashboardIntegrations(req) {
176
+ return this.request('/dashboard/integrations', req);
177
+ }
178
+ // ── Feedback ─────────────────────────────────────────────────────
179
+ async rateFeedback(req) {
180
+ return this.request('/feedback/rate', req);
181
+ }
182
+ async feedbackSummary(req) {
183
+ return this.request('/feedback/summary', req);
184
+ }
185
+ // ── Health ─────────────────────────────────────────────────────────
186
+ async health() {
187
+ const res = await fetch(`${this.apiUrl}/health`);
188
+ return res.json();
189
+ }
190
+ }
191
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAoFA,MAAM,OAAO,aAAa;IAChB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,QAAQ,CAAU;IAClB,OAAO,CAAS;IAExB,YAAY,IAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAc;QACnD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;gBAC7B,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACtC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnE;gBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,YAAY,CAAC,SAAyB;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAsB,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAmB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,aAAa,CAAC,GAAyB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAwB,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAA2B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAA0B,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAyB,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAA2B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAA0B,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAuB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAsB,uBAAuB,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAA6B;QACnD,OAAO,IAAI,CAAC,OAAO,CAA0B,6BAA6B,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,uEAAuE;IAEvE,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAoB,aAAa,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAqB,cAAc,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAqB,cAAc,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAsB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAyB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAwB,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,qEAAqE;IAErE,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,QAAQ,CAAC,GAAoB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAmB,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAqB,sBAAsB,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAgB,sBAAsB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAgB,oBAAoB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAqB,cAAc,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,gBAAgB,CAAC,GAA4B;QACjD,OAAO,IAAI,CAAC,OAAO,CAA2B,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAuB,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAyB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAwB,WAAW,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAA8B;QACrD,OAAO,IAAI,CAAC,OAAO,CAA6B,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,sBAAsB,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,UAAU,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAuB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAsB,eAAe,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAyB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAwB,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAqB,eAAe,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAyB,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,EAAE;QACN,OAAO,IAAI,CAAC,OAAO,CAAa,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAsB,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAuB,WAAW,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAe,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,cAAc,CAAC,GAA2C;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAyB,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,GAA2C;QACrE,OAAO,IAAI,CAAC,OAAO,CAAgC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAA0D;QAChF,OAAO,IAAI,CAAC,OAAO,CAA4B,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAA2C;QAChE,OAAO,IAAI,CAAC,OAAO,CAA2B,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,GAA2C;QACrE,OAAO,IAAI,CAAC,OAAO,CAAgC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,oEAAoE;IAEpE,KAAK,CAAC,YAAY,CAAC,GAQlB;QACC,OAAO,IAAI,CAAC,OAAO,CAAuC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAyB;QAQ7C,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,sEAAsE;IAEtE,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC,IAAI,EAAkD,CAAC;IACpE,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,387 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { MemoireClient } from './client.js';
4
+ test('MemoireClient sends the client heartbeat header and hits the dashboard endpoint', async () => {
5
+ const calls = [];
6
+ const originalFetch = globalThis.fetch;
7
+ globalThis.fetch = (async (input, init) => {
8
+ calls.push({ url: String(input), init });
9
+ return new Response(JSON.stringify({
10
+ project: {
11
+ id: 'project-1',
12
+ name: 'Memoire',
13
+ slug: 'memoire',
14
+ created_at: '2026-03-10T00:00:00.000Z',
15
+ },
16
+ viewer: {
17
+ user_id: 'user-1',
18
+ org_id: 'org-1',
19
+ key_id: 'key-1',
20
+ },
21
+ stats: {
22
+ total_events: 1,
23
+ recent_events_24h: 1,
24
+ decisions_7d: 0,
25
+ attempts_7d: 0,
26
+ active_users_24h: 1,
27
+ active_clients_24h: 1,
28
+ },
29
+ docs: {
30
+ indexed_dependencies: 0,
31
+ indexed_chunks: 0,
32
+ },
33
+ project_profile: {
34
+ summary: 'Memoire is shaped by shared retrieval APIs.',
35
+ architecture: ['Decision: Use shared retrieval APIs'],
36
+ conventions: ['Convention: Routes live in src/api'],
37
+ current_focus: ['Add project profile section'],
38
+ recent_decisions: ['Decision: Use shared retrieval APIs'],
39
+ open_threads: ['Add project profile section'],
40
+ key_files: ['apps/api/src/routes/context.ts'],
41
+ last_updated_at: '2026-03-10T00:00:00.000Z',
42
+ },
43
+ registered_clients: [],
44
+ recent_events: [],
45
+ active_work: [],
46
+ conflicts: [],
47
+ }), {
48
+ status: 200,
49
+ headers: { 'Content-Type': 'application/json' },
50
+ });
51
+ });
52
+ try {
53
+ const client = new MemoireClient({
54
+ apiUrl: 'http://localhost:8080',
55
+ apiKey: 'sk_mem_test',
56
+ clientId: 'client-123',
57
+ });
58
+ const result = await client.dashboardSummary({
59
+ org_id: 'org-1',
60
+ project_id: 'project-1',
61
+ viewer_user_id: 'user-1',
62
+ });
63
+ assert.equal(result.project.slug, 'memoire');
64
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/dashboard/summary');
65
+ const headers = new Headers(calls[0]?.init?.headers);
66
+ assert.equal(headers.get('authorization'), 'Bearer sk_mem_test');
67
+ assert.equal(headers.get('x-memoire-client-id'), 'client-123');
68
+ }
69
+ finally {
70
+ globalThis.fetch = originalFetch;
71
+ }
72
+ });
73
+ test('MemoireClient me() reads API key metadata', async () => {
74
+ const originalFetch = globalThis.fetch;
75
+ globalThis.fetch = (async () => new Response(JSON.stringify({
76
+ key_id: 'key-1',
77
+ org_id: 'org-1',
78
+ scopes: ['*'],
79
+ rate_limit: 1000,
80
+ created_at: '2026-03-10T00:00:00.000Z',
81
+ }), {
82
+ status: 200,
83
+ headers: { 'Content-Type': 'application/json' },
84
+ }));
85
+ try {
86
+ const client = new MemoireClient({
87
+ apiUrl: 'http://localhost:8080',
88
+ apiKey: 'sk_mem_test',
89
+ });
90
+ const me = await client.me();
91
+ assert.equal(me.key_id, 'key-1');
92
+ assert.equal(me.rate_limit, 1000);
93
+ }
94
+ finally {
95
+ globalThis.fetch = originalFetch;
96
+ }
97
+ });
98
+ test('MemoireClient createProject() hits the projects endpoint', async () => {
99
+ const calls = [];
100
+ const originalFetch = globalThis.fetch;
101
+ globalThis.fetch = (async (input, init) => {
102
+ calls.push({ url: String(input), init });
103
+ return new Response(JSON.stringify({
104
+ project: {
105
+ id: 'project-2',
106
+ name: 'memoire',
107
+ slug: 'memoire',
108
+ repo_url: 'https://github.com/acme/memoire',
109
+ created_at: '2026-03-12T00:00:00.000Z',
110
+ },
111
+ created: true,
112
+ }), {
113
+ status: 201,
114
+ headers: { 'Content-Type': 'application/json' },
115
+ });
116
+ });
117
+ try {
118
+ const client = new MemoireClient({
119
+ apiUrl: 'http://localhost:8080',
120
+ apiKey: 'sk_mem_test',
121
+ });
122
+ const result = await client.createProject({
123
+ name: 'Memoire',
124
+ repo_url: 'https://github.com/acme/memoire',
125
+ });
126
+ assert.equal(result.project.id, 'project-2');
127
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/projects');
128
+ assert.equal(calls[0]?.init?.method, 'POST');
129
+ }
130
+ finally {
131
+ globalThis.fetch = originalFetch;
132
+ }
133
+ });
134
+ test('MemoireClient bootstrapWorkspace() hits the setup endpoint', async () => {
135
+ const calls = [];
136
+ const originalFetch = globalThis.fetch;
137
+ globalThis.fetch = (async (input, init) => {
138
+ calls.push({ url: String(input), init });
139
+ return new Response(JSON.stringify({
140
+ org_id: 'org-1',
141
+ org_slug: 'acme',
142
+ project_id: 'project-1',
143
+ project_slug: 'memoire',
144
+ user_id: 'user-1',
145
+ api_key: {
146
+ key_id: 'key-1',
147
+ org_id: 'org-1',
148
+ key_prefix: 'sk_mem_test',
149
+ scopes: ['*'],
150
+ rate_limit: 10000,
151
+ created_at: '2026-03-12T00:00:00.000Z',
152
+ },
153
+ token: 'sk_mem_test_bootstrap',
154
+ }), {
155
+ status: 201,
156
+ headers: { 'Content-Type': 'application/json' },
157
+ });
158
+ });
159
+ try {
160
+ const client = new MemoireClient({
161
+ apiUrl: 'http://localhost:8080',
162
+ apiKey: 'sk_mem_test',
163
+ });
164
+ const result = await client.bootstrapWorkspace({
165
+ org_name: 'Acme',
166
+ project_name: 'Memoire',
167
+ admin_name: 'Alice',
168
+ });
169
+ assert.equal(result.project_slug, 'memoire');
170
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/setup/bootstrap');
171
+ assert.equal(calls[0]?.init?.method, 'POST');
172
+ }
173
+ finally {
174
+ globalThis.fetch = originalFetch;
175
+ }
176
+ });
177
+ test('MemoireClient acceptInvite() hits the invite acceptance endpoint', async () => {
178
+ const calls = [];
179
+ const originalFetch = globalThis.fetch;
180
+ globalThis.fetch = (async (input, init) => {
181
+ calls.push({ url: String(input), init });
182
+ return new Response(JSON.stringify({
183
+ org_id: 'org-1',
184
+ org_slug: 'acme',
185
+ project_id: 'project-1',
186
+ project_slug: 'memoire',
187
+ user_id: 'user-1',
188
+ api_key: {
189
+ key_id: 'key-1',
190
+ org_id: 'org-1',
191
+ key_prefix: 'sk_mem_invite',
192
+ scopes: ['*'],
193
+ rate_limit: 10000,
194
+ created_at: '2026-03-12T00:00:00.000Z',
195
+ },
196
+ token: 'sk_mem_invited',
197
+ }), {
198
+ status: 201,
199
+ headers: { 'Content-Type': 'application/json' },
200
+ });
201
+ });
202
+ try {
203
+ const client = new MemoireClient({
204
+ apiUrl: 'http://localhost:8080',
205
+ apiKey: 'sk_mem_test',
206
+ });
207
+ const result = await client.acceptInvite({
208
+ invite_token: 'invite-token',
209
+ user_name: 'Alice',
210
+ user_email: 'alice@acme.com',
211
+ });
212
+ assert.equal(result.project_slug, 'memoire');
213
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/setup/accept-invite');
214
+ }
215
+ finally {
216
+ globalThis.fetch = originalFetch;
217
+ }
218
+ });
219
+ test('MemoireClient createInvite() hits the invites endpoint', async () => {
220
+ const calls = [];
221
+ const originalFetch = globalThis.fetch;
222
+ globalThis.fetch = (async (input, init) => {
223
+ calls.push({ url: String(input), init });
224
+ return new Response(JSON.stringify({
225
+ invite: {
226
+ id: 'invite-1',
227
+ org_id: 'org-1',
228
+ project_id: 'project-1',
229
+ email: 'new@acme.com',
230
+ role: 'member',
231
+ status: 'pending',
232
+ created_at: '2026-03-12T00:00:00.000Z',
233
+ expires_at: '2026-03-26T00:00:00.000Z',
234
+ },
235
+ token: 'invite-token',
236
+ install_command: 'npx memoire init --invite-token invite-token --client cursor',
237
+ }), {
238
+ status: 201,
239
+ headers: { 'Content-Type': 'application/json' },
240
+ });
241
+ });
242
+ try {
243
+ const client = new MemoireClient({
244
+ apiUrl: 'http://localhost:8080',
245
+ apiKey: 'sk_mem_test',
246
+ });
247
+ const result = await client.createInvite({
248
+ org_id: 'org-1',
249
+ project_id: 'project-1',
250
+ viewer_user_id: 'user-1',
251
+ email: 'new@acme.com',
252
+ });
253
+ assert.equal(result.invite.id, 'invite-1');
254
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/invites');
255
+ }
256
+ finally {
257
+ globalThis.fetch = originalFetch;
258
+ }
259
+ });
260
+ test('MemoireClient createHandoff() hits the handoff endpoint', async () => {
261
+ const calls = [];
262
+ const originalFetch = globalThis.fetch;
263
+ globalThis.fetch = (async (input, init) => {
264
+ calls.push({ url: String(input), init });
265
+ return new Response(JSON.stringify({
266
+ handoff: {
267
+ id: 'handoff-1',
268
+ title: 'Handoff: oauth',
269
+ query: 'oauth',
270
+ summary: 'Use PKCE',
271
+ context_block: '# Memoire Resume',
272
+ source_event_ids: ['event-1'],
273
+ created_by_user_id: 'user-1',
274
+ created_at: '2026-03-12T00:00:00.000Z',
275
+ },
276
+ }), {
277
+ status: 201,
278
+ headers: { 'Content-Type': 'application/json' },
279
+ });
280
+ });
281
+ try {
282
+ const client = new MemoireClient({
283
+ apiUrl: 'http://localhost:8080',
284
+ apiKey: 'sk_mem_test',
285
+ });
286
+ const result = await client.createHandoff({
287
+ org_id: 'org-1',
288
+ project_id: 'project-1',
289
+ viewer_user_id: 'user-1',
290
+ query: 'oauth',
291
+ context_block: '# Memoire Resume',
292
+ source_event_ids: ['event-1'],
293
+ });
294
+ assert.equal(result.handoff.id, 'handoff-1');
295
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/handoffs/create');
296
+ }
297
+ finally {
298
+ globalThis.fetch = originalFetch;
299
+ }
300
+ });
301
+ test('MemoireClient projectProfile() hits the profile endpoint', async () => {
302
+ const calls = [];
303
+ const originalFetch = globalThis.fetch;
304
+ globalThis.fetch = (async (input, init) => {
305
+ calls.push({ url: String(input), init });
306
+ return new Response(JSON.stringify({
307
+ project_profile: {
308
+ summary: 'Memoire centers on shared project memory.',
309
+ architecture: ['Use API + MCP for shared retrieval'],
310
+ conventions: ['Keep hooks thin and API-first'],
311
+ current_focus: ['Ship project profile'],
312
+ recent_decisions: ['Adopt shared project profile'],
313
+ open_threads: ['Add native hook install'],
314
+ key_files: ['apps/api/src/routes/context.ts'],
315
+ last_updated_at: '2026-03-11T00:00:00.000Z',
316
+ },
317
+ source_event_count: 8,
318
+ source_event_types: ['decision', 'prompt'],
319
+ }), {
320
+ status: 200,
321
+ headers: { 'Content-Type': 'application/json' },
322
+ });
323
+ });
324
+ try {
325
+ const client = new MemoireClient({
326
+ apiUrl: 'http://localhost:8080',
327
+ apiKey: 'sk_mem_test',
328
+ clientId: 'client-123',
329
+ });
330
+ const result = await client.projectProfile({
331
+ org_id: 'org-1',
332
+ project_id: 'project-1',
333
+ viewer_user_id: 'user-1',
334
+ });
335
+ assert.equal(result.project_profile.summary, 'Memoire centers on shared project memory.');
336
+ assert.equal(result.source_event_count, 8);
337
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/context/profile');
338
+ }
339
+ finally {
340
+ globalThis.fetch = originalFetch;
341
+ }
342
+ });
343
+ test('MemoireClient projectFacts() hits the facts endpoint', async () => {
344
+ const calls = [];
345
+ const originalFetch = globalThis.fetch;
346
+ globalThis.fetch = (async (input, init) => {
347
+ calls.push({ url: String(input), init });
348
+ return new Response(JSON.stringify({
349
+ facts: {
350
+ static: [
351
+ {
352
+ text: 'Postgres is the source of truth',
353
+ kind: 'static',
354
+ category: 'decision',
355
+ confidence: 0.9,
356
+ source_event_ids: ['event-1'],
357
+ last_seen_at: '2026-03-11T00:00:00.000Z',
358
+ },
359
+ ],
360
+ dynamic: [],
361
+ },
362
+ source_event_count: 4,
363
+ source_event_types: ['decision'],
364
+ }), {
365
+ status: 200,
366
+ headers: { 'Content-Type': 'application/json' },
367
+ });
368
+ });
369
+ try {
370
+ const client = new MemoireClient({
371
+ apiUrl: 'http://localhost:8080',
372
+ apiKey: 'sk_mem_test',
373
+ clientId: 'client-123',
374
+ });
375
+ const result = await client.projectFacts({
376
+ org_id: 'org-1',
377
+ project_id: 'project-1',
378
+ viewer_user_id: 'user-1',
379
+ });
380
+ assert.equal(result.facts.static[0]?.text, 'Postgres is the source of truth');
381
+ assert.equal(calls[0]?.url, 'http://localhost:8080/v1/context/facts');
382
+ }
383
+ finally {
384
+ globalThis.fetch = originalFetch;
385
+ }
386
+ });
387
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { MemoireClient } from './client.js';
2
+ export { OfflineQueue } from './queue.js';
3
+ export type { MemoireClientOptions } from './client.js';
4
+ //# 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,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { MemoireClient } from './client.js';
2
+ export { OfflineQueue } from './queue.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { MemoireEvent } from '@memoire-ai/shared';
2
+ import { MemoireClient } from './client.js';
3
+ /**
4
+ * Offline queue that buffers events when the API is unreachable
5
+ * and retries with exponential backoff.
6
+ *
7
+ * Follows the claude-mem pattern: local disk is only a retry buffer,
8
+ * never the source of truth.
9
+ */
10
+ export declare class OfflineQueue {
11
+ private queue;
12
+ private client;
13
+ private maxRetries;
14
+ private flushInterval;
15
+ private flushing;
16
+ constructor(client: MemoireClient, opts?: {
17
+ maxRetries?: number;
18
+ flushIntervalMs?: number;
19
+ });
20
+ /** Add events to the queue for eventual delivery */
21
+ enqueue(events: MemoireEvent[]): void;
22
+ /** Try to send all queued batches */
23
+ flush(): Promise<{
24
+ sent: number;
25
+ failed: number;
26
+ }>;
27
+ /** Number of events waiting in the queue */
28
+ get pending(): number;
29
+ /** Stop the flush interval */
30
+ destroy(): void;
31
+ }
32
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;IAO3F,oDAAoD;IACpD,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI;IAIrC,qCAAqC;IAC/B,KAAK,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA2BxD,4CAA4C;IAC5C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,8BAA8B;IAC9B,OAAO,IAAI,IAAI;CAMhB"}
package/dist/queue.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Offline queue that buffers events when the API is unreachable
3
+ * and retries with exponential backoff.
4
+ *
5
+ * Follows the claude-mem pattern: local disk is only a retry buffer,
6
+ * never the source of truth.
7
+ */
8
+ export class OfflineQueue {
9
+ queue = [];
10
+ client;
11
+ maxRetries;
12
+ flushInterval = null;
13
+ flushing = false;
14
+ constructor(client, opts) {
15
+ this.client = client;
16
+ this.maxRetries = opts?.maxRetries ?? 5;
17
+ const intervalMs = opts?.flushIntervalMs ?? 30000;
18
+ this.flushInterval = setInterval(() => this.flush(), intervalMs);
19
+ }
20
+ /** Add events to the queue for eventual delivery */
21
+ enqueue(events) {
22
+ this.queue.push({ events, attempts: 0, queued_at: Date.now() });
23
+ }
24
+ /** Try to send all queued batches */
25
+ async flush() {
26
+ if (this.flushing || this.queue.length === 0)
27
+ return { sent: 0, failed: 0 };
28
+ this.flushing = true;
29
+ let sent = 0;
30
+ let failed = 0;
31
+ const remaining = [];
32
+ for (const batch of this.queue) {
33
+ try {
34
+ await this.client.ingestEvents(batch.events);
35
+ sent += batch.events.length;
36
+ }
37
+ catch {
38
+ batch.attempts++;
39
+ if (batch.attempts < this.maxRetries) {
40
+ remaining.push(batch);
41
+ }
42
+ else {
43
+ failed += batch.events.length;
44
+ }
45
+ }
46
+ }
47
+ this.queue = remaining;
48
+ this.flushing = false;
49
+ return { sent, failed };
50
+ }
51
+ /** Number of events waiting in the queue */
52
+ get pending() {
53
+ return this.queue.reduce((sum, b) => sum + b.events.length, 0);
54
+ }
55
+ /** Stop the flush interval */
56
+ destroy() {
57
+ if (this.flushInterval) {
58
+ clearInterval(this.flushInterval);
59
+ this.flushInterval = null;
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,GAAkB,EAAE,CAAC;IAC1B,MAAM,CAAgB;IACtB,UAAU,CAAS;IACnB,aAAa,GAA0C,IAAI,CAAC;IAC5D,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAqB,EAAE,IAAwD;QACzF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,EAAE,eAAe,IAAI,KAAK,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;IACnE,CAAC;IAED,oDAAoD;IACpD,OAAO,CAAC,MAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,SAAS,GAAkB,EAAE,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBACrC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,8BAA8B;IAC9B,OAAO;QACL,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@memoire-ai/sdk",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "TypeScript SDK for Memoire ingest, retrieval, docs, and install APIs",
6
+ "license": "AGPL-3.0",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "sideEffects": false,
11
+ "engines": {
12
+ "node": ">=18.0.0"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "@memoire-ai/shared": "0.1.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "typescript": "^5.7.0"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "dev": "tsc --watch",
36
+ "test": "node --test dist/*.test.js"
37
+ }
38
+ }