* 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
173 lines
6.1 KiB
Go
173 lines
6.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
hindsight "github.com/vectorize-io/hindsight/hindsight-clients/go"
|
|
)
|
|
|
|
const mmBankID = "mental-models-demo-bank"
|
|
|
|
func main() {
|
|
apiURL := os.Getenv("HINDSIGHT_API_URL")
|
|
if apiURL == "" {
|
|
apiURL = "http://localhost:8888"
|
|
}
|
|
|
|
cfg := hindsight.NewConfiguration()
|
|
cfg.Servers = hindsight.ServerConfigurations{{URL: apiURL}}
|
|
client := hindsight.NewAPIClient(cfg)
|
|
ctx := context.Background()
|
|
|
|
// =============================================================================
|
|
// Setup (not shown in docs)
|
|
// =============================================================================
|
|
client.BanksAPI.CreateOrUpdateBank(ctx, mmBankID).
|
|
CreateBankRequest(hindsight.CreateBankRequest{
|
|
Name: *hindsight.NewNullableString(hindsight.PtrString("Mental Models Demo")),
|
|
}).Execute()
|
|
for _, content := range []string{
|
|
"The team prefers async communication via Slack",
|
|
"For urgent issues, use the #incidents channel",
|
|
"Weekly syncs happen every Monday at 10am",
|
|
} {
|
|
client.MemoryAPI.RetainMemories(ctx, mmBankID).
|
|
RetainRequest(hindsight.RetainRequest{
|
|
Items: []hindsight.MemoryItem{{Content: content}},
|
|
}).Execute()
|
|
}
|
|
time.Sleep(2 * time.Second)
|
|
|
|
// =============================================================================
|
|
// Doc Examples
|
|
// =============================================================================
|
|
|
|
// [docs:create-mental-model]
|
|
// Create a mental model (runs reflect in background)
|
|
result, _, _ := client.MentalModelsAPI.CreateMentalModel(ctx, mmBankID).
|
|
CreateMentalModelRequest(hindsight.CreateMentalModelRequest{
|
|
Name: "Team Communication Preferences",
|
|
SourceQuery: "How does the team prefer to communicate?",
|
|
Tags: []string{"team", "communication"},
|
|
}).Execute()
|
|
|
|
// Returns an operation_id — check operations endpoint for completion
|
|
fmt.Printf("Operation ID: %s\n", result.GetOperationId())
|
|
// [/docs:create-mental-model]
|
|
|
|
// [docs:create-mental-model-with-id]
|
|
// Create a mental model with a specific custom ID
|
|
mmID := "communication-policy"
|
|
resultWithID, _, _ := client.MentalModelsAPI.CreateMentalModel(ctx, mmBankID).
|
|
CreateMentalModelRequest(hindsight.CreateMentalModelRequest{
|
|
Id: *hindsight.NewNullableString(&mmID),
|
|
Name: "Communication Policy",
|
|
SourceQuery: "What are the team's communication guidelines?",
|
|
}).Execute()
|
|
|
|
fmt.Printf("Created with custom ID: %s\n", resultWithID.GetOperationId())
|
|
// [/docs:create-mental-model-with-id]
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
// [docs:create-mental-model-with-trigger]
|
|
// Create a mental model with automatic refresh enabled
|
|
refreshTrue := true
|
|
result2, _, _ := client.MentalModelsAPI.CreateMentalModel(ctx, mmBankID).
|
|
CreateMentalModelRequest(hindsight.CreateMentalModelRequest{
|
|
Name: "Project Status",
|
|
SourceQuery: "What is the current project status?",
|
|
Trigger: &hindsight.MentalModelTrigger{
|
|
RefreshAfterConsolidation: &refreshTrue,
|
|
},
|
|
}).Execute()
|
|
|
|
// This mental model will automatically refresh when observations are updated
|
|
fmt.Printf("Operation ID: %s\n", result2.GetOperationId())
|
|
// [/docs:create-mental-model-with-trigger]
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
// [docs:list-mental-models]
|
|
// List all mental models in a bank
|
|
mentalModels, _, _ := client.MentalModelsAPI.ListMentalModels(ctx, mmBankID).Execute()
|
|
|
|
for _, mm := range mentalModels.GetItems() {
|
|
fmt.Printf("- %s: %s\n", mm.GetName(), mm.GetSourceQuery())
|
|
}
|
|
// [/docs:list-mental-models]
|
|
|
|
if len(mentalModels.GetItems()) == 0 {
|
|
fmt.Println("mental-models.go: All examples passed (no mental models created yet)")
|
|
cleanupMentalModels(client, ctx, apiURL)
|
|
return
|
|
}
|
|
|
|
mentalModelID := mentalModels.GetItems()[0].GetId()
|
|
|
|
// [docs:get-mental-model]
|
|
// Get a specific mental model
|
|
mentalModel, _, _ := client.MentalModelsAPI.GetMentalModel(ctx, mmBankID, mentalModelID).Execute()
|
|
|
|
fmt.Printf("Name: %s\n", mentalModel.GetName())
|
|
fmt.Printf("Content: %s\n", mentalModel.GetContent())
|
|
fmt.Printf("Last refreshed: %s\n", mentalModel.GetLastRefreshedAt())
|
|
// [/docs:get-mental-model]
|
|
|
|
// [docs:refresh-mental-model]
|
|
// Refresh a mental model to update with current knowledge
|
|
refreshResult, _, _ := client.MentalModelsAPI.RefreshMentalModel(ctx, mmBankID, mentalModelID).Execute()
|
|
|
|
fmt.Printf("Refresh operation ID: %s\n", refreshResult.GetOperationId())
|
|
// [/docs:refresh-mental-model]
|
|
|
|
// [docs:update-mental-model]
|
|
// Update a mental model's metadata
|
|
newName := "Updated Team Communication Preferences"
|
|
refreshAfter := true
|
|
updated, _, _ := client.MentalModelsAPI.UpdateMentalModel(ctx, mmBankID, mentalModelID).
|
|
UpdateMentalModelRequest(hindsight.UpdateMentalModelRequest{
|
|
Name: *hindsight.NewNullableString(&newName),
|
|
Trigger: *hindsight.NewNullableMentalModelTrigger(&hindsight.MentalModelTrigger{
|
|
RefreshAfterConsolidation: &refreshAfter,
|
|
}),
|
|
}).Execute()
|
|
|
|
fmt.Printf("Updated name: %s\n", updated.GetName())
|
|
// [/docs:update-mental-model]
|
|
|
|
// [docs:get-mental-model-history]
|
|
// Get the change history of a mental model
|
|
history, _, _ := client.MentalModelsAPI.GetMentalModelHistory(ctx, mmBankID, mentalModelID).Execute()
|
|
|
|
if entries, ok := history.([]interface{}); ok {
|
|
for _, entry := range entries {
|
|
if e, ok := entry.(map[string]interface{}); ok {
|
|
fmt.Printf("Changed at: %v\n", e["changed_at"])
|
|
fmt.Printf("Previous content: %v\n", e["previous_content"])
|
|
}
|
|
}
|
|
}
|
|
// [/docs:get-mental-model-history]
|
|
|
|
// [docs:delete-mental-model]
|
|
// Delete a mental model
|
|
client.MentalModelsAPI.DeleteMentalModel(ctx, mmBankID, mentalModelID).Execute()
|
|
// [/docs:delete-mental-model]
|
|
|
|
// =============================================================================
|
|
// Cleanup (not shown in docs)
|
|
// =============================================================================
|
|
cleanupMentalModels(client, ctx, apiURL)
|
|
|
|
fmt.Println("mental-models.go: All examples passed")
|
|
}
|
|
|
|
func cleanupMentalModels(client *hindsight.APIClient, ctx context.Context, apiURL string) {
|
|
req, _ := http.NewRequest("DELETE", fmt.Sprintf("%s/v1/default/banks/%s", apiURL, mmBankID), nil)
|
|
http.DefaultClient.Do(req)
|
|
}
|