* feat: independent versioning for integrations
- Add per-integration changelog pages at /changelog/integrations/<name>
- Move main changelog to changelog/index.md (URL unchanged)
- Add --integration flag to generate-changelog for LLM-based per-integration changelog generation
- Add scripts/release-integration.sh <name> <version> for cutting integration releases
- Add .github/workflows/release-integration.yml to publish on integrations/** tags
- Remove integrations from main release.sh and release.yml cycle
* fix: add agno and hermes integration docs to version-0.4 for production build
* chore: apply ruff formatting to generate_changelog.py
* feat: add 4-tab code parity across all documentation examples
Every code snippet Tabs block now has Python, Node.js, CLI, and Go variants.
Raw HTTP/curl tabs replaced with proper SDK calls.
New example files:
- Go: retain.go, recall.go, reflect.go, memory-banks.go, directives.go,
mental-models.go, documents.go, main-methods.go
- Shell: memory-banks.sh, directives.sh, mental-models.sh
- Node.js: mental-models.mjs
Extended example files with missing sections:
- recall.mjs/sh: world/experience/observation types, token-budget, all tag modes
- reflect.sh: reflect-with-params, reflect-disposition, reflect-sources, reflect-with-tags
- reflect.mjs: reflect-with-tags, fixed reflect-sources API usage
- retain.mjs/sh: retain-conversation, retain-batch, retain-files-batch
SDK/CLI additions:
- TypeScript: getMentalModelHistory method
- CLI recall: --tags, --tags-match flags
- CLI reflect: --tags, --tags-match, --include-facts flags
- CLI directive update: --is-active flag
- CLI bank set-config: --retain-mission, --retain-extraction-mode,
--observations-mission, --reflect-mission, --disposition-* flags
Build validation:
- scripts/check-code-parity.mjs validates 4-tab parity across all MDX files
- Integrated into npm run build — fails if any Tabs block is missing a variant
* fix: fix doc examples for Go, Node.js, CLI + add mental model with-id examples
- Fix Go Budget constants: BUDGET_HIGH/LOW/MID → HIGH/LOW/MID
- Fix Go documents.go: ListDocuments returns []map[string]interface{}, use map access
- Fix Go retain.go: use correct relative path for sample.pdf
- Fix Node.js createMentalModel: use positional args (name, sourceQuery) not object
- Add CLI 'history' subcommand for mental models (api.rs, main.rs, mental_model.rs)
- Rebuild TypeScript/Python clients to support id param in createMentalModel
- Add create-mental-model-with-id examples across all 4 languages and docs
* fix: move id param to end of create_mental_model signature for backwards compat
129 lines
4.6 KiB
JavaScript
129 lines
4.6 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Mental Models API examples for Hindsight (Node.js)
|
|
* Run: node examples/api/mental-models.mjs
|
|
*/
|
|
import { HindsightClient } from '@vectorize-io/hindsight-client';
|
|
|
|
const HINDSIGHT_URL = process.env.HINDSIGHT_API_URL || 'http://localhost:8888';
|
|
const BANK_ID = 'mental-models-demo-bank';
|
|
|
|
// =============================================================================
|
|
// Setup (not shown in docs)
|
|
// =============================================================================
|
|
const client = new HindsightClient({ baseUrl: HINDSIGHT_URL });
|
|
await client.createBank(BANK_ID, { name: 'Mental Models Demo' });
|
|
await client.retain(BANK_ID, 'The team prefers async communication via Slack');
|
|
await client.retain(BANK_ID, 'For urgent issues, use the #incidents channel');
|
|
await client.retain(BANK_ID, 'Weekly syncs happen every Monday at 10am');
|
|
await new Promise(r => setTimeout(r, 2000));
|
|
|
|
// =============================================================================
|
|
// Doc Examples
|
|
// =============================================================================
|
|
|
|
// [docs:create-mental-model]
|
|
// Create a mental model (runs reflect in background)
|
|
const result = await client.createMentalModel(
|
|
BANK_ID,
|
|
'Team Communication Preferences',
|
|
'How does the team prefer to communicate?',
|
|
{ tags: ['team', 'communication'] },
|
|
);
|
|
|
|
// Returns an operation_id — check operations endpoint for completion
|
|
console.log(`Operation ID: ${result.operation_id}`);
|
|
// [/docs:create-mental-model]
|
|
|
|
// [docs:create-mental-model-with-id]
|
|
// Create a mental model with a specific custom ID
|
|
const resultWithId = await client.createMentalModel(
|
|
BANK_ID,
|
|
'Communication Policy',
|
|
"What are the team's communication guidelines?",
|
|
{ id: 'communication-policy' },
|
|
);
|
|
|
|
console.log(`Created with custom ID: ${resultWithId.operation_id}`);
|
|
// [/docs:create-mental-model-with-id]
|
|
|
|
await new Promise(r => setTimeout(r, 5000));
|
|
|
|
// [docs:create-mental-model-with-trigger]
|
|
// Create a mental model with automatic refresh enabled
|
|
const result2 = await client.createMentalModel(
|
|
BANK_ID,
|
|
'Project Status',
|
|
'What is the current project status?',
|
|
{ trigger: { refreshAfterConsolidation: true } },
|
|
);
|
|
|
|
// This mental model will automatically refresh when observations are updated
|
|
console.log(`Operation ID: ${result2.operation_id}`);
|
|
// [/docs:create-mental-model-with-trigger]
|
|
|
|
await new Promise(r => setTimeout(r, 5000));
|
|
|
|
// [docs:list-mental-models]
|
|
// List all mental models in a bank
|
|
const mentalModels = await client.listMentalModels(BANK_ID);
|
|
|
|
for (const mm of mentalModels.items) {
|
|
console.log(`- ${mm.name}: ${mm.source_query}`);
|
|
}
|
|
// [/docs:list-mental-models]
|
|
|
|
const mentalModelId = mentalModels.items[0]?.id;
|
|
if (!mentalModelId) {
|
|
console.log('mental-models.mjs: All examples passed (no mental models created yet)');
|
|
await fetch(`${HINDSIGHT_URL}/v1/default/banks/${BANK_ID}`, { method: 'DELETE' });
|
|
process.exit(0);
|
|
}
|
|
|
|
// [docs:get-mental-model]
|
|
// Get a specific mental model
|
|
const mentalModel = await client.getMentalModel(BANK_ID, mentalModelId);
|
|
|
|
console.log(`Name: ${mentalModel.name}`);
|
|
console.log(`Content: ${mentalModel.content}`);
|
|
console.log(`Last refreshed: ${mentalModel.last_refreshed_at}`);
|
|
// [/docs:get-mental-model]
|
|
|
|
// [docs:refresh-mental-model]
|
|
// Refresh a mental model to update with current knowledge
|
|
const refreshResult = await client.refreshMentalModel(BANK_ID, mentalModelId);
|
|
|
|
console.log(`Refresh operation ID: ${refreshResult.operation_id}`);
|
|
// [/docs:refresh-mental-model]
|
|
|
|
// [docs:update-mental-model]
|
|
// Update a mental model's metadata
|
|
const updated = await client.updateMentalModel(BANK_ID, mentalModelId, {
|
|
name: 'Updated Team Communication Preferences',
|
|
trigger: { refresh_after_consolidation: true },
|
|
});
|
|
|
|
console.log(`Updated name: ${updated.name}`);
|
|
// [/docs:update-mental-model]
|
|
|
|
// [docs:get-mental-model-history]
|
|
// Get the change history of a mental model
|
|
const history = await client.getMentalModelHistory(BANK_ID, mentalModelId);
|
|
|
|
for (const entry of history) {
|
|
console.log(`Changed at: ${entry.changed_at}`);
|
|
console.log(`Previous content: ${entry.previous_content}`);
|
|
}
|
|
// [/docs:get-mental-model-history]
|
|
|
|
// [docs:delete-mental-model]
|
|
// Delete a mental model
|
|
await client.deleteMentalModel(BANK_ID, mentalModelId);
|
|
// [/docs:delete-mental-model]
|
|
|
|
// =============================================================================
|
|
// Cleanup (not shown in docs)
|
|
// =============================================================================
|
|
await client.deleteBank(BANK_ID);
|
|
|
|
console.log('mental-models.mjs: All examples passed');
|