feat: Add batch fetching for observations and update documentation

- Implemented a new endpoint for fetching multiple observations by IDs in a single request.
- Updated the DataRoutes to include a POST /api/observations/batch endpoint.
- Enhanced SKILL.md documentation to reflect changes in the search process and batch fetching capabilities.
- Increased the default limit for search results from 5 to 40 for better usability.
This commit is contained in:
Alex Newman
2025-12-14 16:21:25 -05:00
parent eb76a76a5b
commit fad2dc9a15
4 changed files with 68 additions and 7 deletions
+12
View File
@@ -0,0 +1,12 @@
{
"name": "claude-mem-plugin",
"version": "7.2.1",
"private": true,
"description": "Runtime dependencies for claude-mem bundled hooks",
"type": "module",
"dependencies": {},
"engines": {
"node": ">=18.0.0",
"bun": ">=1.0.0"
}
}
File diff suppressed because one or more lines are too long
+24 -6
View File
@@ -19,20 +19,20 @@ Use when users ask about PREVIOUS sessions (not current conversation):
**ALWAYS follow this exact flow:**
1. **Search** - Get an index of results with IDs
2. **Timeline** (optional) - Get context around top results to understand what was happening
2. **Timeline** - Get context around top results to understand what was happening
3. **Review** - Look at titles/dates/context, pick relevant IDs
4. **Fetch** - Get full details ONLY for those IDs
### Step 1: Search Everything
```bash
curl "http://localhost:37777/api/search?query=authentication&format=index&limit=5"
curl "http://localhost:37777/api/search?query=authentication&format=index&limit=40"
```
**Required parameters:**
- `query` - Search term
- `format=index` - ALWAYS start with index (lightweight)
- `limit=5` - Start small (3-5 results)
- `limit=40` - You can request large indexes as necessary
**Returns:**
```
@@ -45,9 +45,9 @@ curl "http://localhost:37777/api/search?query=authentication&format=index&limit=
ID: 10942
```
### Step 2: Get Timeline Context (Optional)
### Step 2: Get Timeline Context
When you need to understand "what was happening" around a result:
You MUST understand "what was happening" around a result:
```bash
# Get timeline around an observation ID
@@ -73,9 +73,14 @@ Review the index results (and timeline if used). Identify which IDs are actually
For each relevant ID, fetch full details:
```bash
# Fetch observation
# Fetch single observation
curl "http://localhost:37777/api/observation/11131"
# Fetch multiple observations in one request (more efficient)
curl -X POST "http://localhost:37777/api/observations/batch" \
-H "Content-Type: application/json" \
-d '{"ids": [11131, 10942, 10855]}'
# Fetch session
curl "http://localhost:37777/api/session/2005"
@@ -83,11 +88,24 @@ curl "http://localhost:37777/api/session/2005"
curl "http://localhost:37777/api/prompt/5421"
```
**Batch fetch options:**
```bash
# With ordering and limit
curl -X POST "http://localhost:37777/api/observations/batch" \
-H "Content-Type: application/json" \
-d '{"ids": [11131, 10942], "orderBy": "date_desc", "limit": 10}'
```
**ID formats:**
- Observations: Just the number (11131)
- Sessions: Just the number (2005) from "S2005"
- Prompts: Just the number (5421)
**When to use batch:**
- Always use batch when fetching 2+ observations
- More efficient: one request vs multiple
- Returns all observations in a single response
## Search Parameters
**Basic:**
@@ -38,6 +38,7 @@ export class DataRoutes extends BaseRouteHandler {
// Fetch by ID endpoints
app.get('/api/observation/:id', this.handleGetObservationById.bind(this));
app.post('/api/observations/batch', this.handleGetObservationsByIds.bind(this));
app.get('/api/session/:id', this.handleGetSessionById.bind(this));
app.get('/api/prompt/:id', this.handleGetPromptById.bind(this));
@@ -96,6 +97,36 @@ export class DataRoutes extends BaseRouteHandler {
res.json(observation);
});
/**
* Get observations by array of IDs
* POST /api/observations/batch
* Body: { ids: number[], orderBy?: 'date_desc' | 'date_asc', limit?: number, project?: string }
*/
private handleGetObservationsByIds = this.wrapHandler((req: Request, res: Response): void => {
const { ids, orderBy, limit, project } = req.body;
if (!ids || !Array.isArray(ids)) {
this.badRequest(res, 'ids must be an array of numbers');
return;
}
if (ids.length === 0) {
res.json([]);
return;
}
// Validate all IDs are numbers
if (!ids.every(id => typeof id === 'number' && Number.isInteger(id))) {
this.badRequest(res, 'All ids must be integers');
return;
}
const store = this.dbManager.getSessionStore();
const observations = store.getObservationsByIds(ids, { orderBy, limit, project });
res.json(observations);
});
/**
* Get session by ID
* GET /api/session/:id