@bastani/atomic 0.5.11 → 0.5.12-1
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.
- package/.agents/skills/adapt/SKILL.md +199 -0
- package/.agents/skills/advanced-evaluation/SKILL.md +402 -0
- package/.agents/skills/advanced-evaluation/references/bias-mitigation.md +288 -0
- package/.agents/skills/advanced-evaluation/references/evaluation-pipeline.md +43 -0
- package/.agents/skills/advanced-evaluation/references/implementation-patterns.md +315 -0
- package/.agents/skills/advanced-evaluation/references/metrics-guide.md +331 -0
- package/.agents/skills/advanced-evaluation/scripts/evaluation_example.py +392 -0
- package/.agents/skills/animate/SKILL.md +175 -0
- package/.agents/skills/arrange/SKILL.md +124 -0
- package/.agents/skills/audit/SKILL.md +148 -0
- package/.agents/skills/bdi-mental-states/SKILL.md +311 -0
- package/.agents/skills/bdi-mental-states/references/bdi-ontology-core.md +207 -0
- package/.agents/skills/bdi-mental-states/references/framework-integration.md +582 -0
- package/.agents/skills/bdi-mental-states/references/rdf-examples.md +315 -0
- package/.agents/skills/bdi-mental-states/references/sparql-competency.md +420 -0
- package/.agents/skills/bolder/SKILL.md +117 -0
- package/.agents/skills/bun/SKILL.md +199 -0
- package/.agents/skills/clarify/SKILL.md +183 -0
- package/.agents/skills/colorize/SKILL.md +143 -0
- package/.agents/skills/context-compression/SKILL.md +272 -0
- package/.agents/skills/context-compression/references/evaluation-framework.md +213 -0
- package/.agents/skills/context-compression/scripts/compression_evaluator.py +862 -0
- package/.agents/skills/context-compression/tests/test_compression_evaluator.py +56 -0
- package/.agents/skills/context-degradation/SKILL.md +206 -0
- package/.agents/skills/context-degradation/references/patterns.md +314 -0
- package/.agents/skills/context-degradation/scripts/degradation_detector.py +614 -0
- package/.agents/skills/context-fundamentals/SKILL.md +201 -0
- package/.agents/skills/context-fundamentals/references/context-components.md +283 -0
- package/.agents/skills/context-fundamentals/scripts/context_manager.py +533 -0
- package/.agents/skills/context-optimization/SKILL.md +195 -0
- package/.agents/skills/context-optimization/references/optimization_techniques.md +272 -0
- package/.agents/skills/context-optimization/scripts/compaction.py +562 -0
- package/.agents/skills/create-spec/SKILL.md +244 -0
- package/.agents/skills/critique/SKILL.md +225 -0
- package/.agents/skills/critique/reference/cognitive-load.md +106 -0
- package/.agents/skills/critique/reference/heuristics-scoring.md +234 -0
- package/.agents/skills/critique/reference/personas.md +178 -0
- package/.agents/skills/delight/SKILL.md +304 -0
- package/.agents/skills/distill/SKILL.md +122 -0
- package/.agents/skills/docx/LICENSE.txt +30 -0
- package/.agents/skills/docx/SKILL.md +590 -0
- package/.agents/skills/docx/scripts/__init__.py +1 -0
- package/.agents/skills/docx/scripts/accept_changes.py +135 -0
- package/.agents/skills/docx/scripts/comment.py +318 -0
- package/.agents/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/docx/scripts/office/pack.py +159 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/docx/scripts/office/soffice.py +183 -0
- package/.agents/skills/docx/scripts/office/unpack.py +132 -0
- package/.agents/skills/docx/scripts/office/validate.py +111 -0
- package/.agents/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/docx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/docx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/docx/scripts/templates/comments.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.agents/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/.agents/skills/docx/scripts/templates/people.xml +3 -0
- package/.agents/skills/evaluation/SKILL.md +251 -0
- package/.agents/skills/evaluation/references/metrics.md +339 -0
- package/.agents/skills/evaluation/scripts/evaluator.py +627 -0
- package/.agents/skills/explain-code/SKILL.md +230 -0
- package/.agents/skills/extract/SKILL.md +91 -0
- package/.agents/skills/filesystem-context/SKILL.md +287 -0
- package/.agents/skills/filesystem-context/references/implementation-patterns.md +549 -0
- package/.agents/skills/filesystem-context/scripts/filesystem_context.py +425 -0
- package/.agents/skills/find-skills/SKILL.md +142 -0
- package/.agents/skills/frontend-design/SKILL.md +147 -0
- package/.agents/skills/frontend-design/reference/color-and-contrast.md +132 -0
- package/.agents/skills/frontend-design/reference/interaction-design.md +195 -0
- package/.agents/skills/frontend-design/reference/motion-design.md +99 -0
- package/.agents/skills/frontend-design/reference/responsive-design.md +114 -0
- package/.agents/skills/frontend-design/reference/spatial-design.md +100 -0
- package/.agents/skills/frontend-design/reference/typography.md +133 -0
- package/.agents/skills/frontend-design/reference/ux-writing.md +107 -0
- package/.agents/skills/gh-commit/SKILL.md +243 -0
- package/.agents/skills/gh-create-pr/SKILL.md +93 -0
- package/.agents/skills/harden/SKILL.md +354 -0
- package/.agents/skills/hosted-agents/SKILL.md +260 -0
- package/.agents/skills/hosted-agents/references/infrastructure-patterns.md +700 -0
- package/.agents/skills/hosted-agents/scripts/sandbox_manager.py +590 -0
- package/.agents/skills/impeccable/SKILL.md +365 -0
- package/.agents/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/.agents/skills/impeccable/reference/craft.md +70 -0
- package/.agents/skills/impeccable/reference/extract.md +70 -0
- package/.agents/skills/impeccable/reference/interaction-design.md +195 -0
- package/.agents/skills/impeccable/reference/motion-design.md +99 -0
- package/.agents/skills/impeccable/reference/responsive-design.md +114 -0
- package/.agents/skills/impeccable/reference/spatial-design.md +100 -0
- package/.agents/skills/impeccable/reference/typography.md +142 -0
- package/.agents/skills/impeccable/reference/ux-writing.md +107 -0
- package/.agents/skills/impeccable/scripts/cleanup-deprecated.mjs +214 -0
- package/.agents/skills/init/SKILL.md +138 -0
- package/.agents/skills/layout/SKILL.md +125 -0
- package/.agents/skills/liteparse/SKILL.md +222 -0
- package/.agents/skills/memory-systems/SKILL.md +219 -0
- package/.agents/skills/memory-systems/references/implementation.md +551 -0
- package/.agents/skills/memory-systems/scripts/memory_store.py +616 -0
- package/.agents/skills/multi-agent-patterns/SKILL.md +257 -0
- package/.agents/skills/multi-agent-patterns/references/frameworks.md +433 -0
- package/.agents/skills/multi-agent-patterns/scripts/coordination.py +613 -0
- package/.agents/skills/normalize/SKILL.md +70 -0
- package/.agents/skills/onboard/SKILL.md +245 -0
- package/.agents/skills/opentui/SKILL.md +201 -0
- package/.agents/skills/opentui/references/animation/REFERENCE.md +431 -0
- package/.agents/skills/opentui/references/components/REFERENCE.md +144 -0
- package/.agents/skills/opentui/references/components/code-diff.md +672 -0
- package/.agents/skills/opentui/references/components/containers.md +417 -0
- package/.agents/skills/opentui/references/components/inputs.md +531 -0
- package/.agents/skills/opentui/references/components/text-display.md +386 -0
- package/.agents/skills/opentui/references/core/REFERENCE.md +145 -0
- package/.agents/skills/opentui/references/core/api.md +543 -0
- package/.agents/skills/opentui/references/core/configuration.md +168 -0
- package/.agents/skills/opentui/references/core/gotchas.md +393 -0
- package/.agents/skills/opentui/references/core/patterns.md +449 -0
- package/.agents/skills/opentui/references/keyboard/REFERENCE.md +617 -0
- package/.agents/skills/opentui/references/layout/REFERENCE.md +337 -0
- package/.agents/skills/opentui/references/layout/patterns.md +444 -0
- package/.agents/skills/opentui/references/react/REFERENCE.md +174 -0
- package/.agents/skills/opentui/references/react/api.md +436 -0
- package/.agents/skills/opentui/references/react/configuration.md +302 -0
- package/.agents/skills/opentui/references/react/gotchas.md +443 -0
- package/.agents/skills/opentui/references/react/patterns.md +501 -0
- package/.agents/skills/opentui/references/solid/REFERENCE.md +201 -0
- package/.agents/skills/opentui/references/solid/api.md +564 -0
- package/.agents/skills/opentui/references/solid/configuration.md +316 -0
- package/.agents/skills/opentui/references/solid/gotchas.md +427 -0
- package/.agents/skills/opentui/references/solid/patterns.md +560 -0
- package/.agents/skills/opentui/references/testing/REFERENCE.md +614 -0
- package/.agents/skills/optimize/SKILL.md +266 -0
- package/.agents/skills/overdrive/SKILL.md +142 -0
- package/.agents/skills/pdf/LICENSE.txt +30 -0
- package/.agents/skills/pdf/SKILL.md +314 -0
- package/.agents/skills/pdf/forms.md +294 -0
- package/.agents/skills/pdf/reference.md +612 -0
- package/.agents/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/.agents/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/.agents/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/.agents/skills/pdf/scripts/create_validation_image.py +37 -0
- package/.agents/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/.agents/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/.agents/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/.agents/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/.agents/skills/playwright-cli/SKILL.md +344 -0
- package/.agents/skills/playwright-cli/references/element-attributes.md +23 -0
- package/.agents/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/.agents/skills/playwright-cli/references/request-mocking.md +87 -0
- package/.agents/skills/playwright-cli/references/running-code.md +231 -0
- package/.agents/skills/playwright-cli/references/session-management.md +169 -0
- package/.agents/skills/playwright-cli/references/storage-state.md +275 -0
- package/.agents/skills/playwright-cli/references/test-generation.md +88 -0
- package/.agents/skills/playwright-cli/references/tracing.md +139 -0
- package/.agents/skills/playwright-cli/references/video-recording.md +143 -0
- package/.agents/skills/polish/SKILL.md +224 -0
- package/.agents/skills/pptx/LICENSE.txt +30 -0
- package/.agents/skills/pptx/SKILL.md +232 -0
- package/.agents/skills/pptx/editing.md +205 -0
- package/.agents/skills/pptx/pptxgenjs.md +420 -0
- package/.agents/skills/pptx/scripts/__init__.py +0 -0
- package/.agents/skills/pptx/scripts/add_slide.py +195 -0
- package/.agents/skills/pptx/scripts/clean.py +286 -0
- package/.agents/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/pptx/scripts/office/pack.py +159 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/pptx/scripts/office/soffice.py +183 -0
- package/.agents/skills/pptx/scripts/office/unpack.py +132 -0
- package/.agents/skills/pptx/scripts/office/validate.py +111 -0
- package/.agents/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/pptx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/pptx/scripts/thumbnail.py +289 -0
- package/.agents/skills/project-development/SKILL.md +291 -0
- package/.agents/skills/project-development/references/case-studies.md +388 -0
- package/.agents/skills/project-development/references/pipeline-patterns.md +610 -0
- package/.agents/skills/project-development/scripts/pipeline_template.py +796 -0
- package/.agents/skills/prompt-engineer/SKILL.md +263 -0
- package/.agents/skills/prompt-engineer/references/advanced_patterns.md +271 -0
- package/.agents/skills/prompt-engineer/references/core_prompting.md +137 -0
- package/.agents/skills/prompt-engineer/references/quality_improvement.md +193 -0
- package/.agents/skills/quieter/SKILL.md +103 -0
- package/.agents/skills/research-codebase/SKILL.md +227 -0
- package/.agents/skills/shape/SKILL.md +96 -0
- package/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/.agents/skills/skill-creator/SKILL.md +485 -0
- package/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/.agents/skills/sl-commit/SKILL.md +51 -0
- package/.agents/skills/sl-submit-diff/SKILL.md +55 -0
- package/.agents/skills/teach-impeccable/SKILL.md +71 -0
- package/.agents/skills/test-driven-development/SKILL.md +371 -0
- package/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/.agents/skills/tool-design/SKILL.md +271 -0
- package/.agents/skills/tool-design/references/architectural_reduction.md +210 -0
- package/.agents/skills/tool-design/references/best_practices.md +176 -0
- package/.agents/skills/tool-design/scripts/description_generator.py +528 -0
- package/.agents/skills/typescript-advanced-types/SKILL.md +719 -0
- package/.agents/skills/typescript-expert/SKILL.md +428 -0
- package/.agents/skills/typescript-expert/references/tsconfig-strict.json +92 -0
- package/.agents/skills/typescript-expert/references/typescript-cheatsheet.md +383 -0
- package/.agents/skills/typescript-expert/references/utility-types.ts +335 -0
- package/.agents/skills/typescript-expert/scripts/ts_diagnostic.py +203 -0
- package/.agents/skills/typescript-react-reviewer/SKILL.md +200 -0
- package/.agents/skills/typescript-react-reviewer/references/antipatterns.md +510 -0
- package/.agents/skills/typescript-react-reviewer/references/checklist.md +267 -0
- package/.agents/skills/typescript-react-reviewer/references/react19-patterns.md +305 -0
- package/.agents/skills/typeset/SKILL.md +116 -0
- package/.agents/skills/workflow-creator/SKILL.md +337 -0
- package/.agents/skills/workflow-creator/references/agent-sessions.md +789 -0
- package/.agents/skills/workflow-creator/references/computation-and-validation.md +224 -0
- package/.agents/skills/workflow-creator/references/control-flow.md +450 -0
- package/.agents/skills/workflow-creator/references/discovery-and-verification.md +156 -0
- package/.agents/skills/workflow-creator/references/failure-modes.md +732 -0
- package/.agents/skills/workflow-creator/references/getting-started.md +289 -0
- package/.agents/skills/workflow-creator/references/session-config.md +355 -0
- package/.agents/skills/workflow-creator/references/state-and-data-flow.md +374 -0
- package/.agents/skills/workflow-creator/references/user-input.md +206 -0
- package/.agents/skills/workflow-creator/references/workflow-inputs.md +274 -0
- package/.agents/skills/xlsx/LICENSE.txt +30 -0
- package/.agents/skills/xlsx/SKILL.md +292 -0
- package/.agents/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/.agents/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/.agents/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.agents/skills/xlsx/scripts/office/pack.py +159 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.agents/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.agents/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.agents/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.agents/skills/xlsx/scripts/office/soffice.py +183 -0
- package/.agents/skills/xlsx/scripts/office/unpack.py +132 -0
- package/.agents/skills/xlsx/scripts/office/validate.py +111 -0
- package/.agents/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/.agents/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/.agents/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/.agents/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/.agents/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/.agents/skills/xlsx/scripts/recalc.py +184 -0
- package/.claude/agents/reviewer.md +1 -0
- package/.github/agents/reviewer.md +1 -0
- package/.opencode/agents/reviewer.md +1 -0
- package/README.md +274 -169
- package/package.json +6 -7
- package/src/commands/cli/init/index.ts +2 -2
- package/src/commands/cli/init/scm.ts +7 -8
- package/src/commands/cli/workflow-command.test.ts +74 -0
- package/src/commands/cli/workflow.ts +7 -2
- package/src/scripts/bundle-configs.ts +128 -0
- package/src/sdk/components/compact-switcher.tsx +1 -1
- package/src/sdk/components/orchestrator-panel-store.ts +13 -0
- package/src/sdk/components/orchestrator-panel.tsx +10 -0
- package/src/sdk/components/statusline.tsx +13 -1
- package/src/sdk/components/workflow-picker-panel.tsx +407 -296
- package/src/sdk/providers/claude.ts +50 -0
- package/src/sdk/runtime/executor.ts +111 -32
- package/src/sdk/types.ts +7 -0
- package/src/sdk/workflows/builtin/ralph/claude/index.ts +132 -76
- package/src/sdk/workflows/builtin/ralph/copilot/index.ts +129 -71
- package/src/sdk/workflows/builtin/ralph/helpers/git.ts +184 -17
- package/src/sdk/workflows/builtin/ralph/helpers/prompts.ts +463 -79
- package/src/sdk/workflows/builtin/ralph/opencode/index.ts +124 -80
- package/src/services/system/auto-sync.ts +31 -51
- package/src/services/system/skills.ts +56 -60
- package/dist/lib/path-root-guard.d.ts +0 -4
- package/dist/lib/path-root-guard.d.ts.map +0 -1
- package/dist/sdk/components/color-utils.d.ts +0 -4
- package/dist/sdk/components/color-utils.d.ts.map +0 -1
- package/dist/sdk/components/compact-switcher.d.ts +0 -10
- package/dist/sdk/components/compact-switcher.d.ts.map +0 -1
- package/dist/sdk/components/connectors.d.ts +0 -15
- package/dist/sdk/components/connectors.d.ts.map +0 -1
- package/dist/sdk/components/connectors.test.d.ts +0 -2
- package/dist/sdk/components/connectors.test.d.ts.map +0 -1
- package/dist/sdk/components/edge.d.ts +0 -4
- package/dist/sdk/components/edge.d.ts.map +0 -1
- package/dist/sdk/components/error-boundary.d.ts +0 -23
- package/dist/sdk/components/error-boundary.d.ts.map +0 -1
- package/dist/sdk/components/graph-theme.d.ts +0 -17
- package/dist/sdk/components/graph-theme.d.ts.map +0 -1
- package/dist/sdk/components/header.d.ts +0 -3
- package/dist/sdk/components/header.d.ts.map +0 -1
- package/dist/sdk/components/hooks.d.ts +0 -15
- package/dist/sdk/components/hooks.d.ts.map +0 -1
- package/dist/sdk/components/layout.d.ts +0 -27
- package/dist/sdk/components/layout.d.ts.map +0 -1
- package/dist/sdk/components/layout.test.d.ts +0 -2
- package/dist/sdk/components/layout.test.d.ts.map +0 -1
- package/dist/sdk/components/node-card.d.ts +0 -10
- package/dist/sdk/components/node-card.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-contexts.d.ts +0 -16
- package/dist/sdk/components/orchestrator-panel-contexts.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-store.d.ts +0 -46
- package/dist/sdk/components/orchestrator-panel-store.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-store.test.d.ts +0 -2
- package/dist/sdk/components/orchestrator-panel-store.test.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel-types.d.ts +0 -18
- package/dist/sdk/components/orchestrator-panel-types.d.ts.map +0 -1
- package/dist/sdk/components/orchestrator-panel.d.ts +0 -52
- package/dist/sdk/components/orchestrator-panel.d.ts.map +0 -1
- package/dist/sdk/components/session-graph-panel.d.ts +0 -7
- package/dist/sdk/components/session-graph-panel.d.ts.map +0 -1
- package/dist/sdk/components/status-helpers.d.ts +0 -6
- package/dist/sdk/components/status-helpers.d.ts.map +0 -1
- package/dist/sdk/components/statusline.d.ts +0 -7
- package/dist/sdk/components/statusline.d.ts.map +0 -1
- package/dist/sdk/components/workflow-picker-panel.d.ts +0 -123
- package/dist/sdk/components/workflow-picker-panel.d.ts.map +0 -1
- package/dist/sdk/define-workflow.d.ts +0 -78
- package/dist/sdk/define-workflow.d.ts.map +0 -1
- package/dist/sdk/define-workflow.test.d.ts +0 -2
- package/dist/sdk/define-workflow.test.d.ts.map +0 -1
- package/dist/sdk/errors.d.ts +0 -24
- package/dist/sdk/errors.d.ts.map +0 -1
- package/dist/sdk/errors.test.d.ts +0 -2
- package/dist/sdk/errors.test.d.ts.map +0 -1
- package/dist/sdk/index.d.ts +0 -13
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/providers/claude.d.ts +0 -170
- package/dist/sdk/providers/claude.d.ts.map +0 -1
- package/dist/sdk/providers/copilot.d.ts +0 -11
- package/dist/sdk/providers/copilot.d.ts.map +0 -1
- package/dist/sdk/providers/opencode.d.ts +0 -11
- package/dist/sdk/providers/opencode.d.ts.map +0 -1
- package/dist/sdk/runtime/discovery.d.ts +0 -86
- package/dist/sdk/runtime/discovery.d.ts.map +0 -1
- package/dist/sdk/runtime/executor-entry.d.ts +0 -11
- package/dist/sdk/runtime/executor-entry.d.ts.map +0 -1
- package/dist/sdk/runtime/executor.d.ts +0 -72
- package/dist/sdk/runtime/executor.d.ts.map +0 -1
- package/dist/sdk/runtime/executor.test.d.ts +0 -2
- package/dist/sdk/runtime/executor.test.d.ts.map +0 -1
- package/dist/sdk/runtime/graph-inference.d.ts +0 -35
- package/dist/sdk/runtime/graph-inference.d.ts.map +0 -1
- package/dist/sdk/runtime/loader.d.ts +0 -70
- package/dist/sdk/runtime/loader.d.ts.map +0 -1
- package/dist/sdk/runtime/panel.d.ts +0 -9
- package/dist/sdk/runtime/panel.d.ts.map +0 -1
- package/dist/sdk/runtime/theme.d.ts +0 -28
- package/dist/sdk/runtime/theme.d.ts.map +0 -1
- package/dist/sdk/runtime/tmux.d.ts +0 -297
- package/dist/sdk/runtime/tmux.d.ts.map +0 -1
- package/dist/sdk/types.d.ts +0 -295
- package/dist/sdk/types.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts +0 -62
- package/dist/sdk/workflows/builtin/deep-research-codebase/claude/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts +0 -46
- package/dist/sdk/workflows/builtin/deep-research-codebase/copilot/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts +0 -26
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/heuristic.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts +0 -92
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/prompts.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts +0 -57
- package/dist/sdk/workflows/builtin/deep-research-codebase/helpers/scout.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts +0 -49
- package/dist/sdk/workflows/builtin/deep-research-codebase/opencode/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/claude/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/copilot/index.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts +0 -17
- package/dist/sdk/workflows/builtin/ralph/helpers/git.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts +0 -119
- package/dist/sdk/workflows/builtin/ralph/helpers/prompts.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts +0 -20
- package/dist/sdk/workflows/builtin/ralph/helpers/review.d.ts.map +0 -1
- package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts +0 -14
- package/dist/sdk/workflows/builtin/ralph/opencode/index.d.ts.map +0 -1
- package/dist/sdk/workflows/index.d.ts +0 -24
- package/dist/sdk/workflows/index.d.ts.map +0 -1
- package/dist/services/config/definitions.d.ts +0 -85
- package/dist/services/config/definitions.d.ts.map +0 -1
- package/dist/services/system/copy.d.ts +0 -77
- package/dist/services/system/copy.d.ts.map +0 -1
- package/dist/services/system/detect.d.ts +0 -75
- package/dist/services/system/detect.d.ts.map +0 -1
- package/tsconfig.json +0 -33
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
"""Memory System Implementation.
|
|
2
|
+
|
|
3
|
+
Provides composable building blocks for agent memory: vector stores with
|
|
4
|
+
metadata indexing, property graphs for entity relationships, and temporal
|
|
5
|
+
knowledge graphs for facts that change over time.
|
|
6
|
+
|
|
7
|
+
Use when:
|
|
8
|
+
- Building a memory persistence layer for an agent that must retain
|
|
9
|
+
knowledge across sessions.
|
|
10
|
+
- Prototyping memory architectures before committing to a production
|
|
11
|
+
framework (Mem0, Zep/Graphiti, Letta, Cognee).
|
|
12
|
+
- Combining semantic search with graph-based entity retrieval in a
|
|
13
|
+
single integrated system.
|
|
14
|
+
|
|
15
|
+
Typical usage::
|
|
16
|
+
|
|
17
|
+
from memory_store import IntegratedMemorySystem
|
|
18
|
+
mem = IntegratedMemorySystem()
|
|
19
|
+
mem.start_session("session-001")
|
|
20
|
+
mem.store_fact("Alice prefers dark mode", entity="Alice")
|
|
21
|
+
results = mem.retrieve_memories("theme preference")
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
from typing import Any, Dict, List, Optional
|
|
28
|
+
|
|
29
|
+
import numpy as np
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"VectorStore",
|
|
33
|
+
"PropertyGraph",
|
|
34
|
+
"TemporalKnowledgeGraph",
|
|
35
|
+
"IntegratedMemorySystem",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class VectorStore:
|
|
40
|
+
"""Simple vector store with metadata indexing.
|
|
41
|
+
|
|
42
|
+
Use when: the agent needs semantic similarity search over stored facts
|
|
43
|
+
with optional entity and temporal filtering.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, dimension: int = 768) -> None:
|
|
47
|
+
self.dimension: int = dimension
|
|
48
|
+
self.vectors: List[np.ndarray] = []
|
|
49
|
+
self.metadata: List[Dict[str, Any]] = []
|
|
50
|
+
self.entity_index: Dict[str, List[int]] = {}
|
|
51
|
+
self.time_index: Dict[str, List[int]] = {}
|
|
52
|
+
|
|
53
|
+
def add(self, text: str, metadata: Optional[Dict[str, Any]] = None) -> int:
|
|
54
|
+
"""Add document to store.
|
|
55
|
+
|
|
56
|
+
Use when: persisting a new fact or observation that the agent should
|
|
57
|
+
be able to retrieve later via semantic search.
|
|
58
|
+
"""
|
|
59
|
+
metadata = metadata or {}
|
|
60
|
+
embedding: np.ndarray = self._embed(text)
|
|
61
|
+
index: int = len(self.vectors)
|
|
62
|
+
|
|
63
|
+
self.vectors.append(embedding)
|
|
64
|
+
self.metadata.append(metadata)
|
|
65
|
+
|
|
66
|
+
# Index by entity
|
|
67
|
+
if "entity" in metadata:
|
|
68
|
+
entity: str = metadata["entity"]
|
|
69
|
+
if entity not in self.entity_index:
|
|
70
|
+
self.entity_index[entity] = []
|
|
71
|
+
self.entity_index[entity].append(index)
|
|
72
|
+
|
|
73
|
+
# Index by time
|
|
74
|
+
if "valid_from" in metadata:
|
|
75
|
+
time_key: str = self._time_key(metadata["valid_from"])
|
|
76
|
+
if time_key not in self.time_index:
|
|
77
|
+
self.time_index[time_key] = []
|
|
78
|
+
self.time_index[time_key].append(index)
|
|
79
|
+
|
|
80
|
+
return index
|
|
81
|
+
|
|
82
|
+
def search(
|
|
83
|
+
self,
|
|
84
|
+
query: str,
|
|
85
|
+
limit: int = 5,
|
|
86
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
87
|
+
) -> List[Dict[str, Any]]:
|
|
88
|
+
"""Search for similar documents.
|
|
89
|
+
|
|
90
|
+
Use when: retrieving memories relevant to a query, optionally
|
|
91
|
+
narrowed by metadata filters (entity, session, time range).
|
|
92
|
+
"""
|
|
93
|
+
query_embedding: np.ndarray = self._embed(query)
|
|
94
|
+
|
|
95
|
+
scores: List[tuple[int, float]] = []
|
|
96
|
+
for i, vec in enumerate(self.vectors):
|
|
97
|
+
score: float = float(
|
|
98
|
+
np.dot(query_embedding, vec)
|
|
99
|
+
/ (np.linalg.norm(query_embedding) * np.linalg.norm(vec) + 1e-8)
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Apply filters
|
|
103
|
+
if filters and not self._matches_filters(self.metadata[i], filters):
|
|
104
|
+
score = -1.0
|
|
105
|
+
|
|
106
|
+
scores.append((i, score))
|
|
107
|
+
|
|
108
|
+
scores.sort(key=lambda x: x[1], reverse=True)
|
|
109
|
+
|
|
110
|
+
results: List[Dict[str, Any]] = []
|
|
111
|
+
for idx, score in scores[:limit]:
|
|
112
|
+
if score > 0:
|
|
113
|
+
results.append(
|
|
114
|
+
{
|
|
115
|
+
"index": idx,
|
|
116
|
+
"score": score,
|
|
117
|
+
"text": self.metadata[idx].get("text", ""),
|
|
118
|
+
"metadata": self.metadata[idx],
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return results
|
|
123
|
+
|
|
124
|
+
def search_by_entity(
|
|
125
|
+
self, entity: str, query: str = "", limit: int = 5
|
|
126
|
+
) -> List[Dict[str, Any]]:
|
|
127
|
+
"""Search within specific entity.
|
|
128
|
+
|
|
129
|
+
Use when: the agent needs all memories associated with a known
|
|
130
|
+
entity, optionally ranked by relevance to a query.
|
|
131
|
+
"""
|
|
132
|
+
indices: List[int] = self.entity_index.get(entity, [])
|
|
133
|
+
|
|
134
|
+
if not indices:
|
|
135
|
+
return []
|
|
136
|
+
|
|
137
|
+
if query:
|
|
138
|
+
query_embedding: np.ndarray = self._embed(query)
|
|
139
|
+
scored: List[tuple[int, float, Dict[str, Any]]] = []
|
|
140
|
+
for i in indices:
|
|
141
|
+
vec: np.ndarray = self.vectors[i]
|
|
142
|
+
score: float = float(
|
|
143
|
+
np.dot(query_embedding, vec)
|
|
144
|
+
/ (np.linalg.norm(query_embedding) * np.linalg.norm(vec) + 1e-8)
|
|
145
|
+
)
|
|
146
|
+
scored.append((i, score, self.metadata[i]))
|
|
147
|
+
|
|
148
|
+
scored.sort(key=lambda x: x[1], reverse=True)
|
|
149
|
+
return [
|
|
150
|
+
{"index": i, "score": s, "metadata": m}
|
|
151
|
+
for i, s, m in scored[:limit]
|
|
152
|
+
]
|
|
153
|
+
else:
|
|
154
|
+
return [
|
|
155
|
+
{"index": i, "score": 1.0, "metadata": self.metadata[i]}
|
|
156
|
+
for i in indices[:limit]
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
def _embed(self, text: str) -> np.ndarray:
|
|
160
|
+
"""Generate embedding for text.
|
|
161
|
+
|
|
162
|
+
In production, replace with an actual embedding model. This
|
|
163
|
+
deterministic stub uses the text hash as a random seed so that
|
|
164
|
+
identical texts always produce identical vectors. Uses a local
|
|
165
|
+
RNG to avoid corrupting global numpy random state.
|
|
166
|
+
"""
|
|
167
|
+
rng = np.random.default_rng(hash(text) % (2**32))
|
|
168
|
+
return rng.standard_normal(self.dimension)
|
|
169
|
+
|
|
170
|
+
def _time_key(self, timestamp: Any) -> str:
|
|
171
|
+
"""Create time key for indexing."""
|
|
172
|
+
if isinstance(timestamp, datetime):
|
|
173
|
+
return timestamp.strftime("%Y-%m")
|
|
174
|
+
return str(timestamp)
|
|
175
|
+
|
|
176
|
+
def _matches_filters(self, metadata: Dict[str, Any], filters: Dict[str, Any]) -> bool:
|
|
177
|
+
"""Check if metadata matches filters."""
|
|
178
|
+
for key, value in filters.items():
|
|
179
|
+
if key not in metadata:
|
|
180
|
+
return False
|
|
181
|
+
if isinstance(value, list):
|
|
182
|
+
if metadata[key] not in value:
|
|
183
|
+
return False
|
|
184
|
+
elif metadata[key] != value:
|
|
185
|
+
return False
|
|
186
|
+
return True
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class PropertyGraph:
|
|
190
|
+
"""Simple property graph storage.
|
|
191
|
+
|
|
192
|
+
Use when: the agent needs to maintain entity relationships and
|
|
193
|
+
traverse connections between nodes (e.g., "find all projects
|
|
194
|
+
associated with this user").
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
def __init__(self) -> None:
|
|
198
|
+
self.nodes: Dict[str, Dict[str, Any]] = {}
|
|
199
|
+
self.edges: Dict[str, Dict[str, Any]] = {}
|
|
200
|
+
self.entity_registry: Dict[str, str] = {} # name -> node_id
|
|
201
|
+
self.node_index: Dict[str, List[str]] = {} # label -> node_ids
|
|
202
|
+
self.edge_index: Dict[str, List[str]] = {} # type -> edge_ids
|
|
203
|
+
|
|
204
|
+
def get_or_create_node(
|
|
205
|
+
self, name: str, label: str = "Entity", properties: Optional[Dict[str, Any]] = None
|
|
206
|
+
) -> str:
|
|
207
|
+
"""Get existing node by name, or create a new one.
|
|
208
|
+
|
|
209
|
+
Use when: storing an entity that may already exist. The entity
|
|
210
|
+
registry ensures identity is maintained across interactions
|
|
211
|
+
("John Doe" always maps to the same node).
|
|
212
|
+
"""
|
|
213
|
+
if name in self.entity_registry:
|
|
214
|
+
node_id: str = self.entity_registry[name]
|
|
215
|
+
if properties:
|
|
216
|
+
self.nodes[node_id]["properties"].update(properties)
|
|
217
|
+
return node_id
|
|
218
|
+
node_id = self.create_node(label, {**(properties or {}), "name": name})
|
|
219
|
+
self.entity_registry[name] = node_id
|
|
220
|
+
return node_id
|
|
221
|
+
|
|
222
|
+
def create_node(self, label: str, properties: Optional[Dict[str, Any]] = None) -> str:
|
|
223
|
+
"""Create node with label and properties.
|
|
224
|
+
|
|
225
|
+
Use when: adding a new entity to the graph that does not need
|
|
226
|
+
identity deduplication (prefer get_or_create_node otherwise).
|
|
227
|
+
"""
|
|
228
|
+
node_id: str = hashlib.md5(f"{label}{datetime.now().isoformat()}".encode()).hexdigest()[:16]
|
|
229
|
+
|
|
230
|
+
self.nodes[node_id] = {
|
|
231
|
+
"id": node_id,
|
|
232
|
+
"label": label,
|
|
233
|
+
"properties": properties or {},
|
|
234
|
+
"created_at": datetime.now().isoformat(),
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if label not in self.node_index:
|
|
238
|
+
self.node_index[label] = []
|
|
239
|
+
self.node_index[label].append(node_id)
|
|
240
|
+
|
|
241
|
+
return node_id
|
|
242
|
+
|
|
243
|
+
def create_relationship(
|
|
244
|
+
self,
|
|
245
|
+
source_id: str,
|
|
246
|
+
rel_type: str,
|
|
247
|
+
target_id: str,
|
|
248
|
+
properties: Optional[Dict[str, Any]] = None,
|
|
249
|
+
) -> str:
|
|
250
|
+
"""Create directed relationship between nodes.
|
|
251
|
+
|
|
252
|
+
Use when: recording a connection between two entities (e.g.,
|
|
253
|
+
WORKS_AT, LIVES_IN, DEPENDS_ON).
|
|
254
|
+
"""
|
|
255
|
+
if source_id not in self.nodes:
|
|
256
|
+
raise ValueError(f"Unknown source node: {source_id}")
|
|
257
|
+
if target_id not in self.nodes:
|
|
258
|
+
raise ValueError(f"Unknown target node: {target_id}")
|
|
259
|
+
|
|
260
|
+
edge_id: str = hashlib.md5(
|
|
261
|
+
f"{source_id}{rel_type}{target_id}{datetime.now().isoformat()}".encode()
|
|
262
|
+
).hexdigest()[:16]
|
|
263
|
+
|
|
264
|
+
self.edges[edge_id] = {
|
|
265
|
+
"id": edge_id,
|
|
266
|
+
"source": source_id,
|
|
267
|
+
"target": target_id,
|
|
268
|
+
"type": rel_type,
|
|
269
|
+
"properties": properties or {},
|
|
270
|
+
"created_at": datetime.now().isoformat(),
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if rel_type not in self.edge_index:
|
|
274
|
+
self.edge_index[rel_type] = []
|
|
275
|
+
self.edge_index[rel_type].append(edge_id)
|
|
276
|
+
|
|
277
|
+
return edge_id
|
|
278
|
+
|
|
279
|
+
def query(self, pattern: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
280
|
+
"""Query graph with simple pattern matching.
|
|
281
|
+
|
|
282
|
+
Use when: finding relationships that match a structural pattern
|
|
283
|
+
(e.g., all WORKS_AT edges from Person nodes).
|
|
284
|
+
"""
|
|
285
|
+
results: List[Dict[str, Any]] = []
|
|
286
|
+
|
|
287
|
+
# Match by edge type
|
|
288
|
+
if "type" in pattern:
|
|
289
|
+
edge_ids: List[str] = self.edge_index.get(pattern["type"], [])
|
|
290
|
+
for eid in edge_ids:
|
|
291
|
+
edge: Dict[str, Any] = self.edges[eid]
|
|
292
|
+
source: Dict[str, Any] = self.nodes.get(edge["source"], {})
|
|
293
|
+
target: Dict[str, Any] = self.nodes.get(edge["target"], {})
|
|
294
|
+
|
|
295
|
+
# Match source label
|
|
296
|
+
if "source_label" in pattern:
|
|
297
|
+
if source.get("label") != pattern["source_label"]:
|
|
298
|
+
continue
|
|
299
|
+
|
|
300
|
+
# Match target label
|
|
301
|
+
if "target_label" in pattern:
|
|
302
|
+
if target.get("label") != pattern["target_label"]:
|
|
303
|
+
continue
|
|
304
|
+
|
|
305
|
+
results.append({"source": source, "edge": edge, "target": target})
|
|
306
|
+
|
|
307
|
+
return results
|
|
308
|
+
|
|
309
|
+
def get_node(self, node_id: str) -> Optional[Dict[str, Any]]:
|
|
310
|
+
"""Get node by ID."""
|
|
311
|
+
return self.nodes.get(node_id)
|
|
312
|
+
|
|
313
|
+
def get_relationships(
|
|
314
|
+
self, node_id: str, direction: str = "both"
|
|
315
|
+
) -> List[Dict[str, Any]]:
|
|
316
|
+
"""Get relationships for a node.
|
|
317
|
+
|
|
318
|
+
Use when: retrieving all connections for a given entity to build
|
|
319
|
+
a complete entity context.
|
|
320
|
+
"""
|
|
321
|
+
relationships: List[Dict[str, Any]] = []
|
|
322
|
+
|
|
323
|
+
for edge in self.edges.values():
|
|
324
|
+
if direction in ["outgoing", "both"] and edge["source"] == node_id:
|
|
325
|
+
relationships.append(
|
|
326
|
+
{
|
|
327
|
+
"edge": edge,
|
|
328
|
+
"target": self.nodes.get(edge["target"]),
|
|
329
|
+
"direction": "outgoing",
|
|
330
|
+
}
|
|
331
|
+
)
|
|
332
|
+
if direction in ["incoming", "both"] and edge["target"] == node_id:
|
|
333
|
+
relationships.append(
|
|
334
|
+
{
|
|
335
|
+
"edge": edge,
|
|
336
|
+
"source": self.nodes.get(edge["source"]),
|
|
337
|
+
"direction": "incoming",
|
|
338
|
+
}
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
return relationships
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class TemporalKnowledgeGraph(PropertyGraph):
|
|
345
|
+
"""Property graph with temporal validity for facts.
|
|
346
|
+
|
|
347
|
+
Use when: the agent must track facts that change over time and
|
|
348
|
+
answer time-scoped queries (e.g., "where did the user live in
|
|
349
|
+
March 2024?").
|
|
350
|
+
"""
|
|
351
|
+
|
|
352
|
+
def create_temporal_relationship(
|
|
353
|
+
self,
|
|
354
|
+
source_id: str,
|
|
355
|
+
rel_type: str,
|
|
356
|
+
target_id: str,
|
|
357
|
+
valid_from: datetime,
|
|
358
|
+
valid_until: Optional[datetime] = None,
|
|
359
|
+
properties: Optional[Dict[str, Any]] = None,
|
|
360
|
+
) -> str:
|
|
361
|
+
"""Create relationship with temporal validity.
|
|
362
|
+
|
|
363
|
+
Use when: recording a fact that has a known start time and
|
|
364
|
+
may expire (e.g., employment, address, subscription status).
|
|
365
|
+
"""
|
|
366
|
+
edge_id: str = super().create_relationship(
|
|
367
|
+
source_id, rel_type, target_id, properties
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
# Add temporal properties
|
|
371
|
+
self.edges[edge_id]["valid_from"] = valid_from.isoformat()
|
|
372
|
+
self.edges[edge_id]["valid_until"] = (
|
|
373
|
+
valid_until.isoformat() if valid_until else None
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
return edge_id
|
|
377
|
+
|
|
378
|
+
def query_at_time(
|
|
379
|
+
self, query: Dict[str, Any], query_time: datetime
|
|
380
|
+
) -> List[Dict[str, Any]]:
|
|
381
|
+
"""Query graph state at specific time.
|
|
382
|
+
|
|
383
|
+
Use when: answering point-in-time questions about entities
|
|
384
|
+
(e.g., "what was true on date X?").
|
|
385
|
+
"""
|
|
386
|
+
results: List[Dict[str, Any]] = []
|
|
387
|
+
|
|
388
|
+
# Get base query results
|
|
389
|
+
base_results: List[Dict[str, Any]] = self.query(query)
|
|
390
|
+
|
|
391
|
+
for result in base_results:
|
|
392
|
+
edge: Dict[str, Any] = result["edge"]
|
|
393
|
+
valid_from: datetime = datetime.fromisoformat(
|
|
394
|
+
edge.get("valid_from", "1970-01-01")
|
|
395
|
+
)
|
|
396
|
+
valid_until: Optional[str] = edge.get("valid_until")
|
|
397
|
+
|
|
398
|
+
# Check temporal validity
|
|
399
|
+
if valid_from <= query_time:
|
|
400
|
+
if valid_until is None or datetime.fromisoformat(valid_until) > query_time:
|
|
401
|
+
results.append(
|
|
402
|
+
{
|
|
403
|
+
**result,
|
|
404
|
+
"valid_from": valid_from,
|
|
405
|
+
"valid_until": valid_until,
|
|
406
|
+
}
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
return results
|
|
410
|
+
|
|
411
|
+
def query_time_range(
|
|
412
|
+
self,
|
|
413
|
+
query: Dict[str, Any],
|
|
414
|
+
start_time: datetime,
|
|
415
|
+
end_time: datetime,
|
|
416
|
+
) -> List[Dict[str, Any]]:
|
|
417
|
+
"""Query facts valid during time range.
|
|
418
|
+
|
|
419
|
+
Use when: retrieving all facts that overlap with a given time
|
|
420
|
+
window (e.g., "what changed between January and June?").
|
|
421
|
+
"""
|
|
422
|
+
results: List[Dict[str, Any]] = []
|
|
423
|
+
|
|
424
|
+
base_results: List[Dict[str, Any]] = self.query(query)
|
|
425
|
+
|
|
426
|
+
for result in base_results:
|
|
427
|
+
edge: Dict[str, Any] = result["edge"]
|
|
428
|
+
valid_from: datetime = datetime.fromisoformat(
|
|
429
|
+
edge.get("valid_from", "1970-01-01")
|
|
430
|
+
)
|
|
431
|
+
valid_until: Optional[str] = edge.get("valid_until")
|
|
432
|
+
|
|
433
|
+
# Check if overlaps with query range
|
|
434
|
+
until_dt: datetime = (
|
|
435
|
+
datetime.fromisoformat(valid_until) if valid_until else datetime.max
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
if until_dt >= start_time and valid_from <= end_time:
|
|
439
|
+
results.append(
|
|
440
|
+
{
|
|
441
|
+
**result,
|
|
442
|
+
"valid_from": valid_from,
|
|
443
|
+
"valid_until": valid_until,
|
|
444
|
+
}
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
return results
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
# ---------------------------------------------------------------------------
|
|
451
|
+
# Memory System Integration
|
|
452
|
+
# ---------------------------------------------------------------------------
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
class IntegratedMemorySystem:
|
|
456
|
+
"""Integrated memory system combining vector store and graph.
|
|
457
|
+
|
|
458
|
+
Use when: the agent needs both semantic search over facts and
|
|
459
|
+
graph-based entity relationship traversal in a single unified
|
|
460
|
+
interface. This class composes VectorStore and TemporalKnowledgeGraph,
|
|
461
|
+
enriching vector search results with graph context.
|
|
462
|
+
"""
|
|
463
|
+
|
|
464
|
+
def __init__(self) -> None:
|
|
465
|
+
self.vector_store: VectorStore = VectorStore()
|
|
466
|
+
self.graph: TemporalKnowledgeGraph = TemporalKnowledgeGraph()
|
|
467
|
+
self.session_id: str = ""
|
|
468
|
+
|
|
469
|
+
def start_session(self, session_id: str) -> None:
|
|
470
|
+
"""Start a new memory session.
|
|
471
|
+
|
|
472
|
+
Use when: beginning a new conversation or task that should
|
|
473
|
+
scope its memories to a distinct session identifier.
|
|
474
|
+
"""
|
|
475
|
+
self.session_id = session_id
|
|
476
|
+
|
|
477
|
+
def store_fact(
|
|
478
|
+
self,
|
|
479
|
+
fact: str,
|
|
480
|
+
entity: str,
|
|
481
|
+
timestamp: Optional[datetime] = None,
|
|
482
|
+
relationships: Optional[List[Dict[str, Any]]] = None,
|
|
483
|
+
) -> None:
|
|
484
|
+
"""Store a fact with entity and relationships.
|
|
485
|
+
|
|
486
|
+
Use when: the agent observes a new piece of information that
|
|
487
|
+
should be persisted for future retrieval. Stores in both the
|
|
488
|
+
vector store (for semantic search) and the graph (for entity
|
|
489
|
+
traversal).
|
|
490
|
+
"""
|
|
491
|
+
# Store in vector store
|
|
492
|
+
self.vector_store.add(
|
|
493
|
+
fact,
|
|
494
|
+
{
|
|
495
|
+
"text": fact,
|
|
496
|
+
"entity": entity,
|
|
497
|
+
"valid_from": (timestamp or datetime.now()).isoformat(),
|
|
498
|
+
"session_id": self.session_id,
|
|
499
|
+
},
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
# Get or create entity node (uses registry for identity)
|
|
503
|
+
entity_node_id: str = self.graph.get_or_create_node(entity)
|
|
504
|
+
|
|
505
|
+
# Create relationships
|
|
506
|
+
if relationships:
|
|
507
|
+
for rel in relationships:
|
|
508
|
+
target_node_id: str = self.graph.get_or_create_node(rel["target"])
|
|
509
|
+
self.graph.create_relationship(
|
|
510
|
+
entity_node_id,
|
|
511
|
+
rel["type"],
|
|
512
|
+
target_node_id,
|
|
513
|
+
properties=rel.get("properties", {}),
|
|
514
|
+
)
|
|
515
|
+
|
|
516
|
+
def retrieve_memories(
|
|
517
|
+
self,
|
|
518
|
+
query: str,
|
|
519
|
+
entity_filter: Optional[str] = None,
|
|
520
|
+
time_filter: Optional[Dict[str, Any]] = None,
|
|
521
|
+
limit: int = 5,
|
|
522
|
+
) -> List[Dict[str, Any]]:
|
|
523
|
+
"""Retrieve memories matching query.
|
|
524
|
+
|
|
525
|
+
Use when: the agent needs to recall previously stored facts,
|
|
526
|
+
optionally filtered by entity or time. Results are enriched
|
|
527
|
+
with graph relationships for each matched entity.
|
|
528
|
+
"""
|
|
529
|
+
# Vector search
|
|
530
|
+
filters: Dict[str, Any] = {"session_id": self.session_id}
|
|
531
|
+
if entity_filter:
|
|
532
|
+
filters["entity"] = entity_filter
|
|
533
|
+
|
|
534
|
+
results: List[Dict[str, Any]] = self.vector_store.search(
|
|
535
|
+
query, limit=limit, filters=filters
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
# Enrich with graph relationships
|
|
539
|
+
for result in results:
|
|
540
|
+
entity: Optional[str] = result["metadata"].get("entity")
|
|
541
|
+
if entity:
|
|
542
|
+
node_id: Optional[str] = self.graph.entity_registry.get(entity)
|
|
543
|
+
if node_id:
|
|
544
|
+
result["relationships"] = self.graph.get_relationships(node_id)
|
|
545
|
+
|
|
546
|
+
return results
|
|
547
|
+
|
|
548
|
+
def retrieve_entity_context(self, entity: str) -> Dict[str, Any]:
|
|
549
|
+
"""Retrieve complete context for an entity.
|
|
550
|
+
|
|
551
|
+
Use when: the agent needs a full picture of a single entity
|
|
552
|
+
including its properties, all relationships, and associated
|
|
553
|
+
vector memories.
|
|
554
|
+
"""
|
|
555
|
+
node_id: Optional[str] = self.graph.entity_registry.get(entity)
|
|
556
|
+
|
|
557
|
+
# Get entity node
|
|
558
|
+
entity_node: Optional[Dict[str, Any]] = (
|
|
559
|
+
self.graph.get_node(node_id) if node_id else None
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
# Get relationships
|
|
563
|
+
relationships: List[Dict[str, Any]] = (
|
|
564
|
+
self.graph.get_relationships(node_id) if node_id else []
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
# Get vector memories
|
|
568
|
+
memories: List[Dict[str, Any]] = self.vector_store.search_by_entity(
|
|
569
|
+
entity, limit=10
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
return {
|
|
573
|
+
"entity": entity_node,
|
|
574
|
+
"relationships": relationships,
|
|
575
|
+
"memories": memories,
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
def consolidate(self) -> None:
|
|
579
|
+
"""Consolidate memories and remove outdated information.
|
|
580
|
+
|
|
581
|
+
Use when: memory count exceeds a threshold, retrieval quality
|
|
582
|
+
degrades, or on a scheduled interval. In production, implement:
|
|
583
|
+
- Merge related facts into summaries
|
|
584
|
+
- Update validity periods on stale entries
|
|
585
|
+
- Archive obsolete facts (invalidate, do not discard)
|
|
586
|
+
"""
|
|
587
|
+
pass
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
if __name__ == "__main__":
|
|
591
|
+
# Quick smoke test demonstrating the integrated memory system.
|
|
592
|
+
mem = IntegratedMemorySystem()
|
|
593
|
+
mem.start_session("demo-session")
|
|
594
|
+
|
|
595
|
+
# Store facts with entity relationships
|
|
596
|
+
mem.store_fact(
|
|
597
|
+
"Alice prefers dark mode",
|
|
598
|
+
entity="Alice",
|
|
599
|
+
relationships=[{"target": "dark mode", "type": "PREFERS"}],
|
|
600
|
+
)
|
|
601
|
+
mem.store_fact(
|
|
602
|
+
"Alice works at Acme Corp",
|
|
603
|
+
entity="Alice",
|
|
604
|
+
relationships=[{"target": "Acme Corp", "type": "WORKS_AT"}],
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
# Semantic retrieval
|
|
608
|
+
results = mem.retrieve_memories("theme preference")
|
|
609
|
+
print(f"Search results: {len(results)} memories found")
|
|
610
|
+
for r in results:
|
|
611
|
+
print(f" score={r['score']:.3f} text={r['text']}")
|
|
612
|
+
|
|
613
|
+
# Entity context
|
|
614
|
+
context = mem.retrieve_entity_context("Alice")
|
|
615
|
+
print(f"\nAlice context: {len(context['relationships'])} relationships, "
|
|
616
|
+
f"{len(context['memories'])} memories")
|