@deeplake/hivemind 0.7.45 → 0.7.47
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 +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +64 -0
- package/bundle/cli.js +22702 -7775
- package/codex/bundle/capture.js +228 -0
- package/codex/bundle/commands/auth-login.js +228 -0
- package/codex/bundle/graph-pull-worker.js +1370 -0
- package/codex/bundle/pre-tool-use.js +228 -0
- package/codex/bundle/session-start-setup.js +228 -0
- package/codex/bundle/session-start.js +255 -4
- package/codex/bundle/shell/deeplake-shell.js +1028 -28
- package/codex/bundle/skillify-worker.js +94 -3
- package/codex/bundle/stop.js +282 -50
- package/codex/skills/hivemind-goals/SKILL.md +157 -0
- package/cursor/bundle/capture.js +282 -50
- package/cursor/bundle/commands/auth-login.js +228 -0
- package/cursor/bundle/graph-pull-worker.js +1370 -0
- package/cursor/bundle/pre-tool-use.js +228 -0
- package/cursor/bundle/session-end.js +65 -44
- package/cursor/bundle/session-start.js +662 -6
- package/cursor/bundle/shell/deeplake-shell.js +1028 -28
- package/cursor/bundle/skillify-worker.js +94 -3
- package/hermes/bundle/capture.js +282 -50
- package/hermes/bundle/commands/auth-login.js +228 -0
- package/hermes/bundle/graph-pull-worker.js +1370 -0
- package/hermes/bundle/pre-tool-use.js +228 -0
- package/hermes/bundle/session-end.js +65 -44
- package/hermes/bundle/session-start.js +662 -6
- package/hermes/bundle/shell/deeplake-shell.js +1028 -28
- package/hermes/bundle/skillify-worker.js +94 -3
- package/mcp/bundle/server.js +228 -0
- package/openclaw/dist/chunks/config-FH6JYSJW.js +53 -0
- package/openclaw/dist/index.js +307 -2
- package/openclaw/dist/skillify-worker.js +94 -3
- package/openclaw/openclaw.plugin.json +4 -2
- package/openclaw/package.json +1 -1
- package/openclaw/skills/hivemind-goals/SKILL.md +30 -0
- package/package.json +4 -1
- package/openclaw/dist/chunks/config-XEK4MJJS.js +0 -36
package/openclaw/dist/index.js
CHANGED
|
@@ -200,6 +200,65 @@ var SKILLS_COLUMNS = Object.freeze([
|
|
|
200
200
|
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
201
201
|
{ name: "updated_at", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
202
202
|
]);
|
|
203
|
+
var RULES_COLUMNS = Object.freeze([
|
|
204
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
205
|
+
{ name: "rule_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
206
|
+
{ name: "text", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
207
|
+
{ name: "scope", sql: "TEXT NOT NULL DEFAULT 'team'" },
|
|
208
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'active'" },
|
|
209
|
+
{ name: "assigned_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
210
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
211
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
212
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
213
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
214
|
+
]);
|
|
215
|
+
var TASKS_COLUMNS = Object.freeze([
|
|
216
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
217
|
+
{ name: "task_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
218
|
+
{ name: "text", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
219
|
+
{ name: "scope", sql: "TEXT NOT NULL DEFAULT 'me'" },
|
|
220
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'active'" },
|
|
221
|
+
{ name: "assigned_to", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
222
|
+
{ name: "assigned_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
223
|
+
{ name: "kpis", sql: "JSONB" },
|
|
224
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
225
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
226
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
227
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
228
|
+
]);
|
|
229
|
+
var TASK_EVENTS_COLUMNS = Object.freeze([
|
|
230
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
231
|
+
{ name: "task_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
232
|
+
{ name: "task_version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
233
|
+
{ name: "kpi_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
234
|
+
{ name: "value", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
235
|
+
{ name: "note", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
236
|
+
{ name: "source", sql: "TEXT NOT NULL DEFAULT 'user'" },
|
|
237
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
238
|
+
{ name: "ts", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
239
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
240
|
+
]);
|
|
241
|
+
var GOALS_COLUMNS = Object.freeze([
|
|
242
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
243
|
+
{ name: "goal_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
244
|
+
{ name: "owner", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
245
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'opened'" },
|
|
246
|
+
{ name: "content", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
247
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
248
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
249
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
250
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
251
|
+
]);
|
|
252
|
+
var KPIS_COLUMNS = Object.freeze([
|
|
253
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
254
|
+
{ name: "goal_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
255
|
+
{ name: "kpi_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
256
|
+
{ name: "content", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
257
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
258
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
259
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
260
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
261
|
+
]);
|
|
203
262
|
function validateSchema(label, cols) {
|
|
204
263
|
const seen = /* @__PURE__ */ new Set();
|
|
205
264
|
for (const col of cols) {
|
|
@@ -219,9 +278,38 @@ function validateSchema(label, cols) {
|
|
|
219
278
|
}
|
|
220
279
|
}
|
|
221
280
|
}
|
|
281
|
+
var CODEBASE_COLUMNS = Object.freeze([
|
|
282
|
+
// Identity key (matches the PK below)
|
|
283
|
+
{ name: "org_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
284
|
+
{ name: "workspace_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
285
|
+
{ name: "repo_slug", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
286
|
+
{ name: "user_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
287
|
+
{ name: "worktree_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
288
|
+
{ name: "commit_sha", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
289
|
+
// Observation metadata
|
|
290
|
+
{ name: "parent_sha", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
291
|
+
{ name: "branch", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
292
|
+
{ name: "ts", sql: "TIMESTAMP" },
|
|
293
|
+
{ name: "pushed_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
294
|
+
// Snapshot payload
|
|
295
|
+
{ name: "snapshot_sha256", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
296
|
+
{ name: "snapshot_jsonb", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
297
|
+
{ name: "node_count", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
298
|
+
{ name: "edge_count", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
299
|
+
// Generator metadata (for drift diagnostics — what hivemind version produced this?)
|
|
300
|
+
{ name: "generator", sql: "TEXT NOT NULL DEFAULT 'hivemind-graph'" },
|
|
301
|
+
{ name: "generator_version", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
302
|
+
{ name: "schema_version", sql: "BIGINT NOT NULL DEFAULT 1" }
|
|
303
|
+
]);
|
|
222
304
|
validateSchema("MEMORY_COLUMNS", MEMORY_COLUMNS);
|
|
223
305
|
validateSchema("SESSIONS_COLUMNS", SESSIONS_COLUMNS);
|
|
224
306
|
validateSchema("SKILLS_COLUMNS", SKILLS_COLUMNS);
|
|
307
|
+
validateSchema("RULES_COLUMNS", RULES_COLUMNS);
|
|
308
|
+
validateSchema("TASKS_COLUMNS", TASKS_COLUMNS);
|
|
309
|
+
validateSchema("TASK_EVENTS_COLUMNS", TASK_EVENTS_COLUMNS);
|
|
310
|
+
validateSchema("GOALS_COLUMNS", GOALS_COLUMNS);
|
|
311
|
+
validateSchema("KPIS_COLUMNS", KPIS_COLUMNS);
|
|
312
|
+
validateSchema("CODEBASE_COLUMNS", CODEBASE_COLUMNS);
|
|
225
313
|
function buildCreateTableSql(tableName, cols) {
|
|
226
314
|
const safe = sqlIdent(tableName);
|
|
227
315
|
const colSql = cols.map((c) => `${c.name} ${c.sql}`).join(", ");
|
|
@@ -757,6 +845,27 @@ var DeeplakeApi = class {
|
|
|
757
845
|
* This sidesteps the Deeplake UPDATE-coalescing quirk that bit the wiki
|
|
758
846
|
* worker.
|
|
759
847
|
*/
|
|
848
|
+
/**
|
|
849
|
+
* Create the codebase table. One row per (org, workspace, repo, user,
|
|
850
|
+
* worktree, commit) — see CODEBASE_COLUMNS for the schema. Healing
|
|
851
|
+
* + index follow the same pattern as ensureSessionsTable.
|
|
852
|
+
*/
|
|
853
|
+
async ensureCodebaseTable(name) {
|
|
854
|
+
const safe = sqlIdent(name);
|
|
855
|
+
const tables = await this.listTables();
|
|
856
|
+
if (!tables.includes(safe)) {
|
|
857
|
+
log3(`table "${safe}" not found, creating`);
|
|
858
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, CODEBASE_COLUMNS), safe);
|
|
859
|
+
log3(`table "${safe}" created`);
|
|
860
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
861
|
+
}
|
|
862
|
+
await this.healSchema(safe, CODEBASE_COLUMNS);
|
|
863
|
+
await this.ensureLookupIndex(
|
|
864
|
+
safe,
|
|
865
|
+
"codebase_identity",
|
|
866
|
+
`("org_id", "workspace_id", "repo_slug", "user_id", "worktree_id", "commit_sha")`
|
|
867
|
+
);
|
|
868
|
+
}
|
|
760
869
|
async ensureSkillsTable(name) {
|
|
761
870
|
const safe = sqlIdent(name);
|
|
762
871
|
const tables = await this.listTables();
|
|
@@ -769,6 +878,106 @@ var DeeplakeApi = class {
|
|
|
769
878
|
await this.healSchema(safe, SKILLS_COLUMNS);
|
|
770
879
|
await this.ensureLookupIndex(safe, "project_key_name", `("project_key", "name")`);
|
|
771
880
|
}
|
|
881
|
+
/**
|
|
882
|
+
* Create the rules table.
|
|
883
|
+
*
|
|
884
|
+
* One row per rule version (same write pattern as skills): edits INSERT
|
|
885
|
+
* a fresh row with version+1, reads pick latest per rule_id via
|
|
886
|
+
* `ORDER BY version DESC LIMIT 1`. Sidesteps the Deeplake
|
|
887
|
+
* UPDATE-coalescing quirk by never UPDATEing.
|
|
888
|
+
*/
|
|
889
|
+
async ensureRulesTable(name) {
|
|
890
|
+
const safe = sqlIdent(name);
|
|
891
|
+
const tables = await this.listTables();
|
|
892
|
+
if (!tables.includes(safe)) {
|
|
893
|
+
log3(`table "${safe}" not found, creating`);
|
|
894
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, RULES_COLUMNS), safe);
|
|
895
|
+
log3(`table "${safe}" created`);
|
|
896
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
897
|
+
}
|
|
898
|
+
await this.healSchema(safe, RULES_COLUMNS);
|
|
899
|
+
await this.ensureLookupIndex(safe, "rule_id_version", `("rule_id", "version")`);
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Create the tasks table.
|
|
903
|
+
*
|
|
904
|
+
* Same write pattern as rules + skills. `kpis` is a nullable JSONB
|
|
905
|
+
* column with the agent's KPI metadata; KPI current values come from
|
|
906
|
+
* `task_events` (SUM(value)), not this snapshot.
|
|
907
|
+
*/
|
|
908
|
+
async ensureTasksTable(name) {
|
|
909
|
+
const safe = sqlIdent(name);
|
|
910
|
+
const tables = await this.listTables();
|
|
911
|
+
if (!tables.includes(safe)) {
|
|
912
|
+
log3(`table "${safe}" not found, creating`);
|
|
913
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, TASKS_COLUMNS), safe);
|
|
914
|
+
log3(`table "${safe}" created`);
|
|
915
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
916
|
+
}
|
|
917
|
+
await this.healSchema(safe, TASKS_COLUMNS);
|
|
918
|
+
await this.ensureLookupIndex(safe, "task_id_version", `("task_id", "version")`);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Create the task-events table.
|
|
922
|
+
*
|
|
923
|
+
* Append-only. Every INSERT is a fresh row; never UPDATE. KPI current
|
|
924
|
+
* value is `SUM(value) WHERE task_id=? AND kpi_id=?`. Index on
|
|
925
|
+
* (task_id, kpi_id) is the canonical aggregation key.
|
|
926
|
+
*/
|
|
927
|
+
async ensureTaskEventsTable(name) {
|
|
928
|
+
const safe = sqlIdent(name);
|
|
929
|
+
const tables = await this.listTables();
|
|
930
|
+
if (!tables.includes(safe)) {
|
|
931
|
+
log3(`table "${safe}" not found, creating`);
|
|
932
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, TASK_EVENTS_COLUMNS), safe);
|
|
933
|
+
log3(`table "${safe}" created`);
|
|
934
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
935
|
+
}
|
|
936
|
+
await this.healSchema(safe, TASK_EVENTS_COLUMNS);
|
|
937
|
+
await this.ensureLookupIndex(safe, "task_id_kpi_id", `("task_id", "kpi_id")`);
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* Create the goals table.
|
|
941
|
+
*
|
|
942
|
+
* Backed by the VFS path convention memory/goal/<owner>/<status>/<goal_id>.md.
|
|
943
|
+
* INSERT-only version-bumped: rm and mv operations translate to fresh
|
|
944
|
+
* v=N+1 rows (status flips for mv → closed; rm is the same soft-close).
|
|
945
|
+
* The (goal_id, version) index lets the VFS dispatch a cheap latest-row
|
|
946
|
+
* read on cat / Read of a single goal.
|
|
947
|
+
*/
|
|
948
|
+
async ensureGoalsTable(name) {
|
|
949
|
+
const safe = sqlIdent(name);
|
|
950
|
+
const tables = await this.listTables();
|
|
951
|
+
if (!tables.includes(safe)) {
|
|
952
|
+
log3(`table "${safe}" not found, creating`);
|
|
953
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, GOALS_COLUMNS), safe);
|
|
954
|
+
log3(`table "${safe}" created`);
|
|
955
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
956
|
+
}
|
|
957
|
+
await this.healSchema(safe, GOALS_COLUMNS);
|
|
958
|
+
await this.ensureLookupIndex(safe, "goal_id_version", `("goal_id", "version")`);
|
|
959
|
+
await this.ensureLookupIndex(safe, "owner_status", `("owner", "status")`);
|
|
960
|
+
}
|
|
961
|
+
/**
|
|
962
|
+
* Create the kpis table.
|
|
963
|
+
*
|
|
964
|
+
* Backed by memory/kpi/<goal_id>/<kpi_id>.md. KPI rows do NOT carry
|
|
965
|
+
* owner — ownership derives from the parent goal via logical join on
|
|
966
|
+
* goal_id. INSERT-only version-bumped. (goal_id, kpi_id) index is the
|
|
967
|
+
* canonical lookup the VFS uses on Read and Write.
|
|
968
|
+
*/
|
|
969
|
+
async ensureKpisTable(name) {
|
|
970
|
+
const safe = sqlIdent(name);
|
|
971
|
+
const tables = await this.listTables();
|
|
972
|
+
if (!tables.includes(safe)) {
|
|
973
|
+
log3(`table "${safe}" not found, creating`);
|
|
974
|
+
await this.createTableWithRetry(buildCreateTableSql(safe, KPIS_COLUMNS), safe);
|
|
975
|
+
log3(`table "${safe}" created`);
|
|
976
|
+
if (!tables.includes(safe)) this._tablesCache = [...tables, safe];
|
|
977
|
+
}
|
|
978
|
+
await this.healSchema(safe, KPIS_COLUMNS);
|
|
979
|
+
await this.ensureLookupIndex(safe, "goal_id_kpi_id", `("goal_id", "kpi_id")`);
|
|
980
|
+
}
|
|
772
981
|
};
|
|
773
982
|
|
|
774
983
|
// src/shell/grep-core.ts
|
|
@@ -1528,7 +1737,7 @@ function loadCredsModule() {
|
|
|
1528
1737
|
return credsModulePromise;
|
|
1529
1738
|
}
|
|
1530
1739
|
function loadConfigModule() {
|
|
1531
|
-
if (!configModulePromise) configModulePromise = import("./chunks/config-
|
|
1740
|
+
if (!configModulePromise) configModulePromise = import("./chunks/config-FH6JYSJW.js");
|
|
1532
1741
|
return configModulePromise;
|
|
1533
1742
|
}
|
|
1534
1743
|
async function loadCredentials2() {
|
|
@@ -1584,7 +1793,7 @@ function extractLatestVersion(body) {
|
|
|
1584
1793
|
return typeof v === "string" && v.length > 0 ? v : null;
|
|
1585
1794
|
}
|
|
1586
1795
|
function getInstalledVersion() {
|
|
1587
|
-
return "0.7.
|
|
1796
|
+
return "0.7.47".length > 0 ? "0.7.47" : null;
|
|
1588
1797
|
}
|
|
1589
1798
|
function isNewer(latest, current) {
|
|
1590
1799
|
const parse = (v) => v.replace(/-.*$/, "").split(".").map(Number);
|
|
@@ -1684,6 +1893,8 @@ var api = null;
|
|
|
1684
1893
|
var sessionsTable = "sessions";
|
|
1685
1894
|
var memoryTable = "memory";
|
|
1686
1895
|
var skillsTable = "skills";
|
|
1896
|
+
var goalsTable = "hivemind_goals";
|
|
1897
|
+
var kpisTable = "hivemind_kpis";
|
|
1687
1898
|
var captureEnabled = true;
|
|
1688
1899
|
var capturedCounts = /* @__PURE__ */ new Map();
|
|
1689
1900
|
var fallbackSessionId = crypto.randomUUID();
|
|
@@ -1873,6 +2084,8 @@ async function getApi() {
|
|
|
1873
2084
|
sessionsTable = config.sessionsTableName;
|
|
1874
2085
|
memoryTable = config.tableName;
|
|
1875
2086
|
skillsTable = config.skillsTableName;
|
|
2087
|
+
goalsTable = config.goalsTableName;
|
|
2088
|
+
kpisTable = config.kpisTableName;
|
|
1876
2089
|
const candidate = new DeeplakeApi(config.token, config.apiUrl, config.orgId, config.workspaceId, config.tableName);
|
|
1877
2090
|
await candidate.ensureTable();
|
|
1878
2091
|
await candidate.ensureSessionsTable(sessionsTable);
|
|
@@ -2228,6 +2441,98 @@ ${body.slice(0, 500)}`;
|
|
|
2228
2441
|
}
|
|
2229
2442
|
}
|
|
2230
2443
|
});
|
|
2444
|
+
pluginApi.registerTool({
|
|
2445
|
+
name: "hivemind_goal_add",
|
|
2446
|
+
label: "Hivemind Goal Add",
|
|
2447
|
+
description: "Create a new Hivemind team goal. Persists to the org-shared hivemind_goals table \u2014 teammates see it on next SessionStart. Returns the generated goal_id. Use when the user wants to track a measurable objective or milestone.",
|
|
2448
|
+
parameters: {
|
|
2449
|
+
type: "object",
|
|
2450
|
+
additionalProperties: false,
|
|
2451
|
+
properties: {
|
|
2452
|
+
text: {
|
|
2453
|
+
type: "string",
|
|
2454
|
+
minLength: 1,
|
|
2455
|
+
description: "One-line goal description (e.g. 'ship the goals feature by Friday')."
|
|
2456
|
+
}
|
|
2457
|
+
},
|
|
2458
|
+
required: ["text"]
|
|
2459
|
+
},
|
|
2460
|
+
execute: async (_toolCallId, rawParams) => {
|
|
2461
|
+
const params = rawParams;
|
|
2462
|
+
const dl = await getApi();
|
|
2463
|
+
if (!dl) {
|
|
2464
|
+
return { content: [{ type: "text", text: "Not logged in. Run /hivemind_login first." }] };
|
|
2465
|
+
}
|
|
2466
|
+
try {
|
|
2467
|
+
const config2 = await loadConfig();
|
|
2468
|
+
const owner = config2?.userName ?? "unknown";
|
|
2469
|
+
await dl.ensureGoalsTable(goalsTable);
|
|
2470
|
+
const goalId = crypto.randomUUID();
|
|
2471
|
+
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
2472
|
+
const safe = goalsTable.replace(/[^A-Za-z0-9_]/g, "");
|
|
2473
|
+
await dl.query(
|
|
2474
|
+
`INSERT INTO "${safe}" (id, goal_id, owner, status, content, version, created_at, agent, plugin_version) VALUES ('${crypto.randomUUID()}', '${sqlStr(goalId)}', '${sqlStr(owner)}', 'opened', E'${sqlStr(params.text)}', 1, '${sqlStr(ts)}', 'openclaw', '')`
|
|
2475
|
+
);
|
|
2476
|
+
pluginApi.logger.info?.(`hivemind_goal_add \u2192 ${goalId}`);
|
|
2477
|
+
return { content: [{ type: "text", text: `Goal created.
|
|
2478
|
+
goal_id: ${goalId}
|
|
2479
|
+
owner: ${owner}
|
|
2480
|
+
status: opened
|
|
2481
|
+
text: ${params.text}` }], details: { goal_id: goalId } };
|
|
2482
|
+
} catch (err) {
|
|
2483
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
2484
|
+
pluginApi.logger.error(`hivemind_goal_add failed: ${msg}`);
|
|
2485
|
+
return { content: [{ type: "text", text: `Goal add failed: ${msg}` }] };
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
});
|
|
2489
|
+
pluginApi.registerTool({
|
|
2490
|
+
name: "hivemind_kpi_add",
|
|
2491
|
+
label: "Hivemind KPI Add",
|
|
2492
|
+
description: "Add a measurable KPI to an existing Hivemind goal. Persists to the org-shared hivemind_kpis table. Only call after the user has explicitly asked for KPIs \u2014 do NOT auto-generate them.",
|
|
2493
|
+
parameters: {
|
|
2494
|
+
type: "object",
|
|
2495
|
+
additionalProperties: false,
|
|
2496
|
+
properties: {
|
|
2497
|
+
goal_id: { type: "string", minLength: 1, description: "Existing goal_id (UUID) returned by hivemind_goal_add." },
|
|
2498
|
+
kpi_id: { type: "string", minLength: 1, description: "Short slug for this KPI (e.g. 'k-prs')." },
|
|
2499
|
+
target: { type: "integer", minimum: 1, description: "Positive integer target." },
|
|
2500
|
+
unit: { type: "string", minLength: 1, description: "Unit label (e.g. 'count', 'PRs', 'lines')." },
|
|
2501
|
+
name: { type: "string", description: "Optional human-readable name. Defaults to kpi_id." }
|
|
2502
|
+
},
|
|
2503
|
+
required: ["goal_id", "kpi_id", "target", "unit"]
|
|
2504
|
+
},
|
|
2505
|
+
execute: async (_toolCallId, rawParams) => {
|
|
2506
|
+
const params = rawParams;
|
|
2507
|
+
const dl = await getApi();
|
|
2508
|
+
if (!dl) {
|
|
2509
|
+
return { content: [{ type: "text", text: "Not logged in. Run /hivemind_login first." }] };
|
|
2510
|
+
}
|
|
2511
|
+
try {
|
|
2512
|
+
await dl.ensureKpisTable(kpisTable);
|
|
2513
|
+
const name = params.name ?? params.kpi_id;
|
|
2514
|
+
const content = `${name}
|
|
2515
|
+
|
|
2516
|
+
- target: ${params.target}
|
|
2517
|
+
- current: 0
|
|
2518
|
+
- unit: ${params.unit}`;
|
|
2519
|
+
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
2520
|
+
const safe = kpisTable.replace(/[^A-Za-z0-9_]/g, "");
|
|
2521
|
+
await dl.query(
|
|
2522
|
+
`INSERT INTO "${safe}" (id, goal_id, kpi_id, content, version, created_at, agent, plugin_version) VALUES ('${crypto.randomUUID()}', '${sqlStr(params.goal_id)}', '${sqlStr(params.kpi_id)}', E'${sqlStr(content)}', 1, '${sqlStr(ts)}', 'openclaw', '')`
|
|
2523
|
+
);
|
|
2524
|
+
pluginApi.logger.info?.(`hivemind_kpi_add \u2192 ${params.goal_id}/${params.kpi_id}`);
|
|
2525
|
+
return { content: [{ type: "text", text: `KPI added.
|
|
2526
|
+
goal_id: ${params.goal_id}
|
|
2527
|
+
kpi_id: ${params.kpi_id}
|
|
2528
|
+
target: ${params.target} ${params.unit}` }] };
|
|
2529
|
+
} catch (err) {
|
|
2530
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
2531
|
+
pluginApi.logger.error(`hivemind_kpi_add failed: ${msg}`);
|
|
2532
|
+
return { content: [{ type: "text", text: `KPI add failed: ${msg}` }] };
|
|
2533
|
+
}
|
|
2534
|
+
}
|
|
2535
|
+
});
|
|
2231
2536
|
pluginApi.registerMemoryCorpusSupplement({
|
|
2232
2537
|
search: async ({ query, maxResults }) => {
|
|
2233
2538
|
const dl = await getApi();
|
|
@@ -379,6 +379,65 @@ var SKILLS_COLUMNS = Object.freeze([
|
|
|
379
379
|
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
380
380
|
{ name: "updated_at", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
381
381
|
]);
|
|
382
|
+
var RULES_COLUMNS = Object.freeze([
|
|
383
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
384
|
+
{ name: "rule_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
385
|
+
{ name: "text", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
386
|
+
{ name: "scope", sql: "TEXT NOT NULL DEFAULT 'team'" },
|
|
387
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'active'" },
|
|
388
|
+
{ name: "assigned_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
389
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
390
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
391
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
392
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
393
|
+
]);
|
|
394
|
+
var TASKS_COLUMNS = Object.freeze([
|
|
395
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
396
|
+
{ name: "task_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
397
|
+
{ name: "text", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
398
|
+
{ name: "scope", sql: "TEXT NOT NULL DEFAULT 'me'" },
|
|
399
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'active'" },
|
|
400
|
+
{ name: "assigned_to", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
401
|
+
{ name: "assigned_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
402
|
+
{ name: "kpis", sql: "JSONB" },
|
|
403
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
404
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
405
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
406
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
407
|
+
]);
|
|
408
|
+
var TASK_EVENTS_COLUMNS = Object.freeze([
|
|
409
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
410
|
+
{ name: "task_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
411
|
+
{ name: "task_version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
412
|
+
{ name: "kpi_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
413
|
+
{ name: "value", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
414
|
+
{ name: "note", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
415
|
+
{ name: "source", sql: "TEXT NOT NULL DEFAULT 'user'" },
|
|
416
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
417
|
+
{ name: "ts", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
418
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
419
|
+
]);
|
|
420
|
+
var GOALS_COLUMNS = Object.freeze([
|
|
421
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
422
|
+
{ name: "goal_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
423
|
+
{ name: "owner", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
424
|
+
{ name: "status", sql: "TEXT NOT NULL DEFAULT 'opened'" },
|
|
425
|
+
{ name: "content", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
426
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
427
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
428
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
429
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
430
|
+
]);
|
|
431
|
+
var KPIS_COLUMNS = Object.freeze([
|
|
432
|
+
{ name: "id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
433
|
+
{ name: "goal_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
434
|
+
{ name: "kpi_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
435
|
+
{ name: "content", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
436
|
+
{ name: "version", sql: "BIGINT NOT NULL DEFAULT 1" },
|
|
437
|
+
{ name: "created_at", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
438
|
+
{ name: "agent", sql: "TEXT NOT NULL DEFAULT 'manual'" },
|
|
439
|
+
{ name: "plugin_version", sql: "TEXT NOT NULL DEFAULT ''" }
|
|
440
|
+
]);
|
|
382
441
|
function validateSchema(label, cols) {
|
|
383
442
|
const seen = /* @__PURE__ */ new Set();
|
|
384
443
|
for (const col of cols) {
|
|
@@ -396,9 +455,38 @@ function validateSchema(label, cols) {
|
|
|
396
455
|
}
|
|
397
456
|
}
|
|
398
457
|
}
|
|
458
|
+
var CODEBASE_COLUMNS = Object.freeze([
|
|
459
|
+
// Identity key (matches the PK below)
|
|
460
|
+
{ name: "org_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
461
|
+
{ name: "workspace_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
462
|
+
{ name: "repo_slug", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
463
|
+
{ name: "user_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
464
|
+
{ name: "worktree_id", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
465
|
+
{ name: "commit_sha", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
466
|
+
// Observation metadata
|
|
467
|
+
{ name: "parent_sha", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
468
|
+
{ name: "branch", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
469
|
+
{ name: "ts", sql: "TIMESTAMP" },
|
|
470
|
+
{ name: "pushed_by", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
471
|
+
// Snapshot payload
|
|
472
|
+
{ name: "snapshot_sha256", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
473
|
+
{ name: "snapshot_jsonb", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
474
|
+
{ name: "node_count", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
475
|
+
{ name: "edge_count", sql: "BIGINT NOT NULL DEFAULT 0" },
|
|
476
|
+
// Generator metadata (for drift diagnostics — what hivemind version produced this?)
|
|
477
|
+
{ name: "generator", sql: "TEXT NOT NULL DEFAULT 'hivemind-graph'" },
|
|
478
|
+
{ name: "generator_version", sql: "TEXT NOT NULL DEFAULT ''" },
|
|
479
|
+
{ name: "schema_version", sql: "BIGINT NOT NULL DEFAULT 1" }
|
|
480
|
+
]);
|
|
399
481
|
validateSchema("MEMORY_COLUMNS", MEMORY_COLUMNS);
|
|
400
482
|
validateSchema("SESSIONS_COLUMNS", SESSIONS_COLUMNS);
|
|
401
483
|
validateSchema("SKILLS_COLUMNS", SKILLS_COLUMNS);
|
|
484
|
+
validateSchema("RULES_COLUMNS", RULES_COLUMNS);
|
|
485
|
+
validateSchema("TASKS_COLUMNS", TASKS_COLUMNS);
|
|
486
|
+
validateSchema("TASK_EVENTS_COLUMNS", TASK_EVENTS_COLUMNS);
|
|
487
|
+
validateSchema("GOALS_COLUMNS", GOALS_COLUMNS);
|
|
488
|
+
validateSchema("KPIS_COLUMNS", KPIS_COLUMNS);
|
|
489
|
+
validateSchema("CODEBASE_COLUMNS", CODEBASE_COLUMNS);
|
|
402
490
|
function buildCreateTableSql(tableName, cols) {
|
|
403
491
|
const safe = sqlIdent(tableName);
|
|
404
492
|
const colSql = cols.map((c) => `${c.name} ${c.sql}`).join(", ");
|
|
@@ -694,9 +782,12 @@ function resolveRecordScope(args) {
|
|
|
694
782
|
|
|
695
783
|
// dist/src/skillify/state.js
|
|
696
784
|
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, writeSync, mkdirSync as mkdirSync2, renameSync as renameSync2, rmdirSync, existsSync as existsSync4, lstatSync, unlinkSync, openSync, closeSync } from "node:fs";
|
|
785
|
+
import { join as join6 } from "node:path";
|
|
786
|
+
|
|
787
|
+
// dist/src/utils/repo-identity.js
|
|
697
788
|
import { execSync } from "node:child_process";
|
|
698
789
|
import { createHash } from "node:crypto";
|
|
699
|
-
import {
|
|
790
|
+
import { basename, resolve } from "node:path";
|
|
700
791
|
|
|
701
792
|
// dist/src/skillify/legacy-migration.js
|
|
702
793
|
import { existsSync as existsSync3, renameSync } from "node:fs";
|
|
@@ -882,7 +973,7 @@ async function query(sql, retries = 4) {
|
|
|
882
973
|
const base = Math.min(3e4, 2e3 * Math.pow(2, attempt));
|
|
883
974
|
const delay = base + Math.floor(Math.random() * 1e3);
|
|
884
975
|
wlog(`fetch failed (${e?.name ?? e?.code ?? e?.message}), retrying in ${delay}ms (attempt ${attempt + 1}/${retries})`);
|
|
885
|
-
await new Promise((
|
|
976
|
+
await new Promise((resolve2) => setTimeout(resolve2, delay));
|
|
886
977
|
continue;
|
|
887
978
|
}
|
|
888
979
|
throw e;
|
|
@@ -898,7 +989,7 @@ async function query(sql, retries = 4) {
|
|
|
898
989
|
const base = Math.min(3e4, 2e3 * Math.pow(2, attempt));
|
|
899
990
|
const delay = base + Math.floor(Math.random() * 1e3);
|
|
900
991
|
wlog(`API ${r.status}, retrying in ${delay}ms (attempt ${attempt + 1}/${retries})`);
|
|
901
|
-
await new Promise((
|
|
992
|
+
await new Promise((resolve2) => setTimeout(resolve2, delay));
|
|
902
993
|
continue;
|
|
903
994
|
}
|
|
904
995
|
throw new Error(`API ${r.status}: ${(await r.text()).slice(0, 200)}`);
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
"tools": [
|
|
10
10
|
"hivemind_search",
|
|
11
11
|
"hivemind_read",
|
|
12
|
-
"hivemind_index"
|
|
12
|
+
"hivemind_index",
|
|
13
|
+
"hivemind_goal_add",
|
|
14
|
+
"hivemind_kpi_add"
|
|
13
15
|
],
|
|
14
16
|
"commands": [
|
|
15
17
|
"hivemind_login",
|
|
@@ -52,5 +54,5 @@
|
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
},
|
|
55
|
-
"version": "0.7.
|
|
57
|
+
"version": "0.7.47"
|
|
56
58
|
}
|
package/openclaw/package.json
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hivemind-goals
|
|
3
|
+
description: Create, track, and read team goals + KPIs via Hivemind from openclaw. Use whenever the user mentions a goal, objective, KPI, target, milestone, or asks to track progress on something measurable.
|
|
4
|
+
allowed-tools: hivemind_search, hivemind_read, hivemind_index, hivemind_goal_add, hivemind_kpi_add
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Hivemind Goals (openclaw)
|
|
8
|
+
|
|
9
|
+
OpenClaw exposes purpose-built tools for goals + KPIs. Use them directly — do NOT try to write files via the host filesystem.
|
|
10
|
+
|
|
11
|
+
## Tools
|
|
12
|
+
|
|
13
|
+
- `hivemind_goal_add({ text })` — create a new goal. Returns `goal_id` (UUID). Status starts at `opened`.
|
|
14
|
+
- `hivemind_kpi_add({ goal_id, kpi_id, target, unit, name? })` — add a KPI to an existing goal. Only call when the user explicitly asks for KPIs; do NOT auto-generate.
|
|
15
|
+
- `hivemind_search({ query })` — search Hivemind shared memory (summaries + sessions). Use this when the user asks "what's already there" before creating a duplicate.
|
|
16
|
+
- `hivemind_read({ path })` — read the full content of a specific Hivemind path.
|
|
17
|
+
- `hivemind_index({})` — list everything in memory.
|
|
18
|
+
|
|
19
|
+
## Workflow when the user expresses a goal
|
|
20
|
+
|
|
21
|
+
1. (Optional) `hivemind_search` first to surface any existing related goal.
|
|
22
|
+
2. `hivemind_goal_add({ text: "<short description>" })` — capture the returned `goal_id`.
|
|
23
|
+
3. ONLY if the user asks for KPIs: `hivemind_kpi_add` once per KPI with `goal_id` + `kpi_id` (short slug like `k-prs`) + `target` (positive int) + `unit`.
|
|
24
|
+
4. Confirm to the user with the goal_id and that the goal is team-visible.
|
|
25
|
+
|
|
26
|
+
## What NOT to do
|
|
27
|
+
|
|
28
|
+
- Do NOT write files anywhere under `~/.deeplake/memory/`. OpenClaw's runtime does not route filesystem writes to the Deeplake tables — only the `hivemind_*` tools above do.
|
|
29
|
+
- Do NOT call `hivemind_kpi_add` unsolicited. Wait for the user to ask.
|
|
30
|
+
- Do NOT use `hivemind_search` to *create* anything — it's read-only.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deeplake/hivemind",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.47",
|
|
4
4
|
"description": "Cloud-backed persistent shared memory for AI agents powered by Deeplake",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -52,11 +52,14 @@
|
|
|
52
52
|
"*.md": []
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
+
"@anthropic-ai/sdk": "^0.97.1",
|
|
55
56
|
"@huggingface/transformers": "^3.0.0",
|
|
56
57
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
57
58
|
"deeplake": "^0.3.30",
|
|
58
59
|
"js-yaml": "^4.1.1",
|
|
59
60
|
"just-bash": "^2.14.0",
|
|
61
|
+
"tree-sitter": "^0.21.1",
|
|
62
|
+
"tree-sitter-typescript": "^0.23.2",
|
|
60
63
|
"yargs-parser": "^22.0.0",
|
|
61
64
|
"zod": "^4.3.6"
|
|
62
65
|
},
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
globalThis.__hivemind_tuning__ ??= {};
|
|
2
|
-
|
|
3
|
-
// src/config.ts
|
|
4
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { homedir, userInfo } from "node:os";
|
|
7
|
-
function loadConfig() {
|
|
8
|
-
const home = homedir();
|
|
9
|
-
const credPath = join(home, ".deeplake", "credentials.json");
|
|
10
|
-
let creds = null;
|
|
11
|
-
if (existsSync(credPath)) {
|
|
12
|
-
try {
|
|
13
|
-
creds = JSON.parse(readFileSync(credPath, "utf-8"));
|
|
14
|
-
} catch {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
const token = creds?.token;
|
|
19
|
-
const orgId = creds?.orgId;
|
|
20
|
-
if (!token || !orgId) return null;
|
|
21
|
-
return {
|
|
22
|
-
token,
|
|
23
|
-
orgId,
|
|
24
|
-
orgName: creds?.orgName ?? orgId,
|
|
25
|
-
userName: creds?.userName || userInfo().username || "unknown",
|
|
26
|
-
workspaceId: creds?.workspaceId ?? "default",
|
|
27
|
-
apiUrl: creds?.apiUrl ?? "https://api.deeplake.ai",
|
|
28
|
-
tableName: "memory",
|
|
29
|
-
sessionsTableName: "sessions",
|
|
30
|
-
skillsTableName: process.env.HIVEMIND_SKILLS_TABLE ?? "skills",
|
|
31
|
-
memoryPath: join(home, ".deeplake", "memory")
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export {
|
|
35
|
-
loadConfig
|
|
36
|
-
};
|