* feat(api): add bank template import/export endpoints
Add POST /banks/{bank_id}/import and GET /banks/{bank_id}/export
endpoints for declarative bank setup via JSON manifests.
A template manifest (version 1) can include bank config overrides
and mental model definitions. Import creates or updates mental
models matched by id, applies config as per-bank overrides, and
returns async operation IDs for content generation.
Export dumps a bank's explicit overrides and mental models as a
manifest that can be re-imported into another bank.
Includes control plane UI: bank creation dialog now accepts an
optional template JSON to pre-configure the bank on creation.
* docs: add Template Gallery page and bank templates reference
- Template Gallery (/templates) with search, category filter, manifest
preview modal with copy-to-clipboard
- 5 starter templates: Customer Support, Research Assistant, Personal
Journal, Code Review Buddy, Meeting Notes
- Bank Templates API reference doc (developer/api/bank-templates)
- Sidebar entry under API section
* docs: add Template Gallery links to navbar and sidebar
- Top navbar: "Templates" link between Integrations and Changelog
- Sidebar: "Template Gallery" in Resources section
* fix(docs): remove emoji icons, autofocus search, fix placeholder in template gallery
* docs: rename to Bank Templates, move to Resources sidebar only
* docs: add Bank Templates to Resources navbar dropdown
* feat(api): add directives to bank template import/export
- Add BankTemplateDirective model with name, content, priority, is_active, tags
- Import creates/updates directives matched by name
- Export includes all directives (active and inactive)
- Validation: duplicate names rejected, empty name/content caught
- Tests: 24 tests covering directives create/update, existing vs new
bank import, validation, export with directives, full round-trip
* docs: add directives to bank templates docs and sample templates
* feat(api): add JSON Schema endpoint for bank template validation
- GET /v1/default/bank-template-schema returns the JSON Schema
auto-generated from the Pydantic BankTemplateManifest model
- Static schema file at docs/static/bank-template-schema.json
- Docs updated with schema endpoint, static file link, and
validation examples (Python jsonschema, Node ajv-cli)
* feat(api): live schema validation on import, fix schema endpoint path
- Move schema endpoint to /v1/bank-template-schema (system-level, not per-bank)
- Import endpoint now accepts raw JSON and validates with Pydantic manually,
returning clean 400 errors instead of raw 422s for all validation failures
- All validation (schema + semantic) returns consistent 400 with detailed messages
* docs: add interactive JSON Schema viewer to Bank Templates page
Renders the Pydantic-generated schema as a collapsible property tree
with types, required badges, defaults, and descriptions. The schema
is imported from the static bank-template-schema.json file.
* ui: add template toggle switch and browse link to bank creation dialog
- Replace always-visible textarea with a switch toggle ("Import from template")
- Textarea only shows when switch is on, keeping the dialog clean by default
- Add "Browse templates" link pointing to hindsight.vectorize.io/templates
- Reset template state when switch is toggled off or dialog is cancelled
* ui: add empty state with Add Document CTA to data view
When a bank has 0 memories, the data view (all tabs: constellation,
graph, table, timeline) shows a centered empty state with a CTA
button that opens the Add Document dialog.
* docs: replace templates with Conversation and Coding Agent
Remove generic placeholder templates. Add two practical templates
based on actual integration patterns:
- Conversation: for chat agents (LiteLLM, LangGraph, Pydantic AI,
Vercel AI SDK). Tracks user preferences, open threads.
- Coding Agent: for Claude Code/Codex. Tracks technical decisions,
project context, developer preferences. High literalism.
* docs: rename gallery to Bank Templates Hub, keep API doc as Bank Templates
* docs: register layout-template and file-json icons in navbar and sidebar
* docs: register layout-template icon in DefaultNavbarItem for dropdown items
* docs: show integration icons on template cards
Templates now have an optional `integrations` field referencing
integration IDs from integrations.json. Icons are resolved at render
time and shown in the card header next to the category badge.
* docs: add Personal Assistant template for OpenClaw, Hermes, NemoClaw
* feat: add Export Template to bank actions + map all integrations to templates
- Add "Export Template" to the bank Actions dropdown — exports config,
mental models, and directives as JSON, copies to clipboard
- Add export API route and client method
- Map remaining integrations to templates: CrewAI, AG2, Agno, Strands,
LlamaIndex, local-mcp, skills → Conversation; hindclaw → Personal Assistant
* feat: add --template flag to LoCoMo benchmark + remove schema from Hub
- LoCoMo benchmark accepts --template <path> to apply a bank template
manifest (config, mental models, directives) before ingestion
- Template is applied per-bank in both single-phase and two-phase modes
- BenchmarkRunner.apply_template() reuses the same engine methods as
the /import API endpoint
- Remove Manifest Schema section from Bank Templates Hub page
(schema stays in the API reference doc)
* refactor: remove description field from bank template manifest
* docs: remove tags, fact_types, and directives from starter templates
* docs: remove reflect_mission and disposition fields from starter templates
* build: validate template manifests against JSON Schema during docs build
* cleanup: remove unused JsonSchemaViewer component
* docs: remove retain_extraction_mode from starter templates
* ui: enable word wrap in template manifest preview
* docs: add link to Bank Templates reference doc from Hub page
* docs: convert bank templates doc to mdx with multi-language code snippets
- Convert bank-templates.md to .mdx with Tabs/CodeSnippet components
- Add example files: bank-templates.py, .mjs, .sh, .go with doc markers
- Examples cover import, dry-run, export, round-trip, and schema
- Regenerate OpenAPI spec and all client SDKs (Python, TS, Rust, Go)
* fix: migration revision collision + use typed models in benchmark template
- Rename merge migration d6e7f8a9b0c1 -> d6e7f8a9b0c2 to resolve
revision ID collision with case_insensitive_entities_trgm_index
- Update a4b5c6d7e8f9 down_revision to point to the renamed migration
- Fix f-string lint in case_insensitive migration
- BenchmarkRunner.apply_template() now validates manifest through
BankTemplateManifest Pydantic model instead of raw dict access
- Remove redundant inline imports (json, Path already at module top)
* fix(docs): add missing Go tab to dry-run code snippet
* ci: retrigger
* fix: sync skills openapi.json + fix bankId null type error in export
- Copy updated openapi.json to skills/hindsight-docs/references/
- Add null guard for bankId in Export Template onClick handler
* fix: sync generated files (memory_engine formatting, docs skill references)
* cleanup: remove obsolete migration collision workaround
332 lines
8.5 KiB
Go
332 lines
8.5 KiB
Go
/*
|
|
Hindsight HTTP API
|
|
|
|
HTTP API for Hindsight
|
|
|
|
API version: 0.4.22
|
|
*/
|
|
|
|
// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
|
|
|
|
package hindsight
|
|
|
|
import (
|
|
"encoding/json"
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// checks if the BankTemplateMentalModel type satisfies the MappedNullable interface at compile time
|
|
var _ MappedNullable = &BankTemplateMentalModel{}
|
|
|
|
// BankTemplateMentalModel A mental model definition within a bank template manifest.
|
|
type BankTemplateMentalModel struct {
|
|
// Unique ID for the mental model (alphanumeric lowercase with hyphens)
|
|
Id string `json:"id"`
|
|
// Human-readable name for the mental model
|
|
Name string `json:"name"`
|
|
// The query to run to generate content
|
|
SourceQuery string `json:"source_query"`
|
|
// Tags for scoped visibility
|
|
Tags []string `json:"tags,omitempty"`
|
|
// Maximum tokens for generated content
|
|
MaxTokens *int32 `json:"max_tokens,omitempty"`
|
|
// Trigger settings
|
|
Trigger *MentalModelTriggerOutput `json:"trigger,omitempty"`
|
|
}
|
|
|
|
type _BankTemplateMentalModel BankTemplateMentalModel
|
|
|
|
// NewBankTemplateMentalModel instantiates a new BankTemplateMentalModel object
|
|
// This constructor will assign default values to properties that have it defined,
|
|
// and makes sure properties required by API are set, but the set of arguments
|
|
// will change when the set of required properties is changed
|
|
func NewBankTemplateMentalModel(id string, name string, sourceQuery string) *BankTemplateMentalModel {
|
|
this := BankTemplateMentalModel{}
|
|
this.Id = id
|
|
this.Name = name
|
|
this.SourceQuery = sourceQuery
|
|
var maxTokens int32 = 2048
|
|
this.MaxTokens = &maxTokens
|
|
return &this
|
|
}
|
|
|
|
// NewBankTemplateMentalModelWithDefaults instantiates a new BankTemplateMentalModel object
|
|
// This constructor will only assign default values to properties that have it defined,
|
|
// but it doesn't guarantee that properties required by API are set
|
|
func NewBankTemplateMentalModelWithDefaults() *BankTemplateMentalModel {
|
|
this := BankTemplateMentalModel{}
|
|
var maxTokens int32 = 2048
|
|
this.MaxTokens = &maxTokens
|
|
return &this
|
|
}
|
|
|
|
// GetId returns the Id field value
|
|
func (o *BankTemplateMentalModel) GetId() string {
|
|
if o == nil {
|
|
var ret string
|
|
return ret
|
|
}
|
|
|
|
return o.Id
|
|
}
|
|
|
|
// GetIdOk returns a tuple with the Id field value
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetIdOk() (*string, bool) {
|
|
if o == nil {
|
|
return nil, false
|
|
}
|
|
return &o.Id, true
|
|
}
|
|
|
|
// SetId sets field value
|
|
func (o *BankTemplateMentalModel) SetId(v string) {
|
|
o.Id = v
|
|
}
|
|
|
|
// GetName returns the Name field value
|
|
func (o *BankTemplateMentalModel) GetName() string {
|
|
if o == nil {
|
|
var ret string
|
|
return ret
|
|
}
|
|
|
|
return o.Name
|
|
}
|
|
|
|
// GetNameOk returns a tuple with the Name field value
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetNameOk() (*string, bool) {
|
|
if o == nil {
|
|
return nil, false
|
|
}
|
|
return &o.Name, true
|
|
}
|
|
|
|
// SetName sets field value
|
|
func (o *BankTemplateMentalModel) SetName(v string) {
|
|
o.Name = v
|
|
}
|
|
|
|
// GetSourceQuery returns the SourceQuery field value
|
|
func (o *BankTemplateMentalModel) GetSourceQuery() string {
|
|
if o == nil {
|
|
var ret string
|
|
return ret
|
|
}
|
|
|
|
return o.SourceQuery
|
|
}
|
|
|
|
// GetSourceQueryOk returns a tuple with the SourceQuery field value
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetSourceQueryOk() (*string, bool) {
|
|
if o == nil {
|
|
return nil, false
|
|
}
|
|
return &o.SourceQuery, true
|
|
}
|
|
|
|
// SetSourceQuery sets field value
|
|
func (o *BankTemplateMentalModel) SetSourceQuery(v string) {
|
|
o.SourceQuery = v
|
|
}
|
|
|
|
// GetTags returns the Tags field value if set, zero value otherwise.
|
|
func (o *BankTemplateMentalModel) GetTags() []string {
|
|
if o == nil || IsNil(o.Tags) {
|
|
var ret []string
|
|
return ret
|
|
}
|
|
return o.Tags
|
|
}
|
|
|
|
// GetTagsOk returns a tuple with the Tags field value if set, nil otherwise
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetTagsOk() ([]string, bool) {
|
|
if o == nil || IsNil(o.Tags) {
|
|
return nil, false
|
|
}
|
|
return o.Tags, true
|
|
}
|
|
|
|
// HasTags returns a boolean if a field has been set.
|
|
func (o *BankTemplateMentalModel) HasTags() bool {
|
|
if o != nil && !IsNil(o.Tags) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// SetTags gets a reference to the given []string and assigns it to the Tags field.
|
|
func (o *BankTemplateMentalModel) SetTags(v []string) {
|
|
o.Tags = v
|
|
}
|
|
|
|
// GetMaxTokens returns the MaxTokens field value if set, zero value otherwise.
|
|
func (o *BankTemplateMentalModel) GetMaxTokens() int32 {
|
|
if o == nil || IsNil(o.MaxTokens) {
|
|
var ret int32
|
|
return ret
|
|
}
|
|
return *o.MaxTokens
|
|
}
|
|
|
|
// GetMaxTokensOk returns a tuple with the MaxTokens field value if set, nil otherwise
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetMaxTokensOk() (*int32, bool) {
|
|
if o == nil || IsNil(o.MaxTokens) {
|
|
return nil, false
|
|
}
|
|
return o.MaxTokens, true
|
|
}
|
|
|
|
// HasMaxTokens returns a boolean if a field has been set.
|
|
func (o *BankTemplateMentalModel) HasMaxTokens() bool {
|
|
if o != nil && !IsNil(o.MaxTokens) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// SetMaxTokens gets a reference to the given int32 and assigns it to the MaxTokens field.
|
|
func (o *BankTemplateMentalModel) SetMaxTokens(v int32) {
|
|
o.MaxTokens = &v
|
|
}
|
|
|
|
// GetTrigger returns the Trigger field value if set, zero value otherwise.
|
|
func (o *BankTemplateMentalModel) GetTrigger() MentalModelTriggerOutput {
|
|
if o == nil || IsNil(o.Trigger) {
|
|
var ret MentalModelTriggerOutput
|
|
return ret
|
|
}
|
|
return *o.Trigger
|
|
}
|
|
|
|
// GetTriggerOk returns a tuple with the Trigger field value if set, nil otherwise
|
|
// and a boolean to check if the value has been set.
|
|
func (o *BankTemplateMentalModel) GetTriggerOk() (*MentalModelTriggerOutput, bool) {
|
|
if o == nil || IsNil(o.Trigger) {
|
|
return nil, false
|
|
}
|
|
return o.Trigger, true
|
|
}
|
|
|
|
// HasTrigger returns a boolean if a field has been set.
|
|
func (o *BankTemplateMentalModel) HasTrigger() bool {
|
|
if o != nil && !IsNil(o.Trigger) {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// SetTrigger gets a reference to the given MentalModelTriggerOutput and assigns it to the Trigger field.
|
|
func (o *BankTemplateMentalModel) SetTrigger(v MentalModelTriggerOutput) {
|
|
o.Trigger = &v
|
|
}
|
|
|
|
func (o BankTemplateMentalModel) MarshalJSON() ([]byte, error) {
|
|
toSerialize,err := o.ToMap()
|
|
if err != nil {
|
|
return []byte{}, err
|
|
}
|
|
return json.Marshal(toSerialize)
|
|
}
|
|
|
|
func (o BankTemplateMentalModel) ToMap() (map[string]interface{}, error) {
|
|
toSerialize := map[string]interface{}{}
|
|
toSerialize["id"] = o.Id
|
|
toSerialize["name"] = o.Name
|
|
toSerialize["source_query"] = o.SourceQuery
|
|
if !IsNil(o.Tags) {
|
|
toSerialize["tags"] = o.Tags
|
|
}
|
|
if !IsNil(o.MaxTokens) {
|
|
toSerialize["max_tokens"] = o.MaxTokens
|
|
}
|
|
if !IsNil(o.Trigger) {
|
|
toSerialize["trigger"] = o.Trigger
|
|
}
|
|
return toSerialize, nil
|
|
}
|
|
|
|
func (o *BankTemplateMentalModel) UnmarshalJSON(data []byte) (err error) {
|
|
// This validates that all required properties are included in the JSON object
|
|
// by unmarshalling the object into a generic map with string keys and checking
|
|
// that every required field exists as a key in the generic map.
|
|
requiredProperties := []string{
|
|
"id",
|
|
"name",
|
|
"source_query",
|
|
}
|
|
|
|
allProperties := make(map[string]interface{})
|
|
|
|
err = json.Unmarshal(data, &allProperties)
|
|
|
|
if err != nil {
|
|
return err;
|
|
}
|
|
|
|
for _, requiredProperty := range(requiredProperties) {
|
|
if _, exists := allProperties[requiredProperty]; !exists {
|
|
return fmt.Errorf("no value given for required property %v", requiredProperty)
|
|
}
|
|
}
|
|
|
|
varBankTemplateMentalModel := _BankTemplateMentalModel{}
|
|
|
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
|
decoder.DisallowUnknownFields()
|
|
err = decoder.Decode(&varBankTemplateMentalModel)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*o = BankTemplateMentalModel(varBankTemplateMentalModel)
|
|
|
|
return err
|
|
}
|
|
|
|
type NullableBankTemplateMentalModel struct {
|
|
value *BankTemplateMentalModel
|
|
isSet bool
|
|
}
|
|
|
|
func (v NullableBankTemplateMentalModel) Get() *BankTemplateMentalModel {
|
|
return v.value
|
|
}
|
|
|
|
func (v *NullableBankTemplateMentalModel) Set(val *BankTemplateMentalModel) {
|
|
v.value = val
|
|
v.isSet = true
|
|
}
|
|
|
|
func (v NullableBankTemplateMentalModel) IsSet() bool {
|
|
return v.isSet
|
|
}
|
|
|
|
func (v *NullableBankTemplateMentalModel) Unset() {
|
|
v.value = nil
|
|
v.isSet = false
|
|
}
|
|
|
|
func NewNullableBankTemplateMentalModel(val *BankTemplateMentalModel) *NullableBankTemplateMentalModel {
|
|
return &NullableBankTemplateMentalModel{value: val, isSet: true}
|
|
}
|
|
|
|
func (v NullableBankTemplateMentalModel) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(v.value)
|
|
}
|
|
|
|
func (v *NullableBankTemplateMentalModel) UnmarshalJSON(src []byte) error {
|
|
v.isSet = true
|
|
return json.Unmarshal(src, &v.value)
|
|
}
|
|
|
|
|