@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`,
|
|
@@ -4405,7 +4517,7 @@ var init_platform_procedures = __esm({
|
|
|
4405
4517
|
title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
|
|
4406
4518
|
domain: "tool-use",
|
|
4407
4519
|
priority: "p1",
|
|
4408
|
-
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.
|
|
4520
|
+
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."
|
|
4409
4521
|
}
|
|
4410
4522
|
];
|
|
4411
4523
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -4426,7 +4538,7 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
4426
4538
|
async function loadGlobalProcedures() {
|
|
4427
4539
|
const client = getClient();
|
|
4428
4540
|
const result = await client.execute({
|
|
4429
|
-
sql: "SELECT * FROM
|
|
4541
|
+
sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
|
|
4430
4542
|
args: []
|
|
4431
4543
|
});
|
|
4432
4544
|
const allRows = result.rows;
|
|
@@ -4455,7 +4567,7 @@ async function storeGlobalProcedure(input) {
|
|
|
4455
4567
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
4456
4568
|
const client = getClient();
|
|
4457
4569
|
await client.execute({
|
|
4458
|
-
sql: `INSERT INTO
|
|
4570
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
|
|
4459
4571
|
VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
4460
4572
|
args: [id, input.title, input.content, input.priority ?? "p0", input.domain ?? null, now, now]
|
|
4461
4573
|
});
|
|
@@ -4466,7 +4578,7 @@ async function deactivateGlobalProcedure(id) {
|
|
|
4466
4578
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
4467
4579
|
const client = getClient();
|
|
4468
4580
|
const result = await client.execute({
|
|
4469
|
-
sql: "UPDATE
|
|
4581
|
+
sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
|
|
4470
4582
|
args: [now, id]
|
|
4471
4583
|
});
|
|
4472
4584
|
await loadGlobalProcedures();
|
|
@@ -4485,6 +4597,164 @@ ${p.content}`).join("\n\n");
|
|
|
4485
4597
|
}
|
|
4486
4598
|
});
|
|
4487
4599
|
|
|
4600
|
+
// src/lib/memory-cards.ts
|
|
4601
|
+
var memory_cards_exports = {};
|
|
4602
|
+
__export(memory_cards_exports, {
|
|
4603
|
+
extractMemoryCards: () => extractMemoryCards,
|
|
4604
|
+
insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
|
|
4605
|
+
searchMemoryCards: () => searchMemoryCards
|
|
4606
|
+
});
|
|
4607
|
+
import { createHash as createHash2 } from "crypto";
|
|
4608
|
+
function stableId(memoryId, type, content) {
|
|
4609
|
+
return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
|
|
4610
|
+
}
|
|
4611
|
+
function cleanText(text) {
|
|
4612
|
+
return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
4613
|
+
}
|
|
4614
|
+
function splitSentences(text) {
|
|
4615
|
+
return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
|
|
4616
|
+
}
|
|
4617
|
+
function inferCardType(sentence, toolName) {
|
|
4618
|
+
const lower = sentence.toLowerCase();
|
|
4619
|
+
if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
|
|
4620
|
+
if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
|
|
4621
|
+
if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
|
|
4622
|
+
if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
|
|
4623
|
+
if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
|
|
4624
|
+
return "fact";
|
|
4625
|
+
}
|
|
4626
|
+
function extractSubject(sentence, agentId) {
|
|
4627
|
+
const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
|
|
4628
|
+
return explicit?.[1] ?? agentId;
|
|
4629
|
+
}
|
|
4630
|
+
function predicateFor(type) {
|
|
4631
|
+
switch (type) {
|
|
4632
|
+
case "preference":
|
|
4633
|
+
return "prefers";
|
|
4634
|
+
case "belief_update":
|
|
4635
|
+
return "updated";
|
|
4636
|
+
case "decision":
|
|
4637
|
+
return "decided";
|
|
4638
|
+
case "event":
|
|
4639
|
+
return "happened";
|
|
4640
|
+
case "code":
|
|
4641
|
+
return "implemented";
|
|
4642
|
+
default:
|
|
4643
|
+
return "states";
|
|
4644
|
+
}
|
|
4645
|
+
}
|
|
4646
|
+
function extractMemoryCards(row) {
|
|
4647
|
+
const sentences = splitSentences(row.raw_text);
|
|
4648
|
+
const cards = [];
|
|
4649
|
+
for (const sentence of sentences) {
|
|
4650
|
+
const type = inferCardType(sentence, row.tool_name);
|
|
4651
|
+
const subject = extractSubject(sentence, row.agent_id);
|
|
4652
|
+
const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
|
|
4653
|
+
cards.push({
|
|
4654
|
+
id: stableId(row.id, type, content),
|
|
4655
|
+
memory_id: row.id,
|
|
4656
|
+
agent_id: row.agent_id,
|
|
4657
|
+
session_id: row.session_id,
|
|
4658
|
+
project_name: row.project_name ?? null,
|
|
4659
|
+
timestamp: row.timestamp,
|
|
4660
|
+
card_type: type,
|
|
4661
|
+
subject,
|
|
4662
|
+
predicate: predicateFor(type),
|
|
4663
|
+
object: content,
|
|
4664
|
+
content,
|
|
4665
|
+
source_ref: row.id,
|
|
4666
|
+
confidence: type === "fact" ? 0.55 : 0.65
|
|
4667
|
+
});
|
|
4668
|
+
if (cards.length >= MAX_CARDS_PER_MEMORY) break;
|
|
4669
|
+
}
|
|
4670
|
+
return cards;
|
|
4671
|
+
}
|
|
4672
|
+
async function insertMemoryCardsForBatch(rows) {
|
|
4673
|
+
const cards = rows.flatMap(extractMemoryCards);
|
|
4674
|
+
if (cards.length === 0) return 0;
|
|
4675
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
4676
|
+
const client = getClient();
|
|
4677
|
+
const stmts = cards.map((card) => ({
|
|
4678
|
+
sql: `INSERT OR IGNORE INTO memory_cards
|
|
4679
|
+
(id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
|
|
4680
|
+
subject, predicate, object, content, source_ref, confidence, active, created_at)
|
|
4681
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
|
|
4682
|
+
args: [
|
|
4683
|
+
card.id,
|
|
4684
|
+
card.memory_id,
|
|
4685
|
+
card.agent_id,
|
|
4686
|
+
card.session_id,
|
|
4687
|
+
card.project_name,
|
|
4688
|
+
card.timestamp,
|
|
4689
|
+
card.card_type,
|
|
4690
|
+
card.subject,
|
|
4691
|
+
card.predicate,
|
|
4692
|
+
card.object,
|
|
4693
|
+
card.content,
|
|
4694
|
+
card.source_ref,
|
|
4695
|
+
card.confidence,
|
|
4696
|
+
now
|
|
4697
|
+
]
|
|
4698
|
+
}));
|
|
4699
|
+
await client.batch(stmts, "write");
|
|
4700
|
+
return cards.length;
|
|
4701
|
+
}
|
|
4702
|
+
function buildMatchExpr(queryText) {
|
|
4703
|
+
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);
|
|
4704
|
+
if (terms.length === 0) return null;
|
|
4705
|
+
return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
|
|
4706
|
+
}
|
|
4707
|
+
async function searchMemoryCards(queryText, agentId, options) {
|
|
4708
|
+
const limit = options?.limit ?? 10;
|
|
4709
|
+
const matchExpr = buildMatchExpr(queryText);
|
|
4710
|
+
if (!matchExpr) return [];
|
|
4711
|
+
let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
|
|
4712
|
+
c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
|
|
4713
|
+
FROM memory_cards c
|
|
4714
|
+
JOIN memory_cards_fts fts ON c.rowid = fts.rowid
|
|
4715
|
+
WHERE memory_cards_fts MATCH ?
|
|
4716
|
+
AND c.agent_id = ?
|
|
4717
|
+
AND COALESCE(c.active, 1) = 1`;
|
|
4718
|
+
const args = [matchExpr, agentId];
|
|
4719
|
+
if (options?.projectName) {
|
|
4720
|
+
sql += ` AND c.project_name = ?`;
|
|
4721
|
+
args.push(options.projectName);
|
|
4722
|
+
}
|
|
4723
|
+
if (options?.since) {
|
|
4724
|
+
sql += ` AND c.timestamp >= ?`;
|
|
4725
|
+
args.push(options.since);
|
|
4726
|
+
}
|
|
4727
|
+
sql += ` ORDER BY rank LIMIT ?`;
|
|
4728
|
+
args.push(limit);
|
|
4729
|
+
const result = await getClient().execute({ sql, args });
|
|
4730
|
+
return result.rows.map((row) => ({
|
|
4731
|
+
id: `card:${String(row.id)}`,
|
|
4732
|
+
agent_id: String(row.agent_id),
|
|
4733
|
+
agent_role: "memory_card",
|
|
4734
|
+
session_id: String(row.session_id),
|
|
4735
|
+
timestamp: String(row.timestamp),
|
|
4736
|
+
tool_name: `memory_card:${String(row.card_type)}`,
|
|
4737
|
+
project_name: row.project_name == null ? "" : String(row.project_name),
|
|
4738
|
+
has_error: false,
|
|
4739
|
+
raw_text: `[${String(row.card_type)}] ${String(row.content)}
|
|
4740
|
+
Source memory: ${String(row.source_ref ?? row.memory_id)}`,
|
|
4741
|
+
vector: [],
|
|
4742
|
+
importance: 6,
|
|
4743
|
+
status: "active",
|
|
4744
|
+
confidence: Number(row.confidence ?? 0.6),
|
|
4745
|
+
last_accessed: String(row.timestamp)
|
|
4746
|
+
}));
|
|
4747
|
+
}
|
|
4748
|
+
var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
|
|
4749
|
+
var init_memory_cards = __esm({
|
|
4750
|
+
"src/lib/memory-cards.ts"() {
|
|
4751
|
+
"use strict";
|
|
4752
|
+
init_database();
|
|
4753
|
+
MAX_CARDS_PER_MEMORY = 6;
|
|
4754
|
+
MAX_SENTENCE_CHARS = 360;
|
|
4755
|
+
}
|
|
4756
|
+
});
|
|
4757
|
+
|
|
4488
4758
|
// src/lib/store.ts
|
|
4489
4759
|
var store_exports = {};
|
|
4490
4760
|
__export(store_exports, {
|
|
@@ -4823,6 +5093,11 @@ async function flushBatch() {
|
|
|
4823
5093
|
const globalClient = getClient();
|
|
4824
5094
|
const globalStmts = batch.map(buildStmt);
|
|
4825
5095
|
await globalClient.batch(globalStmts, "write");
|
|
5096
|
+
try {
|
|
5097
|
+
const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
|
|
5098
|
+
await insertMemoryCardsForBatch2(batch);
|
|
5099
|
+
} catch {
|
|
5100
|
+
}
|
|
4826
5101
|
schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
|
|
4827
5102
|
_pendingRecords.splice(0, batch.length);
|
|
4828
5103
|
try {
|