superlocalmemory 3.7.7 → 3.8.0
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/.claude-plugin/marketplace.json +1 -1
- package/ATTRIBUTION.md +1 -3
- package/CHANGELOG.md +85 -0
- package/README.md +199 -29
- package/package.json +4 -2
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/CLAUDE.md +8 -8
- package/plugin/agents/slm-governance-advisor.md +80 -0
- package/plugin/agents/slm-loop-runner.md +71 -0
- package/plugin/agents/slm-memory-advisor.md +10 -5
- package/plugin/agents/slm-optimize-advisor.md +9 -3
- package/plugin/commands/slm-loop.md +31 -0
- package/plugin/hooks/hooks.json +79 -0
- package/plugin/requirements.txt +1 -1
- package/plugin/scripts/slm-launch +46 -7
- package/plugin/settings.json +9 -0
- package/plugin/skills/slm-cache/SKILL.md +9 -1
- package/plugin/skills/slm-compress/SKILL.md +8 -1
- package/plugin/skills/slm-governance/SKILL.md +248 -0
- package/plugin/skills/slm-graph/SKILL.md +17 -3
- package/plugin/skills/slm-loop/SKILL.md +99 -0
- package/plugin/skills/slm-mesh/SKILL.md +282 -0
- package/plugin/skills/slm-profile/SKILL.md +148 -0
- package/plugin/skills/slm-recall/SKILL.md +46 -10
- package/plugin/skills/slm-remember/SKILL.md +48 -1
- package/plugin/skills/slm-scope/SKILL.md +176 -0
- package/plugin/skills/slm-session/SKILL.md +24 -1
- package/plugin/skills/slm-status/SKILL.md +18 -1
- package/plugin-src/agents/slm-governance-advisor.md +80 -0
- package/plugin-src/agents/slm-loop-runner.md +71 -0
- package/plugin-src/agents/slm-memory-advisor.md +10 -5
- package/plugin-src/agents/slm-optimize-advisor.md +9 -3
- package/plugin-src/commands/slm-loop.md +31 -0
- package/plugin-src/hooks/hooks.json +79 -0
- package/plugin-src/manifest.json +7 -2
- package/plugin-src/requirements.txt +1 -1
- package/plugin-src/rules/AGENTS.md +57 -18
- package/plugin-src/rules/CLAUDE.md.fragment +8 -8
- package/plugin-src/scripts/slm-launch +46 -7
- package/plugin-src/settings.json +9 -0
- package/plugin-src/skills/slm-cache/SKILL.md +9 -1
- package/plugin-src/skills/slm-compress/SKILL.md +8 -1
- package/plugin-src/skills/slm-governance/SKILL.md +248 -0
- package/plugin-src/skills/slm-graph/SKILL.md +17 -3
- package/plugin-src/skills/slm-loop/SKILL.md +99 -0
- package/plugin-src/skills/slm-mesh/SKILL.md +282 -0
- package/plugin-src/skills/slm-profile/SKILL.md +148 -0
- package/plugin-src/skills/slm-recall/SKILL.md +46 -10
- package/plugin-src/skills/slm-remember/SKILL.md +48 -1
- package/plugin-src/skills/slm-scope/SKILL.md +176 -0
- package/plugin-src/skills/slm-session/SKILL.md +24 -1
- package/plugin-src/skills/slm-status/SKILL.md +18 -1
- package/pyproject.toml +1 -2
- package/scripts/postinstall/validation.js +2 -0
- package/scripts/postinstall-interactive.js +74 -2
- package/src/superlocalmemory/__init__.py +1 -1
- package/src/superlocalmemory/access/__init__.py +3 -0
- package/src/superlocalmemory/access/rbac.py +477 -0
- package/src/superlocalmemory/cli/commands.py +96 -12
- package/src/superlocalmemory/cli/compress_cmd.py +17 -7
- package/src/superlocalmemory/cli/loop_cmd.py +192 -0
- package/src/superlocalmemory/cli/main.py +39 -4
- package/src/superlocalmemory/cli/mesh_cmd.py +38 -0
- package/src/superlocalmemory/cli/optimize_cmd.py +3 -0
- package/src/superlocalmemory/cli/pending_store.py +49 -13
- package/src/superlocalmemory/cli/proxy_cmd.py +4 -0
- package/src/superlocalmemory/cli/scale_engine_cmd.py +6 -0
- package/src/superlocalmemory/cli/setup_wizard.py +22 -13
- package/src/superlocalmemory/compliance/audit.py +6 -0
- package/src/superlocalmemory/compliance/gdpr.py +128 -138
- package/src/superlocalmemory/compliance/retention.py +176 -45
- package/src/superlocalmemory/core/backend_orchestrator.py +5 -43
- package/src/superlocalmemory/core/community_summary.py +267 -0
- package/src/superlocalmemory/core/config.py +216 -3
- package/src/superlocalmemory/core/consolidation_engine.py +95 -22
- package/src/superlocalmemory/core/context_cache.py +61 -18
- package/src/superlocalmemory/core/embedding_worker.py +17 -2
- package/src/superlocalmemory/core/embeddings.py +12 -1
- package/src/superlocalmemory/core/engine.py +17 -1
- package/src/superlocalmemory/core/engine_ingestion.py +29 -0
- package/src/superlocalmemory/core/engine_wiring.py +13 -0
- package/src/superlocalmemory/core/entity_community.py +178 -0
- package/src/superlocalmemory/core/graph_analyzer.py +39 -2
- package/src/superlocalmemory/core/graph_pruner.py +13 -8
- package/src/superlocalmemory/core/key_expander.py +138 -0
- package/src/superlocalmemory/core/maintenance.py +23 -0
- package/src/superlocalmemory/core/modes.py +1 -1
- package/src/superlocalmemory/core/mutations.py +2 -2
- package/src/superlocalmemory/core/pii.py +105 -0
- package/src/superlocalmemory/core/progressive_abstraction.py +208 -0
- package/src/superlocalmemory/core/recall_pipeline.py +2 -0
- package/src/superlocalmemory/core/recall_worker.py +20 -6
- package/src/superlocalmemory/core/scale_engine.py +60 -1
- package/src/superlocalmemory/core/security_primitives.py +40 -2
- package/src/superlocalmemory/core/store_pipeline.py +35 -11
- package/src/superlocalmemory/core/worker_pool.py +21 -6
- package/src/superlocalmemory/encoding/entity_reflexion.py +200 -0
- package/src/superlocalmemory/encoding/entity_resolver.py +34 -24
- package/src/superlocalmemory/encoding/fact_extractor.py +26 -1
- package/src/superlocalmemory/encoding/temporal_validator.py +64 -1
- package/src/superlocalmemory/evolution/evolution_store.py +122 -45
- package/src/superlocalmemory/evolution/llm_dispatch.py +12 -1
- package/src/superlocalmemory/evolution/model_selection.py +160 -0
- package/src/superlocalmemory/evolution/mutation_generator.py +16 -0
- package/src/superlocalmemory/evolution/skill_evolver.py +127 -42
- package/src/superlocalmemory/evolution/triggers.py +22 -13
- package/src/superlocalmemory/graph/cozo_backend.py +43 -20
- package/src/superlocalmemory/hooks/adapter_base.py +5 -1
- package/src/superlocalmemory/hooks/auto_recall.py +13 -1
- package/src/superlocalmemory/hooks/claude_code_hooks.py +11 -0
- package/src/superlocalmemory/hooks/codex_assets.py +64 -5
- package/src/superlocalmemory/hooks/hook_daemon.py +20 -3
- package/src/superlocalmemory/hooks/memory_protocol.py +54 -0
- package/src/superlocalmemory/hooks/portable_kit.py +114 -1
- package/src/superlocalmemory/infra/auth_middleware.py +28 -0
- package/src/superlocalmemory/infra/backup.py +12 -1
- package/src/superlocalmemory/infra/daemon_identity.py +40 -4
- package/src/superlocalmemory/infra/data_root.py +43 -4
- package/src/superlocalmemory/infra/event_bus.py +107 -24
- package/src/superlocalmemory/infra/rate_limiter.py +93 -0
- package/src/superlocalmemory/ingestion/adapter_manager.py +4 -1
- package/src/superlocalmemory/ingestion/credentials.py +1 -1
- package/src/superlocalmemory/learning/cross_project.py +28 -19
- package/src/superlocalmemory/learning/reward_proxy.py +42 -9
- package/src/superlocalmemory/loops/__init__.py +56 -0
- package/src/superlocalmemory/loops/budget.py +58 -0
- package/src/superlocalmemory/loops/engine.py +164 -0
- package/src/superlocalmemory/loops/ledger.py +243 -0
- package/src/superlocalmemory/loops/models.py +152 -0
- package/src/superlocalmemory/loops/rules.py +52 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +3 -0
- package/src/superlocalmemory/mcp/_pool_adapter.py +2 -0
- package/src/superlocalmemory/mcp/profiles.py +103 -0
- package/src/superlocalmemory/mcp/server.py +21 -49
- package/src/superlocalmemory/mcp/tools_active.py +4 -7
- package/src/superlocalmemory/mcp/tools_code_graph.py +51 -5
- package/src/superlocalmemory/mcp/tools_core.py +50 -5
- package/src/superlocalmemory/mcp/tools_evolution.py +6 -3
- package/src/superlocalmemory/mcp/tools_loops.py +300 -0
- package/src/superlocalmemory/mcp/tools_mesh.py +140 -4
- package/src/superlocalmemory/mcp/tools_optimize.py +15 -8
- package/src/superlocalmemory/mesh/broker.py +237 -129
- package/src/superlocalmemory/mesh/remote_sync.py +50 -8
- package/src/superlocalmemory/optimize/NOTICE +1 -6
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +1 -4
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +1 -4
- package/src/superlocalmemory/optimize/cache/semantic.py +27 -19
- package/src/superlocalmemory/optimize/compress/align.py +32 -26
- package/src/superlocalmemory/optimize/compress/ccr.py +14 -71
- package/src/superlocalmemory/optimize/compress/router.py +105 -22
- package/src/superlocalmemory/optimize/config/defaults.py +1 -1
- package/src/superlocalmemory/optimize/config/schema.py +87 -4
- package/src/superlocalmemory/optimize/metrics/counters.py +13 -4
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -3
- package/src/superlocalmemory/optimize/proxy/_helpers.py +31 -4
- package/src/superlocalmemory/optimize/storage/db.py +38 -9
- package/src/superlocalmemory/optimize/storage/schema.py +10 -0
- package/src/superlocalmemory/parameterization/pattern_extractor.py +6 -3
- package/src/superlocalmemory/retrieval/agentic.py +1 -1
- package/src/superlocalmemory/retrieval/bm25_channel.py +68 -10
- package/src/superlocalmemory/retrieval/engine.py +168 -26
- package/src/superlocalmemory/retrieval/entity_channel.py +7 -5
- package/src/superlocalmemory/retrieval/hopfield_channel.py +9 -2
- package/src/superlocalmemory/retrieval/semantic_channel.py +114 -21
- package/src/superlocalmemory/retrieval/spreading_activation.py +11 -2
- package/src/superlocalmemory/retrieval/temporal_channel.py +48 -9
- package/src/superlocalmemory/retrieval/temporal_frame.py +102 -0
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +135 -0
- package/src/superlocalmemory/retrieval/time_window.py +181 -0
- package/src/superlocalmemory/server/api.py +21 -4
- package/src/superlocalmemory/server/profile_runtime.py +125 -8
- package/src/superlocalmemory/server/rbac_enforce.py +142 -0
- package/src/superlocalmemory/server/recall_health.py +24 -3
- package/src/superlocalmemory/server/recall_serializer.py +19 -1
- package/src/superlocalmemory/server/routes/abstraction.py +115 -0
- package/src/superlocalmemory/server/routes/agents.py +128 -38
- package/src/superlocalmemory/server/routes/backup.py +34 -10
- package/src/superlocalmemory/server/routes/behavioral.py +13 -12
- package/src/superlocalmemory/server/routes/brain.py +21 -5
- package/src/superlocalmemory/server/routes/chat.py +72 -16
- package/src/superlocalmemory/server/routes/compliance.py +171 -21
- package/src/superlocalmemory/server/routes/config_api.py +436 -0
- package/src/superlocalmemory/server/routes/data_io.py +30 -8
- package/src/superlocalmemory/server/routes/entity.py +9 -4
- package/src/superlocalmemory/server/routes/events.py +24 -8
- package/src/superlocalmemory/server/routes/evolution.py +135 -17
- package/src/superlocalmemory/server/routes/helpers.py +16 -1
- package/src/superlocalmemory/server/routes/ingest.py +7 -4
- package/src/superlocalmemory/server/routes/insights.py +3 -3
- package/src/superlocalmemory/server/routes/learning.py +14 -14
- package/src/superlocalmemory/server/routes/lifecycle.py +59 -8
- package/src/superlocalmemory/server/routes/memories.py +221 -49
- package/src/superlocalmemory/server/routes/mesh.py +95 -15
- package/src/superlocalmemory/server/routes/optimize.py +33 -1
- package/src/superlocalmemory/server/routes/prewarm.py +2 -0
- package/src/superlocalmemory/server/routes/profiles.py +63 -17
- package/src/superlocalmemory/server/routes/ratelimit.py +124 -0
- package/src/superlocalmemory/server/routes/rbac.py +367 -0
- package/src/superlocalmemory/server/routes/stats.py +13 -6
- package/src/superlocalmemory/server/routes/tiers.py +11 -9
- package/src/superlocalmemory/server/routes/v3_api.py +194 -81
- package/src/superlocalmemory/server/routes/ws.py +5 -2
- package/src/superlocalmemory/server/security_middleware.py +12 -5
- package/src/superlocalmemory/server/ui.py +30 -5
- package/src/superlocalmemory/server/unified_daemon.py +431 -75
- package/src/superlocalmemory/server/write_identity.py +38 -8
- package/src/superlocalmemory/storage/database.py +265 -53
- package/src/superlocalmemory/storage/migration_runner.py +53 -0
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +108 -0
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +86 -0
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +194 -0
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +87 -0
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +90 -0
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +136 -0
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +163 -0
- package/src/superlocalmemory/storage/models.py +4 -0
- package/src/superlocalmemory/storage/schema.py +87 -0
- package/src/superlocalmemory/storage/schema_v32.py +0 -9
- package/src/superlocalmemory/storage/schema_v343.py +24 -12
- package/src/superlocalmemory/trust/gate.py +49 -8
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +64 -0
- package/src/superlocalmemory/ui/assets/slm-icon.svg +36 -0
- package/src/superlocalmemory/ui/css/design-system.css +621 -0
- package/src/superlocalmemory/ui/css/neural-glass.css +6 -0
- package/src/superlocalmemory/ui/css/od-bridge.css +158 -0
- package/src/superlocalmemory/ui/favicon.svg +35 -4
- package/src/superlocalmemory/ui/index.html +306 -173
- package/src/superlocalmemory/ui/js/brain.js +5 -20
- package/src/superlocalmemory/ui/js/core.js +47 -31
- package/src/superlocalmemory/ui/js/dashboard.js +314 -63
- package/src/superlocalmemory/ui/js/event-delegation.js +102 -0
- package/src/superlocalmemory/ui/js/knowledge-graph.js +11 -11
- package/src/superlocalmemory/ui/js/math-health.js +1 -1
- package/src/superlocalmemory/ui/js/memories.js +15 -4
- package/src/superlocalmemory/ui/js/memory-chat.js +7 -7
- package/src/superlocalmemory/ui/js/ng-entities.js +6 -8
- package/src/superlocalmemory/ui/js/ng-ingestion.js +4 -4
- package/src/superlocalmemory/ui/js/ng-mesh.js +4 -9
- package/src/superlocalmemory/ui/js/ng-shell.js +8 -8
- package/src/superlocalmemory/ui/js/ng-skills.js +54 -2
- package/src/superlocalmemory/ui/js/od-agents.js +544 -0
- package/src/superlocalmemory/ui/js/od-auth-gate.js +257 -0
- package/src/superlocalmemory/ui/js/od-backup.js +780 -0
- package/src/superlocalmemory/ui/js/od-brain.js +779 -0
- package/src/superlocalmemory/ui/js/od-entities.js +579 -0
- package/src/superlocalmemory/ui/js/od-graph.js +593 -0
- package/src/superlocalmemory/ui/js/od-health.js +539 -0
- package/src/superlocalmemory/ui/js/od-mcp.js +508 -0
- package/src/superlocalmemory/ui/js/od-memories.js +887 -0
- package/src/superlocalmemory/ui/js/od-mesh.js +539 -0
- package/src/superlocalmemory/ui/js/od-operations.js +1250 -0
- package/src/superlocalmemory/ui/js/od-optimize.js +787 -0
- package/src/superlocalmemory/ui/js/od-settings.js +1053 -0
- package/src/superlocalmemory/ui/js/od-shell.js +593 -0
- package/src/superlocalmemory/ui/js/od-skills.js +573 -0
- package/src/superlocalmemory/ui/js/od-team.js +258 -0
- package/src/superlocalmemory/ui/js/profiles.js +159 -46
- package/src/superlocalmemory/ui/js/settings.js +2 -2
- package/src/superlocalmemory/ui/js/timeline.js +34 -5
- package/src/superlocalmemory/ui/js/trust-dashboard.js +2 -2
- package/src/superlocalmemory/vector/lancedb_backend.py +8 -6
- package/src/superlocalmemory/learning/behavioral_listener.py +0 -94
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" data-bs-theme="dark">
|
|
2
|
+
<html lang="en" data-bs-theme="dark" data-theme="dark">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
@@ -23,12 +23,42 @@
|
|
|
23
23
|
|
|
24
24
|
<!-- Legacy dashboard styles (v3.4.21 — extracted to external file, no rule changes) -->
|
|
25
25
|
<link rel="stylesheet" href="static/css/legacy-dashboard.css?v=34422">
|
|
26
|
+
<!-- Open Design System v1.0 (app chrome, KPI strip, cards, sidebar, theme tokens) -->
|
|
27
|
+
<link rel="stylesheet" href="static/css/design-system.css">
|
|
28
|
+
<!-- OD-Bootstrap bridge: tab-pane visibility, mobile sidebar, responsive shims -->
|
|
29
|
+
<link rel="stylesheet" href="static/css/od-bridge.css">
|
|
26
30
|
</head>
|
|
27
|
-
<body
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
<body>
|
|
32
|
+
|
|
33
|
+
<!-- OD chrome v1.0 — CSP-safe, single-page tab model -->
|
|
34
|
+
<div class="scrim" id="scrim"></div>
|
|
35
|
+
<div class="app">
|
|
36
|
+
<aside class="sidebar" id="sidebar"></aside>
|
|
37
|
+
<div class="main">
|
|
38
|
+
<header class="topbar">
|
|
39
|
+
<button class="btn icon ghost menu-btn" id="menuBtn" aria-label="Open menu">
|
|
40
|
+
<i class="bi bi-list" aria-hidden="true"></i>
|
|
41
|
+
</button>
|
|
42
|
+
<div>
|
|
43
|
+
<div class="crumb" id="topbar-crumb">Overview</div>
|
|
44
|
+
<h1 id="topbar-heading">Dashboard</h1>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="spacer"></div>
|
|
47
|
+
<label class="search" for="q" style="display:none">
|
|
48
|
+
<i class="bi bi-search" aria-hidden="true"></i>
|
|
49
|
+
<input id="q" placeholder="Search memories…">
|
|
50
|
+
<span class="kbd">⌘K</span>
|
|
51
|
+
</label>
|
|
52
|
+
<span class="badge-local" title="All data stays on this machine. Nothing leaves your device.">
|
|
53
|
+
<i class="bi bi-lock-fill" aria-hidden="true"></i> LOCAL ONLY
|
|
54
|
+
</span>
|
|
55
|
+
<button class="btn icon ghost" data-theme-icon aria-label="Toggle theme"></button>
|
|
56
|
+
</header>
|
|
57
|
+
<main class="content" id="main-content">
|
|
58
|
+
|
|
59
|
+
<!-- Hidden ng-premount: profile-select + mode-badge moved here;
|
|
60
|
+
od-shell.js will relocate them into #od-profile-container in the sidebar. -->
|
|
61
|
+
<div id="ng-premount" style="display: none;" aria-hidden="true">
|
|
32
62
|
<select class="form-select form-select-sm profile-select" id="profile-select" title="Switch profile">
|
|
33
63
|
<option value="default">default</option>
|
|
34
64
|
</select>
|
|
@@ -36,15 +66,13 @@
|
|
|
36
66
|
<i class="bi bi-plus-lg"></i>
|
|
37
67
|
</button>
|
|
38
68
|
<span id="mode-badge" class="badge">...</span>
|
|
39
|
-
<button class="btn btn-sm theme-toggle" id="refresh-dashboard-btn"
|
|
69
|
+
<button class="btn btn-sm theme-toggle" id="refresh-dashboard-btn" data-act-click="refresh-dashboard" title="Refresh Dashboard" style="padding:4px 8px;">
|
|
40
70
|
<i class="bi bi-arrow-clockwise" aria-hidden="true"></i>
|
|
41
71
|
</button>
|
|
42
|
-
<button class="theme-toggle" id="theme-toggle"
|
|
72
|
+
<button class="theme-toggle" id="theme-toggle" data-act-click="toggle-dark-mode" aria-label="Toggle dark mode">
|
|
43
73
|
<i class="bi bi-sun-fill" id="theme-icon" aria-hidden="true"></i>
|
|
44
74
|
</button>
|
|
45
75
|
</div>
|
|
46
|
-
|
|
47
|
-
<div class="container-fluid">
|
|
48
76
|
<!-- Stats Overview — hidden until ng-shell.js relocates this block
|
|
49
77
|
into the Dashboard pane. Prevents the flash of pre-glass stat
|
|
50
78
|
cards at the top of the page on initial load (v3.4.21 FOUC fix). -->
|
|
@@ -109,102 +137,189 @@
|
|
|
109
137
|
<li class="nav-item"><button class="nav-link" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings-pane" type="button"></button></li>
|
|
110
138
|
</ul>
|
|
111
139
|
|
|
112
|
-
<!--
|
|
113
|
-
|
|
114
|
-
|
|
140
|
+
<!-- Legacy privacy/learning banner removed in 3.7.9 OD redesign:
|
|
141
|
+
the Brain screen now shows learning progress in-context, and this
|
|
142
|
+
persistent strip leaked onto every pane. feedback.js null-guards
|
|
143
|
+
these ids, so removing the containers is a safe no-op there. -->
|
|
115
144
|
|
|
116
145
|
<div class="tab-content">
|
|
117
146
|
<!-- Graph Visualization -->
|
|
118
147
|
<!-- V3 Dashboard -->
|
|
148
|
+
<!-- Dashboard — OD design v1.0 wired to real API endpoints.
|
|
149
|
+
KPI values come from GET /api/stats (loadDashboardStats in dashboard.js).
|
|
150
|
+
System card comes from GET /api/v3/dashboard (loadDashboard in dashboard.js).
|
|
151
|
+
Activity feed comes from GET /api/memories?limit=6 (loadDashboardFeed).
|
|
152
|
+
No hardcoded numbers — honest loading/empty states only. -->
|
|
119
153
|
<div class="tab-pane fade show active" id="dashboard-pane">
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
<button class="btn btn-outline-primary mode-btn" data-mode="b">B</button>
|
|
134
|
-
<button class="btn btn-outline-primary mode-btn" data-mode="c">C</button>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
<!-- Stats Card -->
|
|
140
|
-
<div class="col-md-4">
|
|
141
|
-
<div class="card stat-card h-100">
|
|
142
|
-
<div class="card-body">
|
|
143
|
-
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
144
|
-
<h6 class="card-subtitle text-muted">Memories</h6>
|
|
145
|
-
<i class="bi bi-database stat-icon text-success"></i>
|
|
146
|
-
</div>
|
|
147
|
-
<h3 id="dashboard-memory-count" class="stat-value">0</h3>
|
|
148
|
-
<p class="text-muted small mb-0">facts stored</p>
|
|
149
|
-
</div>
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
152
|
-
<!-- Provider Card -->
|
|
153
|
-
<div class="col-md-4">
|
|
154
|
-
<div class="card stat-card h-100">
|
|
155
|
-
<div class="card-body">
|
|
156
|
-
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
157
|
-
<h6 class="card-subtitle text-muted">LLM Provider</h6>
|
|
158
|
-
<i class="bi bi-cloud stat-icon text-info"></i>
|
|
159
|
-
</div>
|
|
160
|
-
<h3 id="dashboard-provider" class="stat-value">Loading...</h3>
|
|
161
|
-
<p id="dashboard-model" class="text-muted small mb-0"></p>
|
|
162
|
-
</div>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
154
|
+
|
|
155
|
+
<div class="page-head">
|
|
156
|
+
<h2>Your memory, at a glance</h2>
|
|
157
|
+
<p id="od-dash-subtitle" class="muted">Connecting to daemon...</p>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<!-- KPI strip — 4 cards, values populated by loadDashboardStats() -->
|
|
161
|
+
<section class="kpi-strip" style="margin-bottom:16px">
|
|
162
|
+
<div class="card kpi">
|
|
163
|
+
<div class="label"><i class="bi bi-journal-text" aria-hidden="true"></i> Total Memories</div>
|
|
164
|
+
<div class="value num" id="k-mem">—</div>
|
|
165
|
+
<div class="delta" id="k-mem-delta"> </div>
|
|
166
|
+
<div class="spark" id="sp-mem"></div>
|
|
165
167
|
</div>
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
168
|
+
<div class="card kpi">
|
|
169
|
+
<div class="label"><i class="bi bi-diagram-2" aria-hidden="true"></i> Graph Nodes</div>
|
|
170
|
+
<div class="value num" id="k-nodes">—</div>
|
|
171
|
+
<div class="delta" id="k-nodes-delta"> </div>
|
|
172
|
+
<div class="spark" id="sp-nodes"></div>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="card kpi">
|
|
175
|
+
<div class="label"><i class="bi bi-arrows-angle-expand" aria-hidden="true"></i> Connections</div>
|
|
176
|
+
<div class="value num" id="k-edges">—</div>
|
|
177
|
+
<div class="delta" id="k-edges-delta"> </div>
|
|
178
|
+
<div class="spark" id="sp-edges"></div>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="card kpi">
|
|
181
|
+
<div class="label"><i class="bi bi-lightning-charge" aria-hidden="true"></i> Clusters</div>
|
|
182
|
+
<div class="value num" id="k-clu">—</div>
|
|
183
|
+
<div class="delta" id="k-clu-delta"> </div>
|
|
184
|
+
<div class="spark" id="sp-clu"></div>
|
|
185
|
+
<!-- TODO: endpoint /api/v3/clusters/count does not exist yet -->
|
|
186
|
+
</div>
|
|
187
|
+
</section>
|
|
188
|
+
|
|
189
|
+
<!-- main grid: memory-growth card + system card -->
|
|
190
|
+
<div class="grid" style="grid-template-columns:1.6fr 1fr;align-items:start">
|
|
191
|
+
|
|
192
|
+
<!-- memory growth + quick actions -->
|
|
193
|
+
<div class="card">
|
|
194
|
+
<div class="card-head">
|
|
195
|
+
<h3>Memory growth</h3>
|
|
196
|
+
<span class="sub">facts stored over time</span>
|
|
197
|
+
<div class="spacer"></div>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="card-pad">
|
|
200
|
+
<div id="sp-big"></div>
|
|
201
|
+
<div style="display:flex;gap:26px;margin-top:16px;flex-wrap:wrap">
|
|
202
|
+
<div>
|
|
203
|
+
<div class="muted" style="font-size:12px">Avg / day</div>
|
|
204
|
+
<div class="num" id="k-avg-day" style="font-size:19px;font-weight:650">—</div>
|
|
205
|
+
</div>
|
|
206
|
+
<div>
|
|
207
|
+
<div class="muted" style="font-size:12px">Total facts</div>
|
|
208
|
+
<div class="num" id="k-facts" style="font-size:19px;font-weight:650">—</div>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
<!-- Quick store / recall -->
|
|
212
|
+
<div style="margin-top:20px;display:flex;flex-direction:column;gap:10px">
|
|
213
|
+
<div>
|
|
214
|
+
<div class="muted" style="font-size:12px;margin-bottom:4px">Quick store</div>
|
|
215
|
+
<div class="input-group input-group-sm" style="max-width:320px">
|
|
216
|
+
<input type="text" id="quick-store-input" class="form-control" placeholder="Type something to remember...">
|
|
217
|
+
<button class="btn btn-primary btn-sm" id="quick-store-btn">Store</button>
|
|
177
218
|
</div>
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
<div class="
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
<input type="text" id="quick-recall-input" class="form-control" placeholder="Search your memories...">
|
|
185
|
-
<button class="btn btn-success" id="quick-recall-btn">Recall</button>
|
|
186
|
-
</div>
|
|
187
|
-
<div id="quick-recall-results" class="mt-2 small"></div>
|
|
188
|
-
</div>
|
|
219
|
+
</div>
|
|
220
|
+
<div>
|
|
221
|
+
<div class="muted" style="font-size:12px;margin-bottom:4px">Quick recall</div>
|
|
222
|
+
<div class="input-group input-group-sm" style="max-width:320px">
|
|
223
|
+
<input type="text" id="quick-recall-input" class="form-control" placeholder="Search your memories...">
|
|
224
|
+
<button class="btn btn-success btn-sm" id="quick-recall-btn">Recall</button>
|
|
189
225
|
</div>
|
|
226
|
+
<div id="quick-recall-results" class="mt-1 small"></div>
|
|
227
|
+
</div>
|
|
190
228
|
</div>
|
|
229
|
+
</div>
|
|
191
230
|
</div>
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
231
|
+
|
|
232
|
+
<!-- system health snapshot — wired to GET /api/v3/dashboard -->
|
|
233
|
+
<div class="card">
|
|
234
|
+
<div class="card-head">
|
|
235
|
+
<h3>System</h3>
|
|
236
|
+
<div class="spacer"></div>
|
|
237
|
+
<span class="badge ok" id="od-sys-badge"><span class="dot"></span> Healthy</span>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="card-pad" style="display:flex;flex-direction:column;gap:2px">
|
|
240
|
+
<div class="list-row">
|
|
241
|
+
<span class="muted" style="width:120px">Mode</span>
|
|
242
|
+
<b id="dashboard-mode">...</b>
|
|
243
|
+
</div>
|
|
244
|
+
<div class="list-row">
|
|
245
|
+
<span class="muted" style="width:120px">Description</span>
|
|
246
|
+
<span class="mono" id="dashboard-mode-desc">...</span>
|
|
247
|
+
</div>
|
|
248
|
+
<div class="list-row">
|
|
249
|
+
<span class="muted" style="width:120px">LLM Provider</span>
|
|
250
|
+
<span class="mono" id="dashboard-provider">...</span>
|
|
251
|
+
</div>
|
|
252
|
+
<div class="list-row">
|
|
253
|
+
<span class="muted" style="width:120px">Model</span>
|
|
254
|
+
<span class="mono" id="dashboard-model">...</span>
|
|
255
|
+
</div>
|
|
256
|
+
<div class="list-row">
|
|
257
|
+
<span class="muted" style="width:120px">Math Layers</span>
|
|
258
|
+
<span class="badge cyan">Scoring · Consistency · Lifecycle</span>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="list-row">
|
|
261
|
+
<span class="muted" style="width:120px">Base dir</span>
|
|
262
|
+
<span class="mono" id="dashboard-basedir">~/.superlocalmemory</span>
|
|
263
|
+
</div>
|
|
264
|
+
<div class="list-row">
|
|
265
|
+
<span class="muted" style="width:120px">Profile</span>
|
|
266
|
+
<span class="mono" id="dashboard-profile">default</span>
|
|
267
|
+
</div>
|
|
268
|
+
<div class="list-row">
|
|
269
|
+
<span class="muted" style="width:120px">Version</span>
|
|
270
|
+
<span class="mono" id="dashboard-version">...</span>
|
|
271
|
+
</div>
|
|
272
|
+
<div class="list-row" style="margin-top:8px">
|
|
273
|
+
<span class="muted" style="width:120px">Switch mode</span>
|
|
274
|
+
<div class="btn-group btn-group-sm" role="group">
|
|
275
|
+
<button class="btn btn-outline-primary mode-btn btn-sm" data-mode="a">A</button>
|
|
276
|
+
<button class="btn btn-outline-primary mode-btn btn-sm" data-mode="b">B</button>
|
|
277
|
+
<button class="btn btn-outline-primary mode-btn btn-sm" data-mode="c">C</button>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
<!-- recent activity + capture sources -->
|
|
285
|
+
<div class="grid" style="grid-template-columns:1.6fr 1fr;align-items:start;margin-top:16px">
|
|
286
|
+
<div class="card">
|
|
287
|
+
<div class="card-head">
|
|
288
|
+
<h3>Recent activity</h3>
|
|
289
|
+
<span class="sub">live memory stream</span>
|
|
290
|
+
<div class="spacer"></div>
|
|
291
|
+
<span class="badge neutral" style="border-radius:99px">
|
|
292
|
+
<span class="dot" style="background:var(--ok)"></span> live
|
|
293
|
+
</span>
|
|
294
|
+
</div>
|
|
295
|
+
<!-- populated by loadDashboardFeed() in dashboard.js via GET /api/memories?limit=6 -->
|
|
296
|
+
<div class="card-pad" id="feed">
|
|
297
|
+
<div class="muted" style="padding:16px;text-align:center;font-size:13px">Loading activity...</div>
|
|
298
|
+
</div>
|
|
207
299
|
</div>
|
|
300
|
+
<div class="card">
|
|
301
|
+
<div class="card-head"><h3>Where memories come from</h3></div>
|
|
302
|
+
<div class="card-pad">
|
|
303
|
+
<!-- populated by loadDashboardSources() in dashboard.js -->
|
|
304
|
+
<!-- TODO: endpoint /api/v3/ingestion/sources does not exist yet;
|
|
305
|
+
showing static breakdown from /api/stats for now -->
|
|
306
|
+
<div id="src">
|
|
307
|
+
<div class="muted" style="padding:16px;text-align:center;font-size:13px">Loading...</div>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<!-- Hidden compat IDs: dashboard-memory-count is referenced by loadDashboard().
|
|
314
|
+
stat-memories, stat-facts, stat-nodes, stat-edges are NOT here —
|
|
315
|
+
they live in #stats-container (above tab-content) to avoid duplicate IDs.
|
|
316
|
+
core.js loadStats() writes to those IDs in stats-container.
|
|
317
|
+
loadDashboardStats() calls /api/stats independently and writes to #k-mem etc. -->
|
|
318
|
+
<div style="display:none" aria-hidden="true" id="legacy-compat-ids">
|
|
319
|
+
<!-- dashboard-memory-count: unique ID (old dashboard pane was replaced) -->
|
|
320
|
+
<span id="dashboard-memory-count">0</span>
|
|
321
|
+
</div>
|
|
322
|
+
|
|
208
323
|
</div>
|
|
209
324
|
|
|
210
325
|
<!-- Graph Visualization -->
|
|
@@ -217,10 +332,10 @@
|
|
|
217
332
|
<div id="graph-stats" class="mt-2"></div>
|
|
218
333
|
</div>
|
|
219
334
|
<div class="col-md-4 text-end">
|
|
220
|
-
<button class="btn btn-sm btn-outline-primary"
|
|
335
|
+
<button class="btn btn-sm btn-outline-primary" data-act-click="load-graph" aria-label="Refresh graph data">
|
|
221
336
|
<i class="bi bi-arrow-clockwise"></i> Refresh
|
|
222
337
|
</button>
|
|
223
|
-
<select class="form-select form-select-sm d-inline-block w-auto" id="graph-max-nodes"
|
|
338
|
+
<select class="form-select form-select-sm d-inline-block w-auto" id="graph-max-nodes" data-act-change="load-graph" aria-label="Select maximum number of nodes to display">
|
|
224
339
|
<option value="50">50 nodes</option>
|
|
225
340
|
<option value="100">100 nodes</option>
|
|
226
341
|
<option value="200" selected>200 nodes</option>
|
|
@@ -245,16 +360,16 @@
|
|
|
245
360
|
<span class="input-group-text"><i class="bi bi-search"></i></span>
|
|
246
361
|
<input type="text" class="form-control" id="sigma-search-input"
|
|
247
362
|
placeholder="Search memories in graph..." aria-label="Search graph nodes"
|
|
248
|
-
|
|
363
|
+
data-act-input="sigma-search">
|
|
249
364
|
<button class="btn btn-outline-secondary" type="button"
|
|
250
|
-
|
|
365
|
+
data-act-click="sigma-clear-search">
|
|
251
366
|
<i class="bi bi-x-lg"></i>
|
|
252
367
|
</button>
|
|
253
368
|
</div>
|
|
254
369
|
<div class="btn-group btn-group-sm">
|
|
255
|
-
<button class="btn btn-outline-secondary"
|
|
256
|
-
<button class="btn btn-outline-secondary"
|
|
257
|
-
<button class="btn btn-outline-secondary"
|
|
370
|
+
<button class="btn btn-outline-secondary" data-act-click="sigma-zoom-in" title="Zoom In"><i class="bi bi-zoom-in"></i></button>
|
|
371
|
+
<button class="btn btn-outline-secondary" data-act-click="sigma-zoom-out" title="Zoom Out"><i class="bi bi-zoom-out"></i></button>
|
|
372
|
+
<button class="btn btn-outline-secondary" data-act-click="sigma-reset-view" title="Reset View"><i class="bi bi-arrows-angle-expand"></i></button>
|
|
258
373
|
</div>
|
|
259
374
|
</div>
|
|
260
375
|
</div>
|
|
@@ -273,20 +388,20 @@
|
|
|
273
388
|
<h6 class="mb-2 d-flex justify-content-between align-items-center">
|
|
274
389
|
<span><i class="bi bi-collection"></i> Communities</span>
|
|
275
390
|
<div class="btn-group btn-group-sm" role="group" aria-label="Community source">
|
|
276
|
-
<input type="radio" class="btn-check" name="community-source" id="community-live" checked
|
|
391
|
+
<input type="radio" class="btn-check" name="community-source" id="community-live" checked data-act-change="community-source" data-source="live">
|
|
277
392
|
<label class="btn btn-outline-secondary py-0 px-1" style="font-size:0.65rem;" for="community-live">Live</label>
|
|
278
|
-
<input type="radio" class="btn-check" name="community-source" id="community-backend"
|
|
393
|
+
<input type="radio" class="btn-check" name="community-source" id="community-backend" data-act-change="community-source" data-source="backend">
|
|
279
394
|
<label class="btn btn-outline-secondary py-0 px-1" style="font-size:0.65rem;" for="community-backend">Backend</label>
|
|
280
395
|
</div>
|
|
281
396
|
</h6>
|
|
282
397
|
<div class="mb-1" id="community-resolution-container">
|
|
283
398
|
<label class="form-label small mb-0">Resolution <span id="community-resolution-value" class="text-muted">1.0</span></label>
|
|
284
399
|
<input type="range" class="form-range" id="community-resolution" min="0.1" max="3.0" step="0.1" value="1.0"
|
|
285
|
-
|
|
400
|
+
data-act-input="handle-resolution-change">
|
|
286
401
|
</div>
|
|
287
402
|
<div id="community-list-panel">
|
|
288
403
|
<div class="text-muted small">No communities detected yet.</div>
|
|
289
|
-
<button class="btn btn-sm btn-outline-primary w-100 mt-1"
|
|
404
|
+
<button class="btn btn-sm btn-outline-primary w-100 mt-1" data-act-click="run-community-detection">
|
|
290
405
|
<i class="bi bi-cpu"></i> Detect
|
|
291
406
|
</button>
|
|
292
407
|
</div>
|
|
@@ -298,7 +413,7 @@
|
|
|
298
413
|
<hr class="my-2">
|
|
299
414
|
<h6 class="mb-2"><i class="bi bi-funnel"></i> Filter</h6>
|
|
300
415
|
<select class="form-select form-select-sm mb-1" id="sigma-category-filter"
|
|
301
|
-
|
|
416
|
+
data-act-change="sigma-filter-by-category">
|
|
302
417
|
<option value="">All types</option>
|
|
303
418
|
<option value="semantic">Semantic</option>
|
|
304
419
|
<option value="episodic">Episodic</option>
|
|
@@ -387,7 +502,7 @@
|
|
|
387
502
|
<div class="card p-3 mt-3">
|
|
388
503
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
389
504
|
<h5 class="mb-0"><i class="bi bi-collection"></i> Knowledge Clusters</h5>
|
|
390
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
505
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="load-clusters" title="Refresh clusters">
|
|
391
506
|
<i class="bi bi-arrow-clockwise"></i>
|
|
392
507
|
</button>
|
|
393
508
|
</div>
|
|
@@ -427,17 +542,14 @@
|
|
|
427
542
|
</div>
|
|
428
543
|
</div>
|
|
429
544
|
|
|
430
|
-
<!-- Entity Explorer — standalone pane (v3.4.
|
|
431
|
-
Broken out of Graph per Varun's taxonomy: entities stand
|
|
432
|
-
independently as a first-class concern. Same DOM IDs as the
|
|
433
|
-
previous embedded version so ng-entities.js keeps working. -->
|
|
545
|
+
<!-- Entity Explorer — standalone pane (v3.4.21). -->
|
|
434
546
|
<div class="tab-pane fade" id="entities-pane">
|
|
435
547
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
436
548
|
<div>
|
|
437
549
|
<h3 class="mb-0"><i class="bi bi-person-badge"></i> Entity Explorer</h3>
|
|
438
550
|
<small class="text-muted">Compiled truth per entity — PageRank + Louvain communities</small>
|
|
439
551
|
</div>
|
|
440
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
552
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="load-entity-explorer" title="Refresh entities">
|
|
441
553
|
<i class="bi bi-arrow-clockwise"></i> Refresh
|
|
442
554
|
</button>
|
|
443
555
|
</div>
|
|
@@ -450,6 +562,9 @@
|
|
|
450
562
|
<div id="entity-detail-panel" class="mt-3" style="display:none"></div>
|
|
451
563
|
</div>
|
|
452
564
|
|
|
565
|
+
<!-- Multi-Agent Memory — OD module renders into this pane via window.odRenderAgents -->
|
|
566
|
+
<div class="tab-pane fade" id="agents-pane"></div>
|
|
567
|
+
|
|
453
568
|
<!-- Memories List -->
|
|
454
569
|
<div class="tab-pane fade" id="memories-pane">
|
|
455
570
|
<!-- Domain 4 (v3.4.21): Recall Lab is the primary search at
|
|
@@ -493,17 +608,17 @@
|
|
|
493
608
|
<i class="bi bi-download"></i> Export
|
|
494
609
|
</button>
|
|
495
610
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
496
|
-
<li><a class="dropdown-item" href="#"
|
|
611
|
+
<li><a class="dropdown-item" href="#" data-act-click="export-all" data-format="json">
|
|
497
612
|
<i class="bi bi-filetype-json"></i> Export All (JSON)
|
|
498
613
|
</a></li>
|
|
499
|
-
<li><a class="dropdown-item" href="#"
|
|
614
|
+
<li><a class="dropdown-item" href="#" data-act-click="export-all" data-format="jsonl">
|
|
500
615
|
<i class="bi bi-file-text"></i> Export All (JSONL)
|
|
501
616
|
</a></li>
|
|
502
|
-
<li><a class="dropdown-item" href="#"
|
|
617
|
+
<li><a class="dropdown-item" href="#" data-act-click="export-all" data-format="csv">
|
|
503
618
|
<i class="bi bi-filetype-csv"></i> Export All (CSV)
|
|
504
619
|
</a></li>
|
|
505
620
|
<li><hr class="dropdown-divider"></li>
|
|
506
|
-
<li><a class="dropdown-item" href="#" id="export-search-btn"
|
|
621
|
+
<li><a class="dropdown-item" href="#" id="export-search-btn" data-act-click="export-search-results" style="display:none;">
|
|
507
622
|
<i class="bi bi-funnel"></i> Export Search Results
|
|
508
623
|
</a></li>
|
|
509
624
|
</ul>
|
|
@@ -512,17 +627,17 @@
|
|
|
512
627
|
</div>
|
|
513
628
|
<div class="row g-2 mb-3">
|
|
514
629
|
<div class="col-md-5">
|
|
515
|
-
<select class="form-select" id="filter-category"
|
|
630
|
+
<select class="form-select" id="filter-category" data-act-change="search-memories">
|
|
516
631
|
<option value="">All categories</option>
|
|
517
632
|
</select>
|
|
518
633
|
</div>
|
|
519
634
|
<div class="col-md-5">
|
|
520
|
-
<select class="form-select" id="filter-project"
|
|
635
|
+
<select class="form-select" id="filter-project" data-act-change="search-memories">
|
|
521
636
|
<option value="">All projects</option>
|
|
522
637
|
</select>
|
|
523
638
|
</div>
|
|
524
639
|
<div class="col-md-2">
|
|
525
|
-
<button class="btn btn-outline-secondary w-100"
|
|
640
|
+
<button class="btn btn-outline-secondary w-100" data-act-click="search-memories" title="Refresh list">
|
|
526
641
|
<i class="bi bi-arrow-clockwise"></i> Refresh
|
|
527
642
|
</button>
|
|
528
643
|
</div>
|
|
@@ -534,14 +649,14 @@
|
|
|
534
649
|
<button type="button"
|
|
535
650
|
class="btn btn-sm btn-outline-success mem-filter-pill"
|
|
536
651
|
data-filter="high_reward"
|
|
537
|
-
|
|
652
|
+
data-act-click="set-memory-filter" data-filter="high_reward"
|
|
538
653
|
title="Facts with reward ≥ 0.7 in last 30 days">
|
|
539
654
|
⭐ High-reward (30d)
|
|
540
655
|
</button>
|
|
541
656
|
<button type="button"
|
|
542
657
|
class="btn btn-sm btn-outline-warning mem-filter-pill ms-2"
|
|
543
658
|
data-filter="being_forgotten"
|
|
544
|
-
|
|
659
|
+
data-act-click="set-memory-filter" data-filter="being_forgotten"
|
|
545
660
|
title="Archived or cold with no positive reward in 60 days">
|
|
546
661
|
🕯️ Being forgotten
|
|
547
662
|
</button>
|
|
@@ -599,11 +714,11 @@
|
|
|
599
714
|
Operations pane. -->
|
|
600
715
|
<div class="card p-2 mb-3" id="health-subnav">
|
|
601
716
|
<div class="d-flex flex-wrap gap-1 small">
|
|
602
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
603
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
604
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
605
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
606
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
717
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="health-section-daemon"><i class="bi bi-heart-pulse"></i> Daemon</button>
|
|
718
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="health-section-events"><i class="bi bi-broadcast"></i> Events</button>
|
|
719
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="health-section-agents"><i class="bi bi-robot"></i> Agents</button>
|
|
720
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="health-section-ides"><i class="bi bi-plug"></i> IDEs</button>
|
|
721
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="health-section-math"><i class="bi bi-calculator"></i> Math</button>
|
|
607
722
|
</div>
|
|
608
723
|
</div>
|
|
609
724
|
|
|
@@ -611,7 +726,7 @@
|
|
|
611
726
|
<section id="health-section-daemon" class="card p-3 mb-3" style="scroll-margin-top: 80px;">
|
|
612
727
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
613
728
|
<h5 class="mb-0"><i class="bi bi-heart-pulse"></i> Daemon health</h5>
|
|
614
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
729
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="load-health-monitor"><i class="bi bi-arrow-clockwise"></i> Refresh</button>
|
|
615
730
|
</div>
|
|
616
731
|
<div id="health-overview"></div>
|
|
617
732
|
<div class="row g-3">
|
|
@@ -642,7 +757,7 @@
|
|
|
642
757
|
</div>
|
|
643
758
|
<div>
|
|
644
759
|
<span id="event-connection-status" class="badge bg-secondary me-2">Connecting...</span>
|
|
645
|
-
<select class="form-select form-select-sm d-inline-block w-auto" id="event-type-filter"
|
|
760
|
+
<select class="form-select form-select-sm d-inline-block w-auto" id="event-type-filter" data-act-change="filter-events">
|
|
646
761
|
<option value="">All events</option>
|
|
647
762
|
<option value="memory.created">Memory created</option>
|
|
648
763
|
<option value="memory.updated">Memory updated</option>
|
|
@@ -650,7 +765,7 @@
|
|
|
650
765
|
<option value="memory.recalled">Memory recalled</option>
|
|
651
766
|
<option value="agent.connected">Agent connected</option>
|
|
652
767
|
</select>
|
|
653
|
-
<button class="btn btn-sm btn-outline-secondary ms-1"
|
|
768
|
+
<button class="btn btn-sm btn-outline-secondary ms-1" data-act-click="clear-event-stream">
|
|
654
769
|
<i class="bi bi-trash"></i> Clear
|
|
655
770
|
</button>
|
|
656
771
|
</div>
|
|
@@ -677,7 +792,7 @@
|
|
|
677
792
|
<h5 class="mb-0"><i class="bi bi-robot"></i> Connected agents</h5>
|
|
678
793
|
<small class="text-muted">AI tools that interact with your memory</small>
|
|
679
794
|
</div>
|
|
680
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
795
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="load-agents"><i class="bi bi-arrow-clockwise"></i> Refresh</button>
|
|
681
796
|
</div>
|
|
682
797
|
<div class="row g-2 mb-3" id="agent-stats-row">
|
|
683
798
|
<div class="col-md-3"><div class="border rounded p-2 text-center"><div class="fw-bold" id="agent-stat-total">0</div><small class="text-muted">Total agents</small></div></div>
|
|
@@ -713,7 +828,7 @@
|
|
|
713
828
|
<!-- ===== SECTION: Math Health ===== -->
|
|
714
829
|
<section id="health-section-math" class="card p-3 mb-3" style="scroll-margin-top: 80px;">
|
|
715
830
|
<h5 class="mb-2"><i class="bi bi-calculator"></i> Mathematical layer health</h5>
|
|
716
|
-
<p class="text-muted small mb-3">Status of
|
|
831
|
+
<p class="text-muted small mb-3">Status of mathematical scoring layers.</p>
|
|
717
832
|
<div class="row g-3" id="math-health-cards"></div>
|
|
718
833
|
</section>
|
|
719
834
|
</div>
|
|
@@ -732,10 +847,10 @@
|
|
|
732
847
|
</div>
|
|
733
848
|
<div class="card p-2 mb-3" id="operations-subnav">
|
|
734
849
|
<div class="d-flex flex-wrap gap-1 small">
|
|
735
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
736
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
737
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
738
|
-
<button type="button" class="btn btn-sm btn-outline-secondary"
|
|
850
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="ops-section-ingestion"><i class="bi bi-cloud-download"></i> Ingestion</button>
|
|
851
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="ops-section-lifecycle"><i class="bi bi-hourglass-split"></i> Lifecycle</button>
|
|
852
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="ops-section-trust"><i class="bi bi-shield-check"></i> Trust</button>
|
|
853
|
+
<button type="button" class="btn btn-sm btn-outline-secondary" data-act-click="scroll-into" data-target="ops-section-compliance"><i class="bi bi-shield-lock"></i> Compliance</button>
|
|
739
854
|
</div>
|
|
740
855
|
</div>
|
|
741
856
|
|
|
@@ -746,7 +861,7 @@
|
|
|
746
861
|
<h5 class="mb-0"><i class="bi bi-cloud-download"></i> Ingestion status</h5>
|
|
747
862
|
<small class="text-muted">Gmail, Calendar, Transcript adapters — all opt-in</small>
|
|
748
863
|
</div>
|
|
749
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
864
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="load-ingestion-status"><i class="bi bi-arrow-clockwise"></i> Refresh</button>
|
|
750
865
|
</div>
|
|
751
866
|
<div id="ingestion-overview"></div>
|
|
752
867
|
<div id="ingestion-adapters" class="mb-3"></div>
|
|
@@ -762,9 +877,9 @@
|
|
|
762
877
|
<h5 class="mb-0"><i class="bi bi-hourglass-split text-warning"></i> Memory lifecycle</h5>
|
|
763
878
|
<div>
|
|
764
879
|
<span class="badge bg-secondary me-2" id="lifecycle-profile-badge">default</span>
|
|
765
|
-
<button class="btn btn-sm btn-outline-success"
|
|
766
|
-
<button class="btn btn-sm btn-outline-info ms-1"
|
|
767
|
-
<button class="btn btn-sm btn-outline-warning ms-1"
|
|
880
|
+
<button class="btn btn-sm btn-outline-success" data-act-click="evaluate-tiers-now"><i class="bi bi-arrow-repeat"></i> Evaluate tiers</button>
|
|
881
|
+
<button class="btn btn-sm btn-outline-info ms-1" data-act-click="compact-dry-run"><i class="bi bi-funnel"></i> Preview compaction</button>
|
|
882
|
+
<button class="btn btn-sm btn-outline-warning ms-1" data-act-click="compact-execute"><i class="bi bi-lightning"></i> Compact now</button>
|
|
768
883
|
</div>
|
|
769
884
|
</div>
|
|
770
885
|
<div class="row g-3 mb-3" id="lifecycle-states-row">
|
|
@@ -856,13 +971,13 @@
|
|
|
856
971
|
<div class="col-md-2"><input type="number" class="form-control form-control-sm" id="cp-retention-days" placeholder="Days" value="90"></div>
|
|
857
972
|
<div class="col-md-2"><input type="text" class="form-control form-control-sm" id="cp-category" placeholder="Category (optional)"></div>
|
|
858
973
|
<div class="col-md-2"><select class="form-select form-select-sm" id="cp-action"><option value="archive">Archive</option><option value="tombstone">Tombstone</option><option value="notify">Notify only</option></select></div>
|
|
859
|
-
<div class="col-md-3"><button class="btn btn-sm btn-success w-100"
|
|
974
|
+
<div class="col-md-3"><button class="btn btn-sm btn-success w-100" data-act-click="create-retention-policy"><i class="bi bi-shield-plus"></i> Create policy</button></div>
|
|
860
975
|
</div>
|
|
861
976
|
<h6 class="mb-2">Active retention policies</h6>
|
|
862
977
|
<div class="mb-3" id="compliance-policies-content"><span class="text-muted">Loading...</span></div>
|
|
863
978
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
864
979
|
<h6 class="mb-0">Audit trail</h6>
|
|
865
|
-
<select class="form-select form-select-sm" id="cp-audit-filter" style="width: auto;"
|
|
980
|
+
<select class="form-select form-select-sm" id="cp-audit-filter" style="width: auto;" data-act-change="load-compliance">
|
|
866
981
|
<option value="">All events</option>
|
|
867
982
|
<option value="recall">Recall</option>
|
|
868
983
|
<option value="remember">Remember</option>
|
|
@@ -883,7 +998,7 @@
|
|
|
883
998
|
<div class="ng-content-title"><i class="bi bi-lightning-charge"></i> Skill Evolution</div>
|
|
884
999
|
<div class="ng-content-subtitle">Track skill performance, evolution history, and health status</div>
|
|
885
1000
|
</div>
|
|
886
|
-
<button class="ng-btn"
|
|
1001
|
+
<button class="ng-btn" data-act-click="load-skill-evolution"><i class="bi bi-arrow-clockwise"></i> Refresh</button>
|
|
887
1002
|
</div>
|
|
888
1003
|
<div id="skills-overview-cards"></div>
|
|
889
1004
|
<div id="skills-list" style="margin-top:24px">
|
|
@@ -903,7 +1018,7 @@
|
|
|
903
1018
|
<div class="ng-content-title"><i class="bi bi-share"></i> Mesh Peers</div>
|
|
904
1019
|
<div class="ng-content-subtitle">P2P agent communication network — real-time status</div>
|
|
905
1020
|
</div>
|
|
906
|
-
<button class="ng-btn"
|
|
1021
|
+
<button class="ng-btn" data-act-click="load-mesh-peers"><i class="bi bi-arrow-clockwise"></i> Refresh</button>
|
|
907
1022
|
</div>
|
|
908
1023
|
<div id="mesh-status-cards"></div>
|
|
909
1024
|
<div style="margin-top:24px">
|
|
@@ -1154,7 +1269,7 @@
|
|
|
1154
1269
|
<input type="text" class="form-control" id="new-profile-name" placeholder="e.g. work, personal, project-x" maxlength="32">
|
|
1155
1270
|
</div>
|
|
1156
1271
|
<div class="col-md-3">
|
|
1157
|
-
<button class="btn btn-primary w-100"
|
|
1272
|
+
<button class="btn btn-primary w-100" data-act-click="create-profile">
|
|
1158
1273
|
<i class="bi bi-plus-circle"></i> Create Profile
|
|
1159
1274
|
</button>
|
|
1160
1275
|
</div>
|
|
@@ -1200,10 +1315,10 @@
|
|
|
1200
1315
|
<label class="form-check-label" for="backup-enabled">Auto-backup enabled</label>
|
|
1201
1316
|
</div>
|
|
1202
1317
|
<div class="d-flex gap-2">
|
|
1203
|
-
<button class="btn btn-primary"
|
|
1318
|
+
<button class="btn btn-primary" data-act-click="save-backup-config">
|
|
1204
1319
|
<i class="bi bi-save"></i> Save Settings
|
|
1205
1320
|
</button>
|
|
1206
|
-
<button class="btn btn-outline-success"
|
|
1321
|
+
<button class="btn btn-outline-success" data-act-click="create-backup-now">
|
|
1207
1322
|
<i class="bi bi-download"></i> Backup Now
|
|
1208
1323
|
</button>
|
|
1209
1324
|
</div>
|
|
@@ -1220,16 +1335,16 @@
|
|
|
1220
1335
|
<div class="text-muted small">Loading cloud destinations...</div>
|
|
1221
1336
|
</div>
|
|
1222
1337
|
<div class="d-flex gap-2 flex-wrap">
|
|
1223
|
-
<button class="btn btn-outline-primary btn-sm"
|
|
1338
|
+
<button class="btn btn-outline-primary btn-sm" data-act-click="connect-google-drive">
|
|
1224
1339
|
<i class="bi bi-google"></i> Connect Google Drive
|
|
1225
1340
|
</button>
|
|
1226
|
-
<button class="btn btn-outline-dark btn-sm"
|
|
1341
|
+
<button class="btn btn-outline-dark btn-sm" data-act-click="connect-git-hub">
|
|
1227
1342
|
<i class="bi bi-github"></i> Connect GitHub
|
|
1228
1343
|
</button>
|
|
1229
|
-
<button class="btn btn-outline-success btn-sm"
|
|
1344
|
+
<button class="btn btn-outline-success btn-sm" data-act-click="sync-cloud-now">
|
|
1230
1345
|
<i class="bi bi-cloud-upload"></i> Sync Now
|
|
1231
1346
|
</button>
|
|
1232
|
-
<button class="btn btn-outline-info btn-sm"
|
|
1347
|
+
<button class="btn btn-outline-info btn-sm" data-act-click="export-backup">
|
|
1233
1348
|
<i class="bi bi-file-earmark-zip"></i> Export Backup
|
|
1234
1349
|
</button>
|
|
1235
1350
|
</div>
|
|
@@ -1244,10 +1359,10 @@
|
|
|
1244
1359
|
</p>
|
|
1245
1360
|
<div id="learning-data-stats" class="mb-3"></div>
|
|
1246
1361
|
<div class="d-flex gap-2">
|
|
1247
|
-
<button class="btn btn-outline-danger"
|
|
1362
|
+
<button class="btn btn-outline-danger" data-act-click="reset-learning-data">
|
|
1248
1363
|
<i class="bi bi-arrow-counterclockwise"></i> Reset Learning Data
|
|
1249
1364
|
</button>
|
|
1250
|
-
<button class="btn btn-outline-info"
|
|
1365
|
+
<button class="btn btn-outline-info" data-act-click="backup-learning-db">
|
|
1251
1366
|
<i class="bi bi-download"></i> Backup Learning DB
|
|
1252
1367
|
</button>
|
|
1253
1368
|
</div>
|
|
@@ -1340,8 +1455,12 @@
|
|
|
1340
1455
|
</div>
|
|
1341
1456
|
</div>
|
|
1342
1457
|
</div>
|
|
1458
|
+
<div class="tab-pane fade" id="mcp-pane"></div>
|
|
1459
|
+
<div class="tab-pane fade" id="backup-pane"></div>
|
|
1343
1460
|
</div>
|
|
1344
|
-
|
|
1461
|
+
</main><!-- /.content -->
|
|
1462
|
+
</div><!-- /.main -->
|
|
1463
|
+
</div><!-- /.app -->
|
|
1345
1464
|
|
|
1346
1465
|
<!-- Memory Detail Modal -->
|
|
1347
1466
|
<div class="modal fade" id="memoryDetailModal" tabindex="-1" aria-labelledby="memoryDetailModalLabel" aria-hidden="true">
|
|
@@ -1363,10 +1482,10 @@
|
|
|
1363
1482
|
</div>
|
|
1364
1483
|
<div class="modal-footer justify-content-between">
|
|
1365
1484
|
<div>
|
|
1366
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
1485
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="copy-memory-to-clipboard" title="Copy to clipboard">
|
|
1367
1486
|
<i class="bi bi-clipboard"></i> Copy
|
|
1368
1487
|
</button>
|
|
1369
|
-
<button class="btn btn-sm btn-outline-secondary"
|
|
1488
|
+
<button class="btn btn-sm btn-outline-secondary" data-act-click="export-memory-as-markdown" title="Download as Markdown">
|
|
1370
1489
|
<i class="bi bi-markdown"></i> Export .md
|
|
1371
1490
|
</button>
|
|
1372
1491
|
</div>
|
|
@@ -1391,6 +1510,12 @@
|
|
|
1391
1510
|
<!-- Modular JS (v2.5 — split from monolith app.js) -->
|
|
1392
1511
|
<script src="static/js/core.js"></script>
|
|
1393
1512
|
|
|
1513
|
+
<!-- Product-wide login gate (v3.8.0): personal mode = no gate; company mode
|
|
1514
|
+
= first-run create-admin / sign-in over the HttpOnly session cookie.
|
|
1515
|
+
Loads right after core.js so it can paint its overlay before any
|
|
1516
|
+
dashboard content renders to an unauthenticated operator. -->
|
|
1517
|
+
<script src="static/js/od-auth-gate.js?v=380"></script>
|
|
1518
|
+
|
|
1394
1519
|
<!-- v3.4.1: Event bus (must load before graph + chat) -->
|
|
1395
1520
|
<script src="static/js/graph-event-bus.js"></script>
|
|
1396
1521
|
<!-- v3.4.1: Sigma.js Knowledge Graph (defines globals: filterState, loadGraph, renderGraph) -->
|
|
@@ -1416,14 +1541,14 @@
|
|
|
1416
1541
|
<script src="static/js/events.js"></script>
|
|
1417
1542
|
<script src="static/js/agents.js"></script>
|
|
1418
1543
|
<!-- Brain tab (v3.4.21 — XSS-safe DOM, token-gated, strict CSP on /api/v3/brain) -->
|
|
1419
|
-
<script src="static/js/brain.js?v=
|
|
1544
|
+
<script src="static/js/brain.js?v=380" defer></script>
|
|
1420
1545
|
<script src="static/js/feedback.js"></script>
|
|
1421
1546
|
<script src="static/js/lifecycle.js"></script>
|
|
1422
1547
|
<script src="static/js/compliance.js"></script>
|
|
1423
1548
|
<script src="static/js/init.js?v=34421fix"></script>
|
|
1424
1549
|
<script src="static/js/dashboard.js"></script>
|
|
1425
1550
|
<script src="static/js/recall-lab.js"></script>
|
|
1426
|
-
<script src="static/js/trust-dashboard.js?v=
|
|
1551
|
+
<script src="static/js/trust-dashboard.js?v=380"></script>
|
|
1427
1552
|
<script src="static/js/math-health.js"></script>
|
|
1428
1553
|
<script src="static/js/auto-settings.js"></script>
|
|
1429
1554
|
<script src="static/js/ide-status.js"></script>
|
|
@@ -1435,9 +1560,30 @@
|
|
|
1435
1560
|
<script src="static/js/ng-entities.js?v=3410"></script>
|
|
1436
1561
|
<script src="static/js/ng-skills.js?v=3411"></script>
|
|
1437
1562
|
<script src="static/js/ng-mesh.js?v=345"></script>
|
|
1438
|
-
|
|
1563
|
+
<!-- OD Shell v1.0 — replaces ng-shell.js; CSP-safe single-page tab switching -->
|
|
1564
|
+
<script src="static/js/od-shell.js?v=380"></script>
|
|
1439
1565
|
<!-- Optimize tab (v3.6.0) — runtime config for cache + compress + proxy -->
|
|
1440
1566
|
<script src="static/js/optimize.js?v=360"></script>
|
|
1567
|
+
<!-- B2 (v3.7.9): CSP-safe event delegation — replaces inline on*= handlers -->
|
|
1568
|
+
<script src="static/js/event-delegation.js?v=379"></script>
|
|
1569
|
+
<!-- OD screen modules (v3.7.9): approved-design panes wired to live data.
|
|
1570
|
+
Load LAST so their window.load<Screen> overrides win over the legacy loaders. -->
|
|
1571
|
+
<script src="static/js/od-brain.js?v=379"></script>
|
|
1572
|
+
<script src="static/js/od-health.js?v=380"></script>
|
|
1573
|
+
<script src="static/js/od-operations.js?v=380"></script>
|
|
1574
|
+
<script src="static/js/od-team.js?v=379"></script>
|
|
1575
|
+
<script src="static/js/od-graph.js?v=379"></script>
|
|
1576
|
+
<script src="static/js/od-memories.js?v=379"></script>
|
|
1577
|
+
<script src="static/js/od-entities.js?v=379"></script>
|
|
1578
|
+
<!-- Multi-Agent Memory pane (v3.8.0): visualises memory written by multiple agents -->
|
|
1579
|
+
<script src="static/js/od-agents.js?v=380"></script>
|
|
1580
|
+
<script src="static/js/od-skills.js?v=379"></script>
|
|
1581
|
+
<script src="static/js/od-mesh.js?v=379"></script>
|
|
1582
|
+
<script src="static/js/od-optimize.js?v=379"></script>
|
|
1583
|
+
<script src="static/js/od-settings.js?v=380"></script>
|
|
1584
|
+
<script src="static/js/od-backup.js?v=379"></script>
|
|
1585
|
+
<!-- MCP & Integrations pane (v3.8.0): shows exposed MCP tool profile + counts -->
|
|
1586
|
+
<script src="static/js/od-mcp.js?v=380"></script>
|
|
1441
1587
|
|
|
1442
1588
|
<!-- Aggressive compression warning modal (v3.6.0 M-03) -->
|
|
1443
1589
|
<div class="modal fade" id="optimizeAggressiveModal" tabindex="-1" aria-labelledby="optimizeAggressiveModalLabel" aria-hidden="true">
|
|
@@ -1464,19 +1610,6 @@
|
|
|
1464
1610
|
</div>
|
|
1465
1611
|
</div>
|
|
1466
1612
|
|
|
1467
|
-
|
|
1468
|
-
<div style="display:flex; align-items:center; justify-content:center; gap:8px; margin-bottom:8px;">
|
|
1469
|
-
<span style="display:inline-flex; align-items:center; justify-content:center; width:24px; height:24px; border-radius:6px; background:linear-gradient(135deg, #667eea 0%, #764ba2 100%); color:#fff; font-size:0.7rem;">⬦</span>
|
|
1470
|
-
<strong>SuperLocalMemory</strong> by <a href="https://qualixar.com" style="font-weight:600;">Qualixar</a>
|
|
1471
|
-
</div>
|
|
1472
|
-
<p style="margin:4px 0;">Built by <a href="https://github.com/varun369">Varun Pratap Bhardwaj</a> · <a href="https://qualixar.com">qualixar.com</a></p>
|
|
1473
|
-
<p style="margin:4px 0;">
|
|
1474
|
-
<a href="https://github.com/qualixar/superlocalmemory"><i class="bi bi-github"></i> GitHub</a> ·
|
|
1475
|
-
<a href="https://www.npmjs.com/package/superlocalmemory"><i class="bi bi-box-seam"></i> npm</a> ·
|
|
1476
|
-
<a href="https://pypi.org/project/superlocalmemory/"><i class="bi bi-box"></i> PyPI</a> ·
|
|
1477
|
-
AGPL-3.0-or-later ·
|
|
1478
|
-
<a href="https://github.com/qualixar/superlocalmemory/stargazers">⭐ Star us on GitHub</a>
|
|
1479
|
-
</p>
|
|
1480
|
-
</footer>
|
|
1613
|
+
<!-- Footer injected into #main-content by od-shell.js slmShell() -->
|
|
1481
1614
|
</body>
|
|
1482
1615
|
</html>
|