signetai 0.185.4 → 0.185.5
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/dist/mcp-stdio.js +456 -24
- package/native-manifest.json +13 -13
- package/package.json +6 -6
package/dist/mcp-stdio.js
CHANGED
|
@@ -36498,6 +36498,14 @@ var EPISODIC_CAPTURED_AT_FLOOR = "2000-01-01T00:00:00.000Z";
|
|
|
36498
36498
|
function readNonEmptyTrimmed(value) {
|
|
36499
36499
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
36500
36500
|
}
|
|
36501
|
+
function tableHasColumn(db, table, column) {
|
|
36502
|
+
try {
|
|
36503
|
+
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
36504
|
+
return rows.some((row) => row.name === column);
|
|
36505
|
+
} catch {
|
|
36506
|
+
return false;
|
|
36507
|
+
}
|
|
36508
|
+
}
|
|
36501
36509
|
function sourceIdCandidates(value) {
|
|
36502
36510
|
const trimmed = value.trim();
|
|
36503
36511
|
const stripped = trimmed.replace(/^(memory|artifact|source|transcript|session|summary):/, "");
|
|
@@ -36580,15 +36588,18 @@ function readEpisodicArtifact(db, agentId, id) {
|
|
|
36580
36588
|
function readEpisodicTranscript(db, agentId, id) {
|
|
36581
36589
|
const ids = sourceIdCandidates(id);
|
|
36582
36590
|
const placeholders = ids.map(() => "?").join(", ");
|
|
36583
|
-
const
|
|
36584
|
-
|
|
36585
|
-
|
|
36586
|
-
|
|
36587
|
-
|
|
36588
|
-
|
|
36591
|
+
const hasUpdated = tableHasColumn(db, "session_transcripts", "updated_at");
|
|
36592
|
+
const hasCompleted = tableHasColumn(db, "session_transcripts", "completed_at");
|
|
36593
|
+
const updatedAt = hasUpdated ? "st.updated_at" : "NULL";
|
|
36594
|
+
const completedAt = hasCompleted ? "st.completed_at" : "NULL";
|
|
36595
|
+
const capturedAt = `COALESCE(${completedAt}, ${updatedAt}, st.created_at)`;
|
|
36596
|
+
const orderBy = `${capturedAt} DESC, st.created_at DESC`;
|
|
36597
|
+
const completed = hasCompleted ? "st.completed_at IS NOT NULL" : "0";
|
|
36598
|
+
const row = db.prepare(`SELECT st.session_key, st.content, st.harness, st.project, st.created_at, ${updatedAt} AS updated_at,
|
|
36599
|
+
${completedAt} AS completed_at, ${completed} AS completed
|
|
36589
36600
|
FROM session_transcripts AS st
|
|
36590
36601
|
WHERE st.agent_id = ? AND st.session_key IN (${placeholders})
|
|
36591
|
-
ORDER BY
|
|
36602
|
+
ORDER BY ${orderBy}
|
|
36592
36603
|
LIMIT 1`).get(agentId, ...ids);
|
|
36593
36604
|
if (!row)
|
|
36594
36605
|
return null;
|
|
@@ -36602,7 +36613,7 @@ function readEpisodicTranscript(db, agentId, id) {
|
|
|
36602
36613
|
sourcePath: null,
|
|
36603
36614
|
project: row.project,
|
|
36604
36615
|
harness: row.harness,
|
|
36605
|
-
capturedAt: row.updated_at ?? row.created_at,
|
|
36616
|
+
capturedAt: row.completed_at ?? row.updated_at ?? row.created_at,
|
|
36606
36617
|
evidenceMeta: null,
|
|
36607
36618
|
completed: row.completed === 1
|
|
36608
36619
|
};
|
|
@@ -36702,6 +36713,8 @@ function searchEpisodicSources(db, params) {
|
|
|
36702
36713
|
const like = `%${query}%`;
|
|
36703
36714
|
const sinceArgs = params.since !== undefined ? [params.since, EPISODIC_CAPTURED_AT_FLOOR] : [];
|
|
36704
36715
|
const beforeArgs = params.before !== undefined ? [params.before] : [];
|
|
36716
|
+
const transcriptSearchTime = tableHasColumn(db, "session_transcripts", "updated_at") ? "COALESCE(updated_at, created_at)" : "created_at";
|
|
36717
|
+
const transcriptCompleted = tableHasColumn(db, "session_transcripts", "completed_at") ? "completed_at IS NOT NULL" : "0";
|
|
36705
36718
|
const branches = [];
|
|
36706
36719
|
if (params.kind === undefined || params.kind === "memory") {
|
|
36707
36720
|
branches.push({
|
|
@@ -36736,15 +36749,15 @@ function searchEpisodicSources(db, params) {
|
|
|
36736
36749
|
}
|
|
36737
36750
|
if (params.kind === undefined || params.kind === "transcript") {
|
|
36738
36751
|
branches.push({
|
|
36739
|
-
sql: `SELECT 'transcript' AS kind, session_key AS id,
|
|
36752
|
+
sql: `SELECT 'transcript' AS kind, session_key AS id, ${transcriptSearchTime} AS captured_at
|
|
36740
36753
|
FROM session_transcripts
|
|
36741
|
-
WHERE agent_id = ? AND content LIKE ?
|
|
36742
|
-
${params.since ?
|
|
36743
|
-
${params.before ?
|
|
36754
|
+
WHERE agent_id = ? AND ${transcriptCompleted} AND content LIKE ?
|
|
36755
|
+
${params.since ? `AND (julianday(${transcriptSearchTime}) >= julianday(?) OR julianday(${transcriptSearchTime}) < julianday(?))` : ""}
|
|
36756
|
+
${params.before ? `AND julianday(${transcriptSearchTime}) <= julianday(?)` : ""}`,
|
|
36744
36757
|
args: [params.agentId, like, ...sinceArgs, ...beforeArgs]
|
|
36745
36758
|
});
|
|
36746
36759
|
}
|
|
36747
|
-
if (params.kind ===
|
|
36760
|
+
if (params.kind === "summary") {
|
|
36748
36761
|
branches.push({
|
|
36749
36762
|
sql: `SELECT 'summary' AS kind, id, latest_at AS captured_at
|
|
36750
36763
|
FROM session_summaries
|
|
@@ -36772,6 +36785,7 @@ UNION ALL
|
|
|
36772
36785
|
import { createRequire as createRequire2 } from "node:module";
|
|
36773
36786
|
import { dirname, join } from "node:path";
|
|
36774
36787
|
import { fileURLToPath } from "node:url";
|
|
36788
|
+
import { createHash } from "node:crypto";
|
|
36775
36789
|
import { homedir as homedir2 } from "os";
|
|
36776
36790
|
import { join as join2 } from "path";
|
|
36777
36791
|
import { createRequire as createRequire22 } from "node:module";
|
|
@@ -47570,6 +47584,224 @@ function up116(db) {
|
|
|
47570
47584
|
ON cross_agent_messages(delivery_path, delivery_state, delivery_lease_expires_at, delivery_updated_at);
|
|
47571
47585
|
`);
|
|
47572
47586
|
}
|
|
47587
|
+
function hasTable4(db, table) {
|
|
47588
|
+
return db.prepare("SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = ?").get(table) != null;
|
|
47589
|
+
}
|
|
47590
|
+
function addColumnIfMissing25(db, table, column, definition) {
|
|
47591
|
+
const columns = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
47592
|
+
if (columns.some((row) => row.name === column))
|
|
47593
|
+
return;
|
|
47594
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
47595
|
+
}
|
|
47596
|
+
function tableColumns(db, table) {
|
|
47597
|
+
const rows = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
47598
|
+
return new Set(rows.map((row) => typeof row.name === "string" ? row.name : ""));
|
|
47599
|
+
}
|
|
47600
|
+
function hashTranscript(content) {
|
|
47601
|
+
return createHash("sha256").update(content, "utf8").digest("hex");
|
|
47602
|
+
}
|
|
47603
|
+
function backfillTranscriptHashes(db) {
|
|
47604
|
+
const columns = tableColumns(db, "session_transcripts");
|
|
47605
|
+
if (!columns.has("content_hash") || !columns.has("content"))
|
|
47606
|
+
return;
|
|
47607
|
+
const rows = db.prepare("SELECT session_key, agent_id, content FROM session_transcripts WHERE content_hash IS NULL").all();
|
|
47608
|
+
const update = db.prepare("UPDATE session_transcripts SET content_hash = ? WHERE agent_id = ? AND session_key = ? AND content_hash IS NULL");
|
|
47609
|
+
for (const row of rows) {
|
|
47610
|
+
if (typeof row.content !== "string" || typeof row.session_key !== "string")
|
|
47611
|
+
continue;
|
|
47612
|
+
update.run(hashTranscript(row.content), typeof row.agent_id === "string" ? row.agent_id : "default", row.session_key);
|
|
47613
|
+
}
|
|
47614
|
+
}
|
|
47615
|
+
var COMPLETION_BOUNDARY_REASONS = new Set(["session_closed", "session_clear", "stale_session", "ttl_expired"]);
|
|
47616
|
+
function summaryJobTimestamp(job) {
|
|
47617
|
+
return job.completed_at ?? job.ended_at ?? job.captured_at ?? job.created_at ?? new Date(0).toISOString();
|
|
47618
|
+
}
|
|
47619
|
+
function laterTimestamp(current, candidate) {
|
|
47620
|
+
if (current === null)
|
|
47621
|
+
return candidate;
|
|
47622
|
+
if (candidate === null)
|
|
47623
|
+
return current;
|
|
47624
|
+
const currentMillis = Date.parse(current);
|
|
47625
|
+
const candidateMillis = Date.parse(candidate);
|
|
47626
|
+
if (Number.isFinite(currentMillis) && Number.isFinite(candidateMillis)) {
|
|
47627
|
+
return candidateMillis > currentMillis ? candidate : current;
|
|
47628
|
+
}
|
|
47629
|
+
return candidate > current ? candidate : current;
|
|
47630
|
+
}
|
|
47631
|
+
function isCompletionBoundary(job, columns) {
|
|
47632
|
+
return columns.has("trigger") && job.trigger === "session_end" || columns.has("boundary_reason") && COMPLETION_BOUNDARY_REASONS.has(job.boundary_reason ?? "");
|
|
47633
|
+
}
|
|
47634
|
+
function mergeTranscriptContent(current, next) {
|
|
47635
|
+
if (current.length === 0)
|
|
47636
|
+
return next;
|
|
47637
|
+
if (next.length === 0 || current === next || current.includes(next))
|
|
47638
|
+
return current;
|
|
47639
|
+
if (next.includes(current))
|
|
47640
|
+
return next;
|
|
47641
|
+
return `${current}
|
|
47642
|
+
${next}`;
|
|
47643
|
+
}
|
|
47644
|
+
function backfillTranscriptsFromSummaryJobs(db) {
|
|
47645
|
+
if (!hasTable4(db, "summary_jobs"))
|
|
47646
|
+
return;
|
|
47647
|
+
const summaryColumns = tableColumns(db, "summary_jobs");
|
|
47648
|
+
if (!summaryColumns.has("transcript"))
|
|
47649
|
+
return;
|
|
47650
|
+
const select = (name) => summaryColumns.has(name) ? `"${name}" AS "${name}"` : `NULL AS "${name}"`;
|
|
47651
|
+
const jobs = db.prepare(`SELECT ${[
|
|
47652
|
+
"id",
|
|
47653
|
+
"session_key",
|
|
47654
|
+
"transcript",
|
|
47655
|
+
"harness",
|
|
47656
|
+
"project",
|
|
47657
|
+
"agent_id",
|
|
47658
|
+
"trigger",
|
|
47659
|
+
"boundary_reason",
|
|
47660
|
+
"captured_at",
|
|
47661
|
+
"ended_at",
|
|
47662
|
+
"completed_at",
|
|
47663
|
+
"created_at"
|
|
47664
|
+
].map(select).join(", ")} FROM summary_jobs`).all();
|
|
47665
|
+
const candidates = new Map;
|
|
47666
|
+
for (const job of jobs) {
|
|
47667
|
+
if (typeof job.transcript !== "string" || job.transcript.trim().length === 0)
|
|
47668
|
+
continue;
|
|
47669
|
+
const agentId = typeof job.agent_id === "string" && job.agent_id.length > 0 ? job.agent_id : "default";
|
|
47670
|
+
const sessionKey = typeof job.session_key === "string" && job.session_key.trim().length > 0 ? job.session_key : `legacy-summary-job:${job.id ?? hashTranscript(`${summaryJobTimestamp(job)}\x00${job.transcript}`)}`;
|
|
47671
|
+
const key = `${agentId}\x00${sessionKey}`;
|
|
47672
|
+
const current = candidates.get(key);
|
|
47673
|
+
const timestamp = summaryJobTimestamp(job);
|
|
47674
|
+
const boundary = isCompletionBoundary(job, summaryColumns);
|
|
47675
|
+
const createdAt = job.captured_at ?? job.created_at ?? job.ended_at ?? timestamp;
|
|
47676
|
+
if (!current) {
|
|
47677
|
+
candidates.set(key, {
|
|
47678
|
+
sessionKey,
|
|
47679
|
+
job: { ...job, agent_id: agentId },
|
|
47680
|
+
content: job.transcript,
|
|
47681
|
+
createdAt,
|
|
47682
|
+
completedAt: boundary ? timestamp : null
|
|
47683
|
+
});
|
|
47684
|
+
continue;
|
|
47685
|
+
}
|
|
47686
|
+
const currentTimestamp = summaryJobTimestamp(current.job);
|
|
47687
|
+
const preferred = timestamp > currentTimestamp || timestamp === currentTimestamp && job.transcript.length > current.content.length ? { ...job, agent_id: agentId } : current.job;
|
|
47688
|
+
candidates.set(key, {
|
|
47689
|
+
sessionKey,
|
|
47690
|
+
job: preferred,
|
|
47691
|
+
content: mergeTranscriptContent(current.content, job.transcript),
|
|
47692
|
+
createdAt: current.createdAt < createdAt ? current.createdAt : createdAt,
|
|
47693
|
+
completedAt: laterTimestamp(current.completedAt, boundary ? timestamp : null)
|
|
47694
|
+
});
|
|
47695
|
+
}
|
|
47696
|
+
const transcriptColumns = tableColumns(db, "session_transcripts");
|
|
47697
|
+
const hasUpdated = transcriptColumns.has("updated_at");
|
|
47698
|
+
const hasCompleted = transcriptColumns.has("completed_at");
|
|
47699
|
+
const hasHash = transcriptColumns.has("content_hash");
|
|
47700
|
+
const insertColumns = ["session_key", "content", "harness", "project", "agent_id", "created_at"];
|
|
47701
|
+
if (hasUpdated)
|
|
47702
|
+
insertColumns.push("updated_at");
|
|
47703
|
+
if (hasCompleted)
|
|
47704
|
+
insertColumns.push("completed_at");
|
|
47705
|
+
if (hasHash)
|
|
47706
|
+
insertColumns.push("content_hash");
|
|
47707
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO session_transcripts (${insertColumns.join(", ")}) VALUES (${insertColumns.map(() => "?").join(", ")})`);
|
|
47708
|
+
const existing = db.prepare("SELECT content, completed_at FROM session_transcripts WHERE agent_id = ? AND session_key = ?");
|
|
47709
|
+
for (const candidate of candidates.values()) {
|
|
47710
|
+
const job = candidate.job;
|
|
47711
|
+
const agentId = job.agent_id ?? "default";
|
|
47712
|
+
const existingRow = existing.get(agentId, candidate.sessionKey);
|
|
47713
|
+
if (existingRow != null) {
|
|
47714
|
+
const previousContent = typeof existingRow.content === "string" ? existingRow.content : "";
|
|
47715
|
+
const mergedContent = mergeTranscriptContent(previousContent, candidate.content);
|
|
47716
|
+
const completedAt = typeof existingRow.completed_at === "string" && existingRow.completed_at.length > 0 ? existingRow.completed_at : candidate.completedAt;
|
|
47717
|
+
const assignments = ["content = ?"];
|
|
47718
|
+
const values2 = [mergedContent];
|
|
47719
|
+
if (hasUpdated && mergedContent !== previousContent) {
|
|
47720
|
+
assignments.push("updated_at = ?");
|
|
47721
|
+
values2.push(candidate.createdAt);
|
|
47722
|
+
}
|
|
47723
|
+
if (hasCompleted && completedAt && !existingRow.completed_at) {
|
|
47724
|
+
assignments.push("completed_at = ?");
|
|
47725
|
+
values2.push(completedAt);
|
|
47726
|
+
}
|
|
47727
|
+
if (hasHash) {
|
|
47728
|
+
assignments.push("content_hash = ?");
|
|
47729
|
+
values2.push(hashTranscript(mergedContent));
|
|
47730
|
+
}
|
|
47731
|
+
values2.push(agentId, candidate.sessionKey);
|
|
47732
|
+
db.prepare(`UPDATE session_transcripts SET ${assignments.join(", ")} WHERE agent_id = ? AND session_key = ?`).run(...values2);
|
|
47733
|
+
continue;
|
|
47734
|
+
}
|
|
47735
|
+
const values = [
|
|
47736
|
+
candidate.sessionKey,
|
|
47737
|
+
candidate.content,
|
|
47738
|
+
job.harness ?? null,
|
|
47739
|
+
job.project ?? null,
|
|
47740
|
+
agentId,
|
|
47741
|
+
candidate.createdAt
|
|
47742
|
+
];
|
|
47743
|
+
if (hasUpdated)
|
|
47744
|
+
values.push(candidate.createdAt);
|
|
47745
|
+
if (hasCompleted)
|
|
47746
|
+
values.push(candidate.completedAt);
|
|
47747
|
+
if (hasHash)
|
|
47748
|
+
values.push(hashTranscript(candidate.content));
|
|
47749
|
+
insert.run(...values);
|
|
47750
|
+
}
|
|
47751
|
+
}
|
|
47752
|
+
function up117(db) {
|
|
47753
|
+
if (!hasTable4(db, "session_transcripts"))
|
|
47754
|
+
return;
|
|
47755
|
+
addColumnIfMissing25(db, "session_transcripts", "completed_at", "TEXT");
|
|
47756
|
+
addColumnIfMissing25(db, "session_transcripts", "content_hash", "TEXT");
|
|
47757
|
+
backfillTranscriptHashes(db);
|
|
47758
|
+
if (hasTable4(db, "transcript_capture_jobs")) {
|
|
47759
|
+
const captureColumns = db.prepare("PRAGMA table_info(transcript_capture_jobs)").all();
|
|
47760
|
+
if (captureColumns.some((row) => row.name === "summary_status")) {
|
|
47761
|
+
db.exec("UPDATE transcript_capture_jobs SET summary_status = 'not_requested' WHERE summary_status IN ('pending', 'failed', 'skipped')");
|
|
47762
|
+
}
|
|
47763
|
+
}
|
|
47764
|
+
if (hasTable4(db, "summary_jobs")) {
|
|
47765
|
+
backfillTranscriptsFromSummaryJobs(db);
|
|
47766
|
+
backfillTranscriptHashes(db);
|
|
47767
|
+
const summaryColumns = tableColumns(db, "summary_jobs");
|
|
47768
|
+
const timestampParts = ["completed_at", "ended_at", "captured_at", "created_at"].filter((column) => summaryColumns.has(column)).map((column) => `sj.${column}`);
|
|
47769
|
+
const timestampValue = timestampParts.length === 1 ? timestampParts[0] : `COALESCE(${timestampParts.join(", ")})`;
|
|
47770
|
+
const completionTimestamp = timestampValue ? `MAX(${timestampValue})` : "NULL";
|
|
47771
|
+
const boundaryParts = [
|
|
47772
|
+
summaryColumns.has("trigger") ? "sj.trigger = 'session_end'" : null,
|
|
47773
|
+
summaryColumns.has("boundary_reason") ? "sj.boundary_reason IN ('session_closed', 'session_clear', 'stale_session', 'ttl_expired')" : null
|
|
47774
|
+
].filter((part) => part !== null);
|
|
47775
|
+
const boundaryPredicate = boundaryParts.length > 0 ? `(${boundaryParts.join(" OR ")})` : "1=1";
|
|
47776
|
+
const agentPredicate = summaryColumns.has("agent_id") ? "sj.agent_id = session_transcripts.agent_id" : "session_transcripts.agent_id = 'default'";
|
|
47777
|
+
if (completionTimestamp !== "NULL") {
|
|
47778
|
+
db.exec(`
|
|
47779
|
+
UPDATE session_transcripts
|
|
47780
|
+
SET completed_at = COALESCE(
|
|
47781
|
+
completed_at,
|
|
47782
|
+
(
|
|
47783
|
+
SELECT ${completionTimestamp}
|
|
47784
|
+
FROM summary_jobs AS sj
|
|
47785
|
+
WHERE ${agentPredicate}
|
|
47786
|
+
AND sj.session_key = session_transcripts.session_key
|
|
47787
|
+
AND ${boundaryPredicate}
|
|
47788
|
+
)
|
|
47789
|
+
)
|
|
47790
|
+
WHERE completed_at IS NULL;
|
|
47791
|
+
`);
|
|
47792
|
+
}
|
|
47793
|
+
db.exec("DELETE FROM summary_jobs");
|
|
47794
|
+
}
|
|
47795
|
+
const completionIndexColumns = ["agent_id", "completed_at"];
|
|
47796
|
+
if (tableColumns(db, "session_transcripts").has("updated_at"))
|
|
47797
|
+
completionIndexColumns.push("updated_at");
|
|
47798
|
+
db.exec(`
|
|
47799
|
+
CREATE INDEX IF NOT EXISTS idx_st_agent_completed
|
|
47800
|
+
ON session_transcripts(${completionIndexColumns.join(", ")});
|
|
47801
|
+
CREATE INDEX IF NOT EXISTS idx_st_agent_hash
|
|
47802
|
+
ON session_transcripts(agent_id, content_hash);
|
|
47803
|
+
`);
|
|
47804
|
+
}
|
|
47573
47805
|
var MIGRATIONS = [
|
|
47574
47806
|
{
|
|
47575
47807
|
version: 1,
|
|
@@ -48509,6 +48741,17 @@ var MIGRATIONS = [
|
|
|
48509
48741
|
{ table: "cross_agent_messages", column: "acp_target_agent_name" }
|
|
48510
48742
|
]
|
|
48511
48743
|
}
|
|
48744
|
+
},
|
|
48745
|
+
{
|
|
48746
|
+
version: 117,
|
|
48747
|
+
name: "retire-summary-worker",
|
|
48748
|
+
up: up117,
|
|
48749
|
+
artifacts: {
|
|
48750
|
+
columns: [
|
|
48751
|
+
{ table: "session_transcripts", column: "completed_at" },
|
|
48752
|
+
{ table: "session_transcripts", column: "content_hash" }
|
|
48753
|
+
]
|
|
48754
|
+
}
|
|
48512
48755
|
}
|
|
48513
48756
|
];
|
|
48514
48757
|
var LATEST_SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
|
|
@@ -49458,12 +49701,18 @@ function nextDreamingEvidenceFragment(source, start, maxChars) {
|
|
|
49458
49701
|
for (let index = cappedEnd - 1;index > start; index -= 1) {
|
|
49459
49702
|
const character = content[index];
|
|
49460
49703
|
const previous = content[index - 1];
|
|
49704
|
+
if (character === undefined || previous === undefined)
|
|
49705
|
+
continue;
|
|
49461
49706
|
if (character === `
|
|
49462
49707
|
` && previous === `
|
|
49463
49708
|
` || /\s/.test(character) && /[.!?]/.test(previous)) {
|
|
49464
49709
|
let boundaryEnd = index + 1;
|
|
49465
|
-
while (boundaryEnd < content.length
|
|
49710
|
+
while (boundaryEnd < content.length) {
|
|
49711
|
+
const next = content[boundaryEnd];
|
|
49712
|
+
if (next === undefined || !/\s/.test(next))
|
|
49713
|
+
break;
|
|
49466
49714
|
boundaryEnd += 1;
|
|
49715
|
+
}
|
|
49467
49716
|
if (boundaryEnd <= cappedEnd && content.slice(start, boundaryEnd).trim().length > 0) {
|
|
49468
49717
|
end = boundaryEnd;
|
|
49469
49718
|
break;
|
|
@@ -49520,10 +49769,189 @@ function renderDreamingEvidenceMeta(evidenceMeta) {
|
|
|
49520
49769
|
${lines.join(`
|
|
49521
49770
|
`)}` : "";
|
|
49522
49771
|
}
|
|
49772
|
+
function objectValue(value, key) {
|
|
49773
|
+
return value[key];
|
|
49774
|
+
}
|
|
49775
|
+
function stringValue(value) {
|
|
49776
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
49777
|
+
}
|
|
49778
|
+
function toolName(value) {
|
|
49779
|
+
const functionValue = value.function;
|
|
49780
|
+
if (typeof functionValue === "object" && functionValue !== null && !Array.isArray(functionValue)) {
|
|
49781
|
+
const name = stringValue(functionValue.name);
|
|
49782
|
+
if (name)
|
|
49783
|
+
return name;
|
|
49784
|
+
}
|
|
49785
|
+
for (const key of ["name", "tool", "tool_name", "toolName", "recipient_name"]) {
|
|
49786
|
+
const name = stringValue(objectValue(value, key));
|
|
49787
|
+
if (name)
|
|
49788
|
+
return name;
|
|
49789
|
+
}
|
|
49790
|
+
const item = value.item;
|
|
49791
|
+
if (typeof item === "object" && item !== null && !Array.isArray(item))
|
|
49792
|
+
return toolName(item);
|
|
49793
|
+
const payload = value.payload;
|
|
49794
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49795
|
+
const name = toolName(payload);
|
|
49796
|
+
if (name !== "tool")
|
|
49797
|
+
return name;
|
|
49798
|
+
}
|
|
49799
|
+
return "tool";
|
|
49800
|
+
}
|
|
49801
|
+
function toolMarker(value) {
|
|
49802
|
+
return `[tool call: ${toolName(value)}]`;
|
|
49803
|
+
}
|
|
49804
|
+
function contentText(value) {
|
|
49805
|
+
if (typeof value === "string")
|
|
49806
|
+
return value.trim().length > 0 ? [value.trim()] : [];
|
|
49807
|
+
if (!Array.isArray(value))
|
|
49808
|
+
return [];
|
|
49809
|
+
const text = [];
|
|
49810
|
+
for (const item of value) {
|
|
49811
|
+
if (typeof item === "string") {
|
|
49812
|
+
if (item.trim().length > 0)
|
|
49813
|
+
text.push(item.trim());
|
|
49814
|
+
continue;
|
|
49815
|
+
}
|
|
49816
|
+
if (typeof item !== "object" || item === null || Array.isArray(item))
|
|
49817
|
+
continue;
|
|
49818
|
+
const block = item;
|
|
49819
|
+
const type = stringValue(block.type)?.toLowerCase() ?? "";
|
|
49820
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result"].includes(type))
|
|
49821
|
+
continue;
|
|
49822
|
+
if (["tool_use", "tool_call", "function_call"].includes(type)) {
|
|
49823
|
+
text.push(toolMarker(block));
|
|
49824
|
+
continue;
|
|
49825
|
+
}
|
|
49826
|
+
const blockText = stringValue(block.text) ?? stringValue(block.content);
|
|
49827
|
+
if (blockText)
|
|
49828
|
+
text.push(blockText);
|
|
49829
|
+
}
|
|
49830
|
+
return text;
|
|
49831
|
+
}
|
|
49832
|
+
function jsonTranscriptLine(value) {
|
|
49833
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
49834
|
+
return [];
|
|
49835
|
+
const record5 = value;
|
|
49836
|
+
const nestedItem = record5.item;
|
|
49837
|
+
const item = typeof nestedItem === "object" && nestedItem !== null && !Array.isArray(nestedItem) ? nestedItem : record5;
|
|
49838
|
+
const type = (stringValue(item.type) ?? stringValue(record5.type) ?? "").toLowerCase();
|
|
49839
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result", "tool_output", "tool_return"].some((candidate) => type.includes(candidate))) {
|
|
49840
|
+
return [];
|
|
49841
|
+
}
|
|
49842
|
+
if (["tool_use", "tool_call", "function_call", "function_calling"].some((candidate) => type.includes(candidate))) {
|
|
49843
|
+
return [toolMarker(item)];
|
|
49844
|
+
}
|
|
49845
|
+
const role = (stringValue(item.role) ?? stringValue(record5.role) ?? "").toLowerCase();
|
|
49846
|
+
if (role === "tool" || role === "function")
|
|
49847
|
+
return [];
|
|
49848
|
+
const payload = record5.payload;
|
|
49849
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49850
|
+
const payloadRecord = payload;
|
|
49851
|
+
const payloadType = (stringValue(payloadRecord.type) ?? "").toLowerCase();
|
|
49852
|
+
if (payloadType.includes("tool") || payloadType.includes("function_call")) {
|
|
49853
|
+
if (payloadType.includes("result") || payloadType.includes("output"))
|
|
49854
|
+
return [];
|
|
49855
|
+
return [toolMarker(payloadRecord)];
|
|
49856
|
+
}
|
|
49857
|
+
const payloadRole = stringValue(payloadRecord.role)?.toLowerCase();
|
|
49858
|
+
const payloadText = contentText(payloadRecord.content ?? payloadRecord.text);
|
|
49859
|
+
if (payloadRole && payloadText.length > 0)
|
|
49860
|
+
return [`${payloadRole === "user" ? "User" : "Assistant"}: ${payloadText.join(`
|
|
49861
|
+
`)}`];
|
|
49862
|
+
}
|
|
49863
|
+
const text = contentText(item.content ?? item.text ?? item.message);
|
|
49864
|
+
if (text.length === 0)
|
|
49865
|
+
return [];
|
|
49866
|
+
const label = role === "user" ? "User" : role === "assistant" ? "Assistant" : role === "reasoning" ? "Assistant reasoning" : null;
|
|
49867
|
+
return label ? text.map((part) => `${label}: ${part}`) : text;
|
|
49868
|
+
}
|
|
49869
|
+
function sanitizePlainTranscript(content) {
|
|
49870
|
+
const withoutToolBlocks = content.replace(/<(?:tool_result|tool_output|function_result|function_output|tool_response)>[\s\S]*?<\/(?:tool_result|tool_output|function_result|function_output|tool_response)>/gi, "").replace(/<(?:tool_call|tool_use|function_call)(?:\s+([^>]*))?>[\s\S]*?<\/(?:tool_call|tool_use|function_call)>/gi, (_match, attributes) => {
|
|
49871
|
+
const name = /(?:name|tool)=["']([^"']+)["']/i.exec(attributes ?? "")?.[1] ?? "tool";
|
|
49872
|
+
return `[tool call: ${name}]`;
|
|
49873
|
+
});
|
|
49874
|
+
const lines = withoutToolBlocks.split(/\r?\n/);
|
|
49875
|
+
const kept = [];
|
|
49876
|
+
for (const line of lines) {
|
|
49877
|
+
const trimmed = line.trim();
|
|
49878
|
+
if (/^(?:tool[_ -]?(?:output|result)|function[_ -]?(?:output|result)|<tool_result|<tool_response)\b/i.test(trimmed))
|
|
49879
|
+
continue;
|
|
49880
|
+
if (/^(?:tool[_ -]?(?:call|use)|function[_ -]?call)\b/i.test(trimmed)) {
|
|
49881
|
+
const name = trimmed.split(/\s*[:=]\s*/, 2)[1]?.trim() || "tool";
|
|
49882
|
+
kept.push(`[tool call: ${name.replace(/[\s\[({].*$/, "")}]`);
|
|
49883
|
+
continue;
|
|
49884
|
+
}
|
|
49885
|
+
kept.push(line);
|
|
49886
|
+
}
|
|
49887
|
+
return kept.join(`
|
|
49888
|
+
`).replace(/\n{3,}/g, `
|
|
49889
|
+
|
|
49890
|
+
`).trim();
|
|
49891
|
+
}
|
|
49892
|
+
function isJsonTranscriptToolOutput(value) {
|
|
49893
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
49894
|
+
return false;
|
|
49895
|
+
const record5 = value;
|
|
49896
|
+
const nestedItem = record5.item;
|
|
49897
|
+
const item = typeof nestedItem === "object" && nestedItem !== null && !Array.isArray(nestedItem) ? nestedItem : record5;
|
|
49898
|
+
const type = (stringValue(item.type) ?? stringValue(record5.type) ?? "").toLowerCase();
|
|
49899
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result", "tool_output", "tool_return"].some((candidate) => type.includes(candidate)))
|
|
49900
|
+
return true;
|
|
49901
|
+
const role = (stringValue(item.role) ?? stringValue(record5.role) ?? "").toLowerCase();
|
|
49902
|
+
if (role === "tool" || role === "function")
|
|
49903
|
+
return true;
|
|
49904
|
+
const payload = record5.payload;
|
|
49905
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49906
|
+
const payloadRecord = payload;
|
|
49907
|
+
const payloadType = (stringValue(payloadRecord.type) ?? "").toLowerCase();
|
|
49908
|
+
const payloadRole = (stringValue(payloadRecord.role) ?? "").toLowerCase();
|
|
49909
|
+
return payloadType.includes("result") || payloadType.includes("output") || payloadRole === "tool" || payloadRole === "function";
|
|
49910
|
+
}
|
|
49911
|
+
return false;
|
|
49912
|
+
}
|
|
49913
|
+
function sanitizeTranscriptForDreaming(content) {
|
|
49914
|
+
const lines = content.split(/\r?\n/);
|
|
49915
|
+
const nonEmptyLines = lines.filter((line) => line.trim().length > 0);
|
|
49916
|
+
const jsonLines = [];
|
|
49917
|
+
let parsedLines = 0;
|
|
49918
|
+
let recognizedJsonLines = 0;
|
|
49919
|
+
for (const line of nonEmptyLines) {
|
|
49920
|
+
try {
|
|
49921
|
+
const parsed = JSON.parse(line.trim());
|
|
49922
|
+
parsedLines += 1;
|
|
49923
|
+
const rendered = jsonTranscriptLine(parsed);
|
|
49924
|
+
if (rendered.length > 0) {
|
|
49925
|
+
recognizedJsonLines += 1;
|
|
49926
|
+
jsonLines.push(...rendered);
|
|
49927
|
+
}
|
|
49928
|
+
} catch {}
|
|
49929
|
+
}
|
|
49930
|
+
if (parsedLines === nonEmptyLines.length && recognizedJsonLines > 0)
|
|
49931
|
+
return jsonLines.join(`
|
|
49932
|
+
`).trim();
|
|
49933
|
+
const mixedLines = lines.flatMap((line) => {
|
|
49934
|
+
const trimmed = line.trim();
|
|
49935
|
+
if (trimmed.length === 0)
|
|
49936
|
+
return [line];
|
|
49937
|
+
try {
|
|
49938
|
+
const parsed = JSON.parse(trimmed);
|
|
49939
|
+
const rendered = jsonTranscriptLine(parsed);
|
|
49940
|
+
if (rendered.length > 0)
|
|
49941
|
+
return rendered;
|
|
49942
|
+
if (isJsonTranscriptToolOutput(parsed))
|
|
49943
|
+
return [];
|
|
49944
|
+
} catch {}
|
|
49945
|
+
return [line];
|
|
49946
|
+
});
|
|
49947
|
+
return sanitizePlainTranscript(mixedLines.join(`
|
|
49948
|
+
`));
|
|
49949
|
+
}
|
|
49523
49950
|
function renderDreamingEvidence(source) {
|
|
49951
|
+
const content = source.kind === "transcript" || source.sourceKind === "transcript" ? sanitizeTranscriptForDreaming(source.content) : source.content;
|
|
49524
49952
|
const metadata = renderDreamingEvidenceMeta(source.evidenceMeta);
|
|
49525
|
-
return metadata ? `${
|
|
49526
|
-
${metadata}` :
|
|
49953
|
+
return metadata ? `${content}
|
|
49954
|
+
${metadata}` : content;
|
|
49527
49955
|
}
|
|
49528
49956
|
function createDreamingAgentEvidence(evidence) {
|
|
49529
49957
|
return evidence.map((item) => {
|
|
@@ -52940,8 +53368,9 @@ function citeEvidence(accessor, agentId, citation) {
|
|
|
52940
53368
|
return { evidence: null, sourceAgentIds: [] };
|
|
52941
53369
|
const result = accessor.withReadDb((db) => {
|
|
52942
53370
|
const source = readEpisodicSource(db, { agentId, from: requested.sourceRef });
|
|
52943
|
-
if (source !== null)
|
|
53371
|
+
if (source !== null && (source.kind !== "transcript" || source.completed)) {
|
|
52944
53372
|
return { evidence: createDreamingAgentEvidence([source]), sourceAgentIds: [] };
|
|
53373
|
+
}
|
|
52945
53374
|
return { evidence: [], sourceAgentIds: findEpisodicSourceAgentIds(db, requested.sourceRef) };
|
|
52946
53375
|
});
|
|
52947
53376
|
return {
|
|
@@ -53824,7 +54253,7 @@ function createDreamingCapabilities(params) {
|
|
|
53824
54253
|
}
|
|
53825
54254
|
return { ok: true, result: getOntologyLinkEvidence(accessor, { agentId: scopeId, id: ref3.id }) };
|
|
53826
54255
|
}),
|
|
53827
|
-
capability("search_evidence", "Search episodic evidence", "Full-text search immutable episodic memories, artifacts,
|
|
54256
|
+
capability("search_evidence", "Search episodic evidence", "Full-text search immutable episodic memories, artifacts, and transcripts in one agent scope. Historical summary records can be requested explicitly with kind=summary, but are not part of the default Dreaming delivery path. Results contain exact bounded excerpts of the rendered evidence with contentOffset/contentLength; use sourceRef for citations, which are validated against the complete canonical source. Each record carries completed: memory, artifact, and summary records are settled captures (true); a transcript is true only after the session-end machinery writes its completion marker, and false while the session is still running — do not file claims from a still-growing transcript, since its states may be contradicted by the session's end. If contentTruncated is true, page exact fragments with the same sourceRef and chunkSize: start at offset=0 when contentHasPrevious is true, then use offset=contentOffset+content.length from the fragment just returned until contentHasNext is false. Omit the query AND since to list the unprocessed window: the listing starts at the scope's evidence watermark (the last pass's surfaced frontier), so the newest unseen sources come first. Narrow with a query if the list is large; pass an explicit earlier since only when you need older history. Artifacts are deduped by content hash: content-identical files across vault paths collapse to one canonical entry.", true, exports_external.object({
|
|
53828
54257
|
agentId: exports_external.string().min(1),
|
|
53829
54258
|
query: exports_external.string().optional(),
|
|
53830
54259
|
since: exports_external.string().optional(),
|
|
@@ -53839,6 +54268,9 @@ function createDreamingCapabilities(params) {
|
|
|
53839
54268
|
const source = readEpisodicSource(db, { agentId: scopeId, from: sourceRef });
|
|
53840
54269
|
if (source === null)
|
|
53841
54270
|
return { ok: false, error: "Evidence source not found" };
|
|
54271
|
+
if (source.kind === "transcript" && !source.completed) {
|
|
54272
|
+
return { ok: false, error: "Transcript is still in progress" };
|
|
54273
|
+
}
|
|
53842
54274
|
const fragment = projectEvidenceFragment(source, Math.max(0, Math.floor(offset ?? 0)), Math.min(Math.max(Math.floor(chunkSize ?? MAX_EVIDENCE_EXCERPT_CHARS), 1), MAX_EVIDENCE_EXCERPT_CHARS));
|
|
53843
54275
|
return fragment === null ? { ok: false, error: "Evidence fragment offset is outside the source" } : { ok: true, items: [fragment] };
|
|
53844
54276
|
}
|
|
@@ -55447,8 +55879,8 @@ function errorResult(msg) {
|
|
|
55447
55879
|
isError: true
|
|
55448
55880
|
};
|
|
55449
55881
|
}
|
|
55450
|
-
async function graphIqToolResult(args, label,
|
|
55451
|
-
const access = graphIqToolAccess(
|
|
55882
|
+
async function graphIqToolResult(args, label, toolName2, pluginHostProvider) {
|
|
55883
|
+
const access = graphIqToolAccess(toolName2, pluginHostProvider());
|
|
55452
55884
|
if (!access.ok)
|
|
55453
55885
|
return errorResult(access.error);
|
|
55454
55886
|
try {
|
|
@@ -55469,8 +55901,8 @@ ${stderr}`);
|
|
|
55469
55901
|
return errorResult(`${label}: ${message}`);
|
|
55470
55902
|
}
|
|
55471
55903
|
}
|
|
55472
|
-
function graphIqToolAccess(
|
|
55473
|
-
const resolved = GRAPHIQ_COMPAT_ALIASES.get(
|
|
55904
|
+
function graphIqToolAccess(toolName2, pluginHost) {
|
|
55905
|
+
const resolved = GRAPHIQ_COMPAT_ALIASES.get(toolName2) ?? toolName2;
|
|
55474
55906
|
const plugin = pluginHost.get(SIGNET_GRAPHIQ_PLUGIN_ID);
|
|
55475
55907
|
const pluginActive = plugin?.state === "active" || plugin?.state === "degraded";
|
|
55476
55908
|
if (!pluginActive) {
|
|
@@ -55496,8 +55928,8 @@ function sanitizeToolSegment(value) {
|
|
|
55496
55928
|
const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
55497
55929
|
return normalized.length > 0 ? normalized : "tool";
|
|
55498
55930
|
}
|
|
55499
|
-
function buildProxyToolName(used, serverId,
|
|
55500
|
-
const base = `signet_${sanitizeToolSegment(serverId)}_${sanitizeToolSegment(
|
|
55931
|
+
function buildProxyToolName(used, serverId, toolName2) {
|
|
55932
|
+
const base = `signet_${sanitizeToolSegment(serverId)}_${sanitizeToolSegment(toolName2)}`;
|
|
55501
55933
|
if (!used.has(base)) {
|
|
55502
55934
|
used.add(base);
|
|
55503
55935
|
return base;
|
package/native-manifest.json
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.185.
|
|
3
|
+
"version": "0.185.5",
|
|
4
4
|
"assets": [
|
|
5
5
|
{
|
|
6
6
|
"name": "signet-darwin-arm64",
|
|
7
7
|
"platform": "darwin-arm64",
|
|
8
|
-
"sha256": "
|
|
9
|
-
"size":
|
|
8
|
+
"sha256": "a21bfe6c9e7bb50e58907a2f97562b91c2aeb80455e0f4b550d656a624b58c8c",
|
|
9
|
+
"size": 117606304
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"name": "signet-darwin-x64",
|
|
13
13
|
"platform": "darwin-x64",
|
|
14
|
-
"sha256": "
|
|
15
|
-
"size":
|
|
14
|
+
"sha256": "d44f1c9f5000ddb26b0fc04e473937087e712f5c46b65dad3005cb7a889a9ebe",
|
|
15
|
+
"size": 122227264
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"name": "signet-linux-arm64",
|
|
19
19
|
"platform": "linux-arm64",
|
|
20
|
-
"sha256": "
|
|
21
|
-
"size":
|
|
20
|
+
"sha256": "9e10952521ef512aea40db2de54adb6d3e4b8b6993dd8a1d0a416222786ed6cd",
|
|
21
|
+
"size": 154845735
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"name": "signet-linux-x64",
|
|
25
25
|
"platform": "linux-x64",
|
|
26
|
-
"sha256": "
|
|
27
|
-
"size":
|
|
26
|
+
"sha256": "ac3d8e682a51bd6a16f91023bfbfa6d9cf3340113bbf6731179ec1a845a8588b",
|
|
27
|
+
"size": 155404720
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"name": "signet-win32-x64.exe",
|
|
31
31
|
"platform": "win32-x64",
|
|
32
|
-
"sha256": "
|
|
33
|
-
"size":
|
|
32
|
+
"sha256": "bbd21424c33bf6101215b94794c95b5adbbcb810cbcd6f5787b456c470534274",
|
|
33
|
+
"size": 171537920
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"components": {
|
|
37
37
|
"connectors": {
|
|
38
|
-
"url": "signet-connectors-0.185.
|
|
39
|
-
"sha256": "
|
|
38
|
+
"url": "signet-connectors-0.185.5.tar.gz",
|
|
39
|
+
"sha256": "7505ac398e4aa655255bc19dc0026097e5354fcfa48e3e2ebff25026d8784422",
|
|
40
40
|
"size": 16888
|
|
41
41
|
}
|
|
42
42
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "signetai",
|
|
3
|
-
"version": "0.185.
|
|
3
|
+
"version": "0.185.5",
|
|
4
4
|
"description": "Signet native CLI installer wrapper",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
67
|
"optionalDependencies": {
|
|
68
|
-
"signetai-darwin-arm64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.
|
|
69
|
-
"signetai-darwin-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.
|
|
70
|
-
"signetai-linux-arm64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.
|
|
71
|
-
"signetai-linux-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.
|
|
72
|
-
"signetai-win32-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.
|
|
68
|
+
"signetai-darwin-arm64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.5/signetai-darwin-arm64-0.185.5.tgz",
|
|
69
|
+
"signetai-darwin-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.5/signetai-darwin-x64-0.185.5.tgz",
|
|
70
|
+
"signetai-linux-arm64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.5/signetai-linux-arm64-0.185.5.tgz",
|
|
71
|
+
"signetai-linux-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.5/signetai-linux-x64-0.185.5.tgz",
|
|
72
|
+
"signetai-win32-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.5/signetai-win32-x64-0.185.5.tgz"
|
|
73
73
|
}
|
|
74
74
|
}
|