@askexenow/exe-os 0.9.60 → 0.9.62
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/deploy/stack-manifests/v0.9.json +62 -13
- package/dist/bin/backfill-conversations.js +282 -7
- package/dist/bin/backfill-responses.js +282 -7
- package/dist/bin/backfill-vectors.js +119 -7
- package/dist/bin/cc-doctor.js +376 -0
- package/dist/bin/cleanup-stale-review-tasks.js +282 -7
- package/dist/bin/cli.js +455 -77
- package/dist/bin/customer-readiness.js +33 -0
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +3 -3
- package/dist/bin/exe-assign.js +282 -7
- package/dist/bin/exe-boot.js +125 -13
- package/dist/bin/exe-call.js +3 -3
- package/dist/bin/exe-cloud.js +2 -2
- package/dist/bin/exe-dispatch.js +282 -7
- package/dist/bin/exe-doctor.js +119 -7
- package/dist/bin/exe-export-behaviors.js +282 -7
- package/dist/bin/exe-forget.js +336 -7
- package/dist/bin/exe-gateway.js +282 -7
- package/dist/bin/exe-heartbeat.js +284 -9
- package/dist/bin/exe-kill.js +282 -7
- package/dist/bin/exe-launch-agent.js +282 -7
- package/dist/bin/exe-link.js +121 -9
- package/dist/bin/exe-new-employee.js +50 -21
- package/dist/bin/exe-pending-messages.js +282 -7
- package/dist/bin/exe-pending-notifications.js +282 -7
- package/dist/bin/exe-pending-reviews.js +282 -7
- package/dist/bin/exe-rename.js +282 -7
- package/dist/bin/exe-review.js +282 -7
- package/dist/bin/exe-search.js +306 -8
- package/dist/bin/exe-session-cleanup.js +282 -7
- package/dist/bin/exe-settings.js +2 -2
- package/dist/bin/exe-start-codex.js +326 -21
- package/dist/bin/exe-start-opencode.js +304 -10
- package/dist/bin/exe-status.js +282 -7
- package/dist/bin/exe-team.js +282 -7
- package/dist/bin/git-sweep.js +282 -7
- package/dist/bin/graph-backfill.js +282 -7
- package/dist/bin/graph-export.js +282 -7
- package/dist/bin/install.js +58 -33
- package/dist/bin/intercom-check.js +282 -7
- package/dist/bin/pre-build-guard.js +98 -0
- package/dist/bin/scan-tasks.js +282 -7
- package/dist/bin/setup.js +122 -10
- package/dist/bin/shard-migrate.js +282 -7
- package/dist/bin/stack-update.js +79 -11
- package/dist/bin/update.js +2 -2
- package/dist/gateway/index.js +288 -13
- package/dist/hooks/bug-report-worker.js +282 -7
- package/dist/hooks/codex-stop-task-finalizer.js +282 -7
- package/dist/hooks/commit-complete.js +282 -7
- package/dist/hooks/error-recall.js +306 -8
- package/dist/hooks/exe-heartbeat-hook.js +2 -2
- package/dist/hooks/ingest-worker.js +2 -2
- package/dist/hooks/ingest.js +282 -7
- package/dist/hooks/instructions-loaded.js +282 -7
- package/dist/hooks/notification.js +282 -7
- package/dist/hooks/post-compact.js +282 -7
- package/dist/hooks/post-tool-combined.js +306 -8
- package/dist/hooks/pre-compact.js +282 -7
- package/dist/hooks/pre-tool-use.js +282 -7
- package/dist/hooks/prompt-submit.js +306 -8
- package/dist/hooks/session-end.js +282 -7
- package/dist/hooks/session-start.js +308 -10
- package/dist/hooks/stop.js +282 -7
- package/dist/hooks/subagent-stop.js +282 -7
- package/dist/hooks/summary-worker.js +125 -13
- package/dist/index.js +288 -13
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +121 -9
- package/dist/lib/config.js +2 -2
- package/dist/lib/consolidation.js +2 -2
- package/dist/lib/database.js +115 -3
- package/dist/lib/db-daemon-client.js +2 -2
- package/dist/lib/db.js +115 -3
- package/dist/lib/device-registry.js +115 -3
- package/dist/lib/embedder.js +2 -2
- package/dist/lib/employee-templates.js +3 -3
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -2
- package/dist/lib/exe-daemon.js +339 -31
- package/dist/lib/hybrid-search.js +306 -8
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +2 -2
- package/dist/lib/reminders.js +2 -2
- package/dist/lib/schedules.js +119 -7
- package/dist/lib/skill-learning.js +2 -2
- package/dist/lib/store.js +282 -7
- package/dist/lib/task-router.js +2 -2
- package/dist/lib/tasks.js +2 -2
- package/dist/lib/tmux-routing.js +2 -2
- package/dist/lib/token-spend.js +2 -2
- package/dist/mcp/server.js +339 -31
- package/dist/mcp/tools/complete-reminder.js +2 -2
- package/dist/mcp/tools/create-reminder.js +2 -2
- package/dist/mcp/tools/create-task.js +2 -2
- package/dist/mcp/tools/deactivate-behavior.js +2 -2
- package/dist/mcp/tools/list-reminders.js +2 -2
- package/dist/mcp/tools/list-tasks.js +2 -2
- package/dist/mcp/tools/send-message.js +2 -2
- package/dist/mcp/tools/update-task.js +2 -2
- package/dist/runtime/index.js +282 -7
- package/dist/tui/App.js +290 -15
- package/package.json +3 -2
- package/stack.release.json +23 -7
|
@@ -258,8 +258,8 @@ var init_config = __esm({
|
|
|
258
258
|
rerankerAutoTrigger: {
|
|
259
259
|
enabled: true,
|
|
260
260
|
broadQueryMinCardinality: 5e4,
|
|
261
|
-
fetchTopK:
|
|
262
|
-
returnTopK:
|
|
261
|
+
fetchTopK: 200,
|
|
262
|
+
returnTopK: 20
|
|
263
263
|
}
|
|
264
264
|
},
|
|
265
265
|
graphRagEnabled: true,
|
|
@@ -2515,7 +2515,7 @@ async function ensureSchema() {
|
|
|
2515
2515
|
ON session_kills(agent_id);
|
|
2516
2516
|
`);
|
|
2517
2517
|
await client.execute(`
|
|
2518
|
-
CREATE TABLE IF NOT EXISTS
|
|
2518
|
+
CREATE TABLE IF NOT EXISTS company_procedures (
|
|
2519
2519
|
id TEXT PRIMARY KEY,
|
|
2520
2520
|
title TEXT NOT NULL,
|
|
2521
2521
|
content TEXT NOT NULL,
|
|
@@ -2526,6 +2526,73 @@ async function ensureSchema() {
|
|
|
2526
2526
|
updated_at TEXT NOT NULL
|
|
2527
2527
|
)
|
|
2528
2528
|
`);
|
|
2529
|
+
const legacyProcedureObject = await client.execute({
|
|
2530
|
+
sql: "SELECT type FROM sqlite_master WHERE name = 'global_procedures'",
|
|
2531
|
+
args: []
|
|
2532
|
+
});
|
|
2533
|
+
const legacyProcedureType = legacyProcedureObject.rows[0]?.type == null ? null : String(legacyProcedureObject.rows[0].type);
|
|
2534
|
+
if (legacyProcedureType === "table") {
|
|
2535
|
+
await client.execute(`
|
|
2536
|
+
INSERT OR IGNORE INTO company_procedures
|
|
2537
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
2538
|
+
SELECT id, title, content, priority, domain, active, created_at, updated_at
|
|
2539
|
+
FROM global_procedures
|
|
2540
|
+
`);
|
|
2541
|
+
await client.executeMultiple(`
|
|
2542
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_insert
|
|
2543
|
+
AFTER INSERT ON global_procedures
|
|
2544
|
+
BEGIN
|
|
2545
|
+
INSERT OR IGNORE INTO company_procedures
|
|
2546
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
2547
|
+
VALUES
|
|
2548
|
+
(NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
|
|
2549
|
+
END;
|
|
2550
|
+
|
|
2551
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_update
|
|
2552
|
+
AFTER UPDATE ON global_procedures
|
|
2553
|
+
BEGIN
|
|
2554
|
+
UPDATE company_procedures
|
|
2555
|
+
SET title = NEW.title,
|
|
2556
|
+
content = NEW.content,
|
|
2557
|
+
priority = NEW.priority,
|
|
2558
|
+
domain = NEW.domain,
|
|
2559
|
+
active = NEW.active,
|
|
2560
|
+
created_at = NEW.created_at,
|
|
2561
|
+
updated_at = NEW.updated_at
|
|
2562
|
+
WHERE id = OLD.id;
|
|
2563
|
+
END;
|
|
2564
|
+
`);
|
|
2565
|
+
} else {
|
|
2566
|
+
await client.execute(`
|
|
2567
|
+
CREATE VIEW IF NOT EXISTS global_procedures AS
|
|
2568
|
+
SELECT id, title, content, priority, domain, active, created_at, updated_at
|
|
2569
|
+
FROM company_procedures
|
|
2570
|
+
`);
|
|
2571
|
+
await client.executeMultiple(`
|
|
2572
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_insert
|
|
2573
|
+
INSTEAD OF INSERT ON global_procedures
|
|
2574
|
+
BEGIN
|
|
2575
|
+
INSERT INTO company_procedures
|
|
2576
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
2577
|
+
VALUES
|
|
2578
|
+
(NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
|
|
2579
|
+
END;
|
|
2580
|
+
|
|
2581
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_update
|
|
2582
|
+
INSTEAD OF UPDATE ON global_procedures
|
|
2583
|
+
BEGIN
|
|
2584
|
+
UPDATE company_procedures
|
|
2585
|
+
SET title = NEW.title,
|
|
2586
|
+
content = NEW.content,
|
|
2587
|
+
priority = NEW.priority,
|
|
2588
|
+
domain = NEW.domain,
|
|
2589
|
+
active = NEW.active,
|
|
2590
|
+
created_at = NEW.created_at,
|
|
2591
|
+
updated_at = NEW.updated_at
|
|
2592
|
+
WHERE id = OLD.id;
|
|
2593
|
+
END;
|
|
2594
|
+
`);
|
|
2595
|
+
}
|
|
2529
2596
|
await client.executeMultiple(`
|
|
2530
2597
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
2531
2598
|
id TEXT PRIMARY KEY,
|
|
@@ -2665,6 +2732,51 @@ async function ensureSchema() {
|
|
|
2665
2732
|
VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
|
|
2666
2733
|
END;
|
|
2667
2734
|
`);
|
|
2735
|
+
await client.executeMultiple(`
|
|
2736
|
+
CREATE TABLE IF NOT EXISTS memory_cards (
|
|
2737
|
+
id TEXT PRIMARY KEY,
|
|
2738
|
+
memory_id TEXT NOT NULL,
|
|
2739
|
+
agent_id TEXT NOT NULL,
|
|
2740
|
+
session_id TEXT NOT NULL,
|
|
2741
|
+
project_name TEXT,
|
|
2742
|
+
timestamp TEXT NOT NULL,
|
|
2743
|
+
card_type TEXT NOT NULL,
|
|
2744
|
+
subject TEXT,
|
|
2745
|
+
predicate TEXT,
|
|
2746
|
+
object TEXT,
|
|
2747
|
+
content TEXT NOT NULL,
|
|
2748
|
+
source_ref TEXT,
|
|
2749
|
+
confidence REAL DEFAULT 0.6,
|
|
2750
|
+
active INTEGER DEFAULT 1,
|
|
2751
|
+
created_at TEXT NOT NULL
|
|
2752
|
+
);
|
|
2753
|
+
|
|
2754
|
+
CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
|
|
2755
|
+
ON memory_cards(agent_id, active, timestamp);
|
|
2756
|
+
|
|
2757
|
+
CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
|
|
2758
|
+
ON memory_cards(memory_id);
|
|
2759
|
+
|
|
2760
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
|
|
2761
|
+
USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
|
|
2762
|
+
|
|
2763
|
+
CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
|
|
2764
|
+
INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
|
|
2765
|
+
VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
|
|
2766
|
+
END;
|
|
2767
|
+
|
|
2768
|
+
CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
|
|
2769
|
+
INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
|
|
2770
|
+
VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
|
|
2771
|
+
END;
|
|
2772
|
+
|
|
2773
|
+
CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
|
|
2774
|
+
INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
|
|
2775
|
+
VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
|
|
2776
|
+
INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
|
|
2777
|
+
VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
|
|
2778
|
+
END;
|
|
2779
|
+
`);
|
|
2668
2780
|
try {
|
|
2669
2781
|
await client.execute({
|
|
2670
2782
|
sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
|
|
@@ -3874,7 +3986,7 @@ var init_platform_procedures = __esm({
|
|
|
3874
3986
|
title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
|
|
3875
3987
|
domain: "tool-use",
|
|
3876
3988
|
priority: "p1",
|
|
3877
|
-
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done.
|
|
3989
|
+
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done. company_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: global_procedure, store_global_procedure, list_global_procedures, deactivate_global_procedure."
|
|
3878
3990
|
}
|
|
3879
3991
|
];
|
|
3880
3992
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -3895,7 +4007,7 @@ import { randomUUID as randomUUID2 } from "crypto";
|
|
|
3895
4007
|
async function loadGlobalProcedures() {
|
|
3896
4008
|
const client = getClient();
|
|
3897
4009
|
const result = await client.execute({
|
|
3898
|
-
sql: "SELECT * FROM
|
|
4010
|
+
sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
|
|
3899
4011
|
args: []
|
|
3900
4012
|
});
|
|
3901
4013
|
const allRows = result.rows;
|
|
@@ -3924,7 +4036,7 @@ async function storeGlobalProcedure(input) {
|
|
|
3924
4036
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3925
4037
|
const client = getClient();
|
|
3926
4038
|
await client.execute({
|
|
3927
|
-
sql: `INSERT INTO
|
|
4039
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
|
|
3928
4040
|
VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
3929
4041
|
args: [id, input.title, input.content, input.priority ?? "p0", input.domain ?? null, now, now]
|
|
3930
4042
|
});
|
|
@@ -3935,7 +4047,7 @@ async function deactivateGlobalProcedure(id) {
|
|
|
3935
4047
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3936
4048
|
const client = getClient();
|
|
3937
4049
|
const result = await client.execute({
|
|
3938
|
-
sql: "UPDATE
|
|
4050
|
+
sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
|
|
3939
4051
|
args: [now, id]
|
|
3940
4052
|
});
|
|
3941
4053
|
await loadGlobalProcedures();
|
|
@@ -3954,6 +4066,164 @@ ${p.content}`).join("\n\n");
|
|
|
3954
4066
|
}
|
|
3955
4067
|
});
|
|
3956
4068
|
|
|
4069
|
+
// src/lib/memory-cards.ts
|
|
4070
|
+
var memory_cards_exports = {};
|
|
4071
|
+
__export(memory_cards_exports, {
|
|
4072
|
+
extractMemoryCards: () => extractMemoryCards,
|
|
4073
|
+
insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
|
|
4074
|
+
searchMemoryCards: () => searchMemoryCards
|
|
4075
|
+
});
|
|
4076
|
+
import { createHash as createHash2 } from "crypto";
|
|
4077
|
+
function stableId(memoryId, type, content) {
|
|
4078
|
+
return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
|
|
4079
|
+
}
|
|
4080
|
+
function cleanText(text) {
|
|
4081
|
+
return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
4082
|
+
}
|
|
4083
|
+
function splitSentences(text) {
|
|
4084
|
+
return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
|
|
4085
|
+
}
|
|
4086
|
+
function inferCardType(sentence, toolName) {
|
|
4087
|
+
const lower = sentence.toLowerCase();
|
|
4088
|
+
if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
|
|
4089
|
+
if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
|
|
4090
|
+
if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
|
|
4091
|
+
if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
|
|
4092
|
+
if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
|
|
4093
|
+
return "fact";
|
|
4094
|
+
}
|
|
4095
|
+
function extractSubject(sentence, agentId) {
|
|
4096
|
+
const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
|
|
4097
|
+
return explicit?.[1] ?? agentId;
|
|
4098
|
+
}
|
|
4099
|
+
function predicateFor(type) {
|
|
4100
|
+
switch (type) {
|
|
4101
|
+
case "preference":
|
|
4102
|
+
return "prefers";
|
|
4103
|
+
case "belief_update":
|
|
4104
|
+
return "updated";
|
|
4105
|
+
case "decision":
|
|
4106
|
+
return "decided";
|
|
4107
|
+
case "event":
|
|
4108
|
+
return "happened";
|
|
4109
|
+
case "code":
|
|
4110
|
+
return "implemented";
|
|
4111
|
+
default:
|
|
4112
|
+
return "states";
|
|
4113
|
+
}
|
|
4114
|
+
}
|
|
4115
|
+
function extractMemoryCards(row) {
|
|
4116
|
+
const sentences = splitSentences(row.raw_text);
|
|
4117
|
+
const cards = [];
|
|
4118
|
+
for (const sentence of sentences) {
|
|
4119
|
+
const type = inferCardType(sentence, row.tool_name);
|
|
4120
|
+
const subject = extractSubject(sentence, row.agent_id);
|
|
4121
|
+
const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
|
|
4122
|
+
cards.push({
|
|
4123
|
+
id: stableId(row.id, type, content),
|
|
4124
|
+
memory_id: row.id,
|
|
4125
|
+
agent_id: row.agent_id,
|
|
4126
|
+
session_id: row.session_id,
|
|
4127
|
+
project_name: row.project_name ?? null,
|
|
4128
|
+
timestamp: row.timestamp,
|
|
4129
|
+
card_type: type,
|
|
4130
|
+
subject,
|
|
4131
|
+
predicate: predicateFor(type),
|
|
4132
|
+
object: content,
|
|
4133
|
+
content,
|
|
4134
|
+
source_ref: row.id,
|
|
4135
|
+
confidence: type === "fact" ? 0.55 : 0.65
|
|
4136
|
+
});
|
|
4137
|
+
if (cards.length >= MAX_CARDS_PER_MEMORY) break;
|
|
4138
|
+
}
|
|
4139
|
+
return cards;
|
|
4140
|
+
}
|
|
4141
|
+
async function insertMemoryCardsForBatch(rows) {
|
|
4142
|
+
const cards = rows.flatMap(extractMemoryCards);
|
|
4143
|
+
if (cards.length === 0) return 0;
|
|
4144
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
4145
|
+
const client = getClient();
|
|
4146
|
+
const stmts = cards.map((card) => ({
|
|
4147
|
+
sql: `INSERT OR IGNORE INTO memory_cards
|
|
4148
|
+
(id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
|
|
4149
|
+
subject, predicate, object, content, source_ref, confidence, active, created_at)
|
|
4150
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
|
|
4151
|
+
args: [
|
|
4152
|
+
card.id,
|
|
4153
|
+
card.memory_id,
|
|
4154
|
+
card.agent_id,
|
|
4155
|
+
card.session_id,
|
|
4156
|
+
card.project_name,
|
|
4157
|
+
card.timestamp,
|
|
4158
|
+
card.card_type,
|
|
4159
|
+
card.subject,
|
|
4160
|
+
card.predicate,
|
|
4161
|
+
card.object,
|
|
4162
|
+
card.content,
|
|
4163
|
+
card.source_ref,
|
|
4164
|
+
card.confidence,
|
|
4165
|
+
now
|
|
4166
|
+
]
|
|
4167
|
+
}));
|
|
4168
|
+
await client.batch(stmts, "write");
|
|
4169
|
+
return cards.length;
|
|
4170
|
+
}
|
|
4171
|
+
function buildMatchExpr(queryText) {
|
|
4172
|
+
const terms = queryText.toLowerCase().split(/\s+/).filter((t) => t.length >= 3).map((t) => t.replace(/[^a-z0-9_]/g, "")).filter((t) => t.length >= 3).slice(0, 12);
|
|
4173
|
+
if (terms.length === 0) return null;
|
|
4174
|
+
return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
|
|
4175
|
+
}
|
|
4176
|
+
async function searchMemoryCards(queryText, agentId, options) {
|
|
4177
|
+
const limit = options?.limit ?? 10;
|
|
4178
|
+
const matchExpr = buildMatchExpr(queryText);
|
|
4179
|
+
if (!matchExpr) return [];
|
|
4180
|
+
let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
|
|
4181
|
+
c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
|
|
4182
|
+
FROM memory_cards c
|
|
4183
|
+
JOIN memory_cards_fts fts ON c.rowid = fts.rowid
|
|
4184
|
+
WHERE memory_cards_fts MATCH ?
|
|
4185
|
+
AND c.agent_id = ?
|
|
4186
|
+
AND COALESCE(c.active, 1) = 1`;
|
|
4187
|
+
const args = [matchExpr, agentId];
|
|
4188
|
+
if (options?.projectName) {
|
|
4189
|
+
sql += ` AND c.project_name = ?`;
|
|
4190
|
+
args.push(options.projectName);
|
|
4191
|
+
}
|
|
4192
|
+
if (options?.since) {
|
|
4193
|
+
sql += ` AND c.timestamp >= ?`;
|
|
4194
|
+
args.push(options.since);
|
|
4195
|
+
}
|
|
4196
|
+
sql += ` ORDER BY rank LIMIT ?`;
|
|
4197
|
+
args.push(limit);
|
|
4198
|
+
const result = await getClient().execute({ sql, args });
|
|
4199
|
+
return result.rows.map((row) => ({
|
|
4200
|
+
id: `card:${String(row.id)}`,
|
|
4201
|
+
agent_id: String(row.agent_id),
|
|
4202
|
+
agent_role: "memory_card",
|
|
4203
|
+
session_id: String(row.session_id),
|
|
4204
|
+
timestamp: String(row.timestamp),
|
|
4205
|
+
tool_name: `memory_card:${String(row.card_type)}`,
|
|
4206
|
+
project_name: row.project_name == null ? "" : String(row.project_name),
|
|
4207
|
+
has_error: false,
|
|
4208
|
+
raw_text: `[${String(row.card_type)}] ${String(row.content)}
|
|
4209
|
+
Source memory: ${String(row.source_ref ?? row.memory_id)}`,
|
|
4210
|
+
vector: [],
|
|
4211
|
+
importance: 6,
|
|
4212
|
+
status: "active",
|
|
4213
|
+
confidence: Number(row.confidence ?? 0.6),
|
|
4214
|
+
last_accessed: String(row.timestamp)
|
|
4215
|
+
}));
|
|
4216
|
+
}
|
|
4217
|
+
var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
|
|
4218
|
+
var init_memory_cards = __esm({
|
|
4219
|
+
"src/lib/memory-cards.ts"() {
|
|
4220
|
+
"use strict";
|
|
4221
|
+
init_database();
|
|
4222
|
+
MAX_CARDS_PER_MEMORY = 6;
|
|
4223
|
+
MAX_SENTENCE_CHARS = 360;
|
|
4224
|
+
}
|
|
4225
|
+
});
|
|
4226
|
+
|
|
3957
4227
|
// src/lib/store.ts
|
|
3958
4228
|
var store_exports = {};
|
|
3959
4229
|
__export(store_exports, {
|
|
@@ -4292,6 +4562,11 @@ async function flushBatch() {
|
|
|
4292
4562
|
const globalClient = getClient();
|
|
4293
4563
|
const globalStmts = batch.map(buildStmt);
|
|
4294
4564
|
await globalClient.batch(globalStmts, "write");
|
|
4565
|
+
try {
|
|
4566
|
+
const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
|
|
4567
|
+
await insertMemoryCardsForBatch2(batch);
|
|
4568
|
+
} catch {
|
|
4569
|
+
}
|
|
4295
4570
|
schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
|
|
4296
4571
|
_pendingRecords.splice(0, batch.length);
|
|
4297
4572
|
try {
|