signetai 0.185.4 → 0.185.6
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 +477 -24
- package/native-manifest.json +14 -14
- 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,240 @@ 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
|
+
}
|
|
47805
|
+
function up118(db) {
|
|
47806
|
+
db.exec(`
|
|
47807
|
+
CREATE INDEX IF NOT EXISTS idx_memory_jobs_pressure_status
|
|
47808
|
+
ON memory_jobs(status)
|
|
47809
|
+
WHERE status IN ('pending', 'leased') AND job_type <> 'extract';
|
|
47810
|
+
CREATE INDEX IF NOT EXISTS idx_memory_jobs_pressure_created_at
|
|
47811
|
+
ON memory_jobs(created_at)
|
|
47812
|
+
WHERE status IN ('pending', 'leased') AND job_type <> 'extract';
|
|
47813
|
+
CREATE INDEX IF NOT EXISTS idx_summary_jobs_pressure_status
|
|
47814
|
+
ON summary_jobs(status)
|
|
47815
|
+
WHERE status IN ('pending', 'leased');
|
|
47816
|
+
CREATE INDEX IF NOT EXISTS idx_summary_jobs_pressure_created_at
|
|
47817
|
+
ON summary_jobs(created_at)
|
|
47818
|
+
WHERE status IN ('pending', 'leased');
|
|
47819
|
+
`);
|
|
47820
|
+
}
|
|
47573
47821
|
var MIGRATIONS = [
|
|
47574
47822
|
{
|
|
47575
47823
|
version: 1,
|
|
@@ -48509,6 +48757,22 @@ var MIGRATIONS = [
|
|
|
48509
48757
|
{ table: "cross_agent_messages", column: "acp_target_agent_name" }
|
|
48510
48758
|
]
|
|
48511
48759
|
}
|
|
48760
|
+
},
|
|
48761
|
+
{
|
|
48762
|
+
version: 117,
|
|
48763
|
+
name: "retire-summary-worker",
|
|
48764
|
+
up: up117,
|
|
48765
|
+
artifacts: {
|
|
48766
|
+
columns: [
|
|
48767
|
+
{ table: "session_transcripts", column: "completed_at" },
|
|
48768
|
+
{ table: "session_transcripts", column: "content_hash" }
|
|
48769
|
+
]
|
|
48770
|
+
}
|
|
48771
|
+
},
|
|
48772
|
+
{
|
|
48773
|
+
version: 118,
|
|
48774
|
+
name: "queue-pressure-indices",
|
|
48775
|
+
up: up118
|
|
48512
48776
|
}
|
|
48513
48777
|
];
|
|
48514
48778
|
var LATEST_SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
|
|
@@ -49458,12 +49722,18 @@ function nextDreamingEvidenceFragment(source, start, maxChars) {
|
|
|
49458
49722
|
for (let index = cappedEnd - 1;index > start; index -= 1) {
|
|
49459
49723
|
const character = content[index];
|
|
49460
49724
|
const previous = content[index - 1];
|
|
49725
|
+
if (character === undefined || previous === undefined)
|
|
49726
|
+
continue;
|
|
49461
49727
|
if (character === `
|
|
49462
49728
|
` && previous === `
|
|
49463
49729
|
` || /\s/.test(character) && /[.!?]/.test(previous)) {
|
|
49464
49730
|
let boundaryEnd = index + 1;
|
|
49465
|
-
while (boundaryEnd < content.length
|
|
49731
|
+
while (boundaryEnd < content.length) {
|
|
49732
|
+
const next = content[boundaryEnd];
|
|
49733
|
+
if (next === undefined || !/\s/.test(next))
|
|
49734
|
+
break;
|
|
49466
49735
|
boundaryEnd += 1;
|
|
49736
|
+
}
|
|
49467
49737
|
if (boundaryEnd <= cappedEnd && content.slice(start, boundaryEnd).trim().length > 0) {
|
|
49468
49738
|
end = boundaryEnd;
|
|
49469
49739
|
break;
|
|
@@ -49520,10 +49790,189 @@ function renderDreamingEvidenceMeta(evidenceMeta) {
|
|
|
49520
49790
|
${lines.join(`
|
|
49521
49791
|
`)}` : "";
|
|
49522
49792
|
}
|
|
49793
|
+
function objectValue(value, key) {
|
|
49794
|
+
return value[key];
|
|
49795
|
+
}
|
|
49796
|
+
function stringValue(value) {
|
|
49797
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
49798
|
+
}
|
|
49799
|
+
function toolName(value) {
|
|
49800
|
+
const functionValue = value.function;
|
|
49801
|
+
if (typeof functionValue === "object" && functionValue !== null && !Array.isArray(functionValue)) {
|
|
49802
|
+
const name = stringValue(functionValue.name);
|
|
49803
|
+
if (name)
|
|
49804
|
+
return name;
|
|
49805
|
+
}
|
|
49806
|
+
for (const key of ["name", "tool", "tool_name", "toolName", "recipient_name"]) {
|
|
49807
|
+
const name = stringValue(objectValue(value, key));
|
|
49808
|
+
if (name)
|
|
49809
|
+
return name;
|
|
49810
|
+
}
|
|
49811
|
+
const item = value.item;
|
|
49812
|
+
if (typeof item === "object" && item !== null && !Array.isArray(item))
|
|
49813
|
+
return toolName(item);
|
|
49814
|
+
const payload = value.payload;
|
|
49815
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49816
|
+
const name = toolName(payload);
|
|
49817
|
+
if (name !== "tool")
|
|
49818
|
+
return name;
|
|
49819
|
+
}
|
|
49820
|
+
return "tool";
|
|
49821
|
+
}
|
|
49822
|
+
function toolMarker(value) {
|
|
49823
|
+
return `[tool call: ${toolName(value)}]`;
|
|
49824
|
+
}
|
|
49825
|
+
function contentText(value) {
|
|
49826
|
+
if (typeof value === "string")
|
|
49827
|
+
return value.trim().length > 0 ? [value.trim()] : [];
|
|
49828
|
+
if (!Array.isArray(value))
|
|
49829
|
+
return [];
|
|
49830
|
+
const text = [];
|
|
49831
|
+
for (const item of value) {
|
|
49832
|
+
if (typeof item === "string") {
|
|
49833
|
+
if (item.trim().length > 0)
|
|
49834
|
+
text.push(item.trim());
|
|
49835
|
+
continue;
|
|
49836
|
+
}
|
|
49837
|
+
if (typeof item !== "object" || item === null || Array.isArray(item))
|
|
49838
|
+
continue;
|
|
49839
|
+
const block = item;
|
|
49840
|
+
const type = stringValue(block.type)?.toLowerCase() ?? "";
|
|
49841
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result"].includes(type))
|
|
49842
|
+
continue;
|
|
49843
|
+
if (["tool_use", "tool_call", "function_call"].includes(type)) {
|
|
49844
|
+
text.push(toolMarker(block));
|
|
49845
|
+
continue;
|
|
49846
|
+
}
|
|
49847
|
+
const blockText = stringValue(block.text) ?? stringValue(block.content);
|
|
49848
|
+
if (blockText)
|
|
49849
|
+
text.push(blockText);
|
|
49850
|
+
}
|
|
49851
|
+
return text;
|
|
49852
|
+
}
|
|
49853
|
+
function jsonTranscriptLine(value) {
|
|
49854
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
49855
|
+
return [];
|
|
49856
|
+
const record5 = value;
|
|
49857
|
+
const nestedItem = record5.item;
|
|
49858
|
+
const item = typeof nestedItem === "object" && nestedItem !== null && !Array.isArray(nestedItem) ? nestedItem : record5;
|
|
49859
|
+
const type = (stringValue(item.type) ?? stringValue(record5.type) ?? "").toLowerCase();
|
|
49860
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result", "tool_output", "tool_return"].some((candidate) => type.includes(candidate))) {
|
|
49861
|
+
return [];
|
|
49862
|
+
}
|
|
49863
|
+
if (["tool_use", "tool_call", "function_call", "function_calling"].some((candidate) => type.includes(candidate))) {
|
|
49864
|
+
return [toolMarker(item)];
|
|
49865
|
+
}
|
|
49866
|
+
const role = (stringValue(item.role) ?? stringValue(record5.role) ?? "").toLowerCase();
|
|
49867
|
+
if (role === "tool" || role === "function")
|
|
49868
|
+
return [];
|
|
49869
|
+
const payload = record5.payload;
|
|
49870
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49871
|
+
const payloadRecord = payload;
|
|
49872
|
+
const payloadType = (stringValue(payloadRecord.type) ?? "").toLowerCase();
|
|
49873
|
+
if (payloadType.includes("tool") || payloadType.includes("function_call")) {
|
|
49874
|
+
if (payloadType.includes("result") || payloadType.includes("output"))
|
|
49875
|
+
return [];
|
|
49876
|
+
return [toolMarker(payloadRecord)];
|
|
49877
|
+
}
|
|
49878
|
+
const payloadRole = stringValue(payloadRecord.role)?.toLowerCase();
|
|
49879
|
+
const payloadText = contentText(payloadRecord.content ?? payloadRecord.text);
|
|
49880
|
+
if (payloadRole && payloadText.length > 0)
|
|
49881
|
+
return [`${payloadRole === "user" ? "User" : "Assistant"}: ${payloadText.join(`
|
|
49882
|
+
`)}`];
|
|
49883
|
+
}
|
|
49884
|
+
const text = contentText(item.content ?? item.text ?? item.message);
|
|
49885
|
+
if (text.length === 0)
|
|
49886
|
+
return [];
|
|
49887
|
+
const label = role === "user" ? "User" : role === "assistant" ? "Assistant" : role === "reasoning" ? "Assistant reasoning" : null;
|
|
49888
|
+
return label ? text.map((part) => `${label}: ${part}`) : text;
|
|
49889
|
+
}
|
|
49890
|
+
function sanitizePlainTranscript(content) {
|
|
49891
|
+
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) => {
|
|
49892
|
+
const name = /(?:name|tool)=["']([^"']+)["']/i.exec(attributes ?? "")?.[1] ?? "tool";
|
|
49893
|
+
return `[tool call: ${name}]`;
|
|
49894
|
+
});
|
|
49895
|
+
const lines = withoutToolBlocks.split(/\r?\n/);
|
|
49896
|
+
const kept = [];
|
|
49897
|
+
for (const line of lines) {
|
|
49898
|
+
const trimmed = line.trim();
|
|
49899
|
+
if (/^(?:tool[_ -]?(?:output|result)|function[_ -]?(?:output|result)|<tool_result|<tool_response)\b/i.test(trimmed))
|
|
49900
|
+
continue;
|
|
49901
|
+
if (/^(?:tool[_ -]?(?:call|use)|function[_ -]?call)\b/i.test(trimmed)) {
|
|
49902
|
+
const name = trimmed.split(/\s*[:=]\s*/, 2)[1]?.trim() || "tool";
|
|
49903
|
+
kept.push(`[tool call: ${name.replace(/[\s\[({].*$/, "")}]`);
|
|
49904
|
+
continue;
|
|
49905
|
+
}
|
|
49906
|
+
kept.push(line);
|
|
49907
|
+
}
|
|
49908
|
+
return kept.join(`
|
|
49909
|
+
`).replace(/\n{3,}/g, `
|
|
49910
|
+
|
|
49911
|
+
`).trim();
|
|
49912
|
+
}
|
|
49913
|
+
function isJsonTranscriptToolOutput(value) {
|
|
49914
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
49915
|
+
return false;
|
|
49916
|
+
const record5 = value;
|
|
49917
|
+
const nestedItem = record5.item;
|
|
49918
|
+
const item = typeof nestedItem === "object" && nestedItem !== null && !Array.isArray(nestedItem) ? nestedItem : record5;
|
|
49919
|
+
const type = (stringValue(item.type) ?? stringValue(record5.type) ?? "").toLowerCase();
|
|
49920
|
+
if (["tool_result", "tool_response", "function_call_output", "function_result", "tool_output", "tool_return"].some((candidate) => type.includes(candidate)))
|
|
49921
|
+
return true;
|
|
49922
|
+
const role = (stringValue(item.role) ?? stringValue(record5.role) ?? "").toLowerCase();
|
|
49923
|
+
if (role === "tool" || role === "function")
|
|
49924
|
+
return true;
|
|
49925
|
+
const payload = record5.payload;
|
|
49926
|
+
if (typeof payload === "object" && payload !== null && !Array.isArray(payload)) {
|
|
49927
|
+
const payloadRecord = payload;
|
|
49928
|
+
const payloadType = (stringValue(payloadRecord.type) ?? "").toLowerCase();
|
|
49929
|
+
const payloadRole = (stringValue(payloadRecord.role) ?? "").toLowerCase();
|
|
49930
|
+
return payloadType.includes("result") || payloadType.includes("output") || payloadRole === "tool" || payloadRole === "function";
|
|
49931
|
+
}
|
|
49932
|
+
return false;
|
|
49933
|
+
}
|
|
49934
|
+
function sanitizeTranscriptForDreaming(content) {
|
|
49935
|
+
const lines = content.split(/\r?\n/);
|
|
49936
|
+
const nonEmptyLines = lines.filter((line) => line.trim().length > 0);
|
|
49937
|
+
const jsonLines = [];
|
|
49938
|
+
let parsedLines = 0;
|
|
49939
|
+
let recognizedJsonLines = 0;
|
|
49940
|
+
for (const line of nonEmptyLines) {
|
|
49941
|
+
try {
|
|
49942
|
+
const parsed = JSON.parse(line.trim());
|
|
49943
|
+
parsedLines += 1;
|
|
49944
|
+
const rendered = jsonTranscriptLine(parsed);
|
|
49945
|
+
if (rendered.length > 0) {
|
|
49946
|
+
recognizedJsonLines += 1;
|
|
49947
|
+
jsonLines.push(...rendered);
|
|
49948
|
+
}
|
|
49949
|
+
} catch {}
|
|
49950
|
+
}
|
|
49951
|
+
if (parsedLines === nonEmptyLines.length && recognizedJsonLines > 0)
|
|
49952
|
+
return jsonLines.join(`
|
|
49953
|
+
`).trim();
|
|
49954
|
+
const mixedLines = lines.flatMap((line) => {
|
|
49955
|
+
const trimmed = line.trim();
|
|
49956
|
+
if (trimmed.length === 0)
|
|
49957
|
+
return [line];
|
|
49958
|
+
try {
|
|
49959
|
+
const parsed = JSON.parse(trimmed);
|
|
49960
|
+
const rendered = jsonTranscriptLine(parsed);
|
|
49961
|
+
if (rendered.length > 0)
|
|
49962
|
+
return rendered;
|
|
49963
|
+
if (isJsonTranscriptToolOutput(parsed))
|
|
49964
|
+
return [];
|
|
49965
|
+
} catch {}
|
|
49966
|
+
return [line];
|
|
49967
|
+
});
|
|
49968
|
+
return sanitizePlainTranscript(mixedLines.join(`
|
|
49969
|
+
`));
|
|
49970
|
+
}
|
|
49523
49971
|
function renderDreamingEvidence(source) {
|
|
49972
|
+
const content = source.kind === "transcript" || source.sourceKind === "transcript" ? sanitizeTranscriptForDreaming(source.content) : source.content;
|
|
49524
49973
|
const metadata = renderDreamingEvidenceMeta(source.evidenceMeta);
|
|
49525
|
-
return metadata ? `${
|
|
49526
|
-
${metadata}` :
|
|
49974
|
+
return metadata ? `${content}
|
|
49975
|
+
${metadata}` : content;
|
|
49527
49976
|
}
|
|
49528
49977
|
function createDreamingAgentEvidence(evidence) {
|
|
49529
49978
|
return evidence.map((item) => {
|
|
@@ -52940,8 +53389,9 @@ function citeEvidence(accessor, agentId, citation) {
|
|
|
52940
53389
|
return { evidence: null, sourceAgentIds: [] };
|
|
52941
53390
|
const result = accessor.withReadDb((db) => {
|
|
52942
53391
|
const source = readEpisodicSource(db, { agentId, from: requested.sourceRef });
|
|
52943
|
-
if (source !== null)
|
|
53392
|
+
if (source !== null && (source.kind !== "transcript" || source.completed)) {
|
|
52944
53393
|
return { evidence: createDreamingAgentEvidence([source]), sourceAgentIds: [] };
|
|
53394
|
+
}
|
|
52945
53395
|
return { evidence: [], sourceAgentIds: findEpisodicSourceAgentIds(db, requested.sourceRef) };
|
|
52946
53396
|
});
|
|
52947
53397
|
return {
|
|
@@ -53824,7 +54274,7 @@ function createDreamingCapabilities(params) {
|
|
|
53824
54274
|
}
|
|
53825
54275
|
return { ok: true, result: getOntologyLinkEvidence(accessor, { agentId: scopeId, id: ref3.id }) };
|
|
53826
54276
|
}),
|
|
53827
|
-
capability("search_evidence", "Search episodic evidence", "Full-text search immutable episodic memories, artifacts,
|
|
54277
|
+
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
54278
|
agentId: exports_external.string().min(1),
|
|
53829
54279
|
query: exports_external.string().optional(),
|
|
53830
54280
|
since: exports_external.string().optional(),
|
|
@@ -53839,6 +54289,9 @@ function createDreamingCapabilities(params) {
|
|
|
53839
54289
|
const source = readEpisodicSource(db, { agentId: scopeId, from: sourceRef });
|
|
53840
54290
|
if (source === null)
|
|
53841
54291
|
return { ok: false, error: "Evidence source not found" };
|
|
54292
|
+
if (source.kind === "transcript" && !source.completed) {
|
|
54293
|
+
return { ok: false, error: "Transcript is still in progress" };
|
|
54294
|
+
}
|
|
53842
54295
|
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
54296
|
return fragment === null ? { ok: false, error: "Evidence fragment offset is outside the source" } : { ok: true, items: [fragment] };
|
|
53844
54297
|
}
|
|
@@ -55447,8 +55900,8 @@ function errorResult(msg) {
|
|
|
55447
55900
|
isError: true
|
|
55448
55901
|
};
|
|
55449
55902
|
}
|
|
55450
|
-
async function graphIqToolResult(args, label,
|
|
55451
|
-
const access = graphIqToolAccess(
|
|
55903
|
+
async function graphIqToolResult(args, label, toolName2, pluginHostProvider) {
|
|
55904
|
+
const access = graphIqToolAccess(toolName2, pluginHostProvider());
|
|
55452
55905
|
if (!access.ok)
|
|
55453
55906
|
return errorResult(access.error);
|
|
55454
55907
|
try {
|
|
@@ -55469,8 +55922,8 @@ ${stderr}`);
|
|
|
55469
55922
|
return errorResult(`${label}: ${message}`);
|
|
55470
55923
|
}
|
|
55471
55924
|
}
|
|
55472
|
-
function graphIqToolAccess(
|
|
55473
|
-
const resolved = GRAPHIQ_COMPAT_ALIASES.get(
|
|
55925
|
+
function graphIqToolAccess(toolName2, pluginHost) {
|
|
55926
|
+
const resolved = GRAPHIQ_COMPAT_ALIASES.get(toolName2) ?? toolName2;
|
|
55474
55927
|
const plugin = pluginHost.get(SIGNET_GRAPHIQ_PLUGIN_ID);
|
|
55475
55928
|
const pluginActive = plugin?.state === "active" || plugin?.state === "degraded";
|
|
55476
55929
|
if (!pluginActive) {
|
|
@@ -55496,8 +55949,8 @@ function sanitizeToolSegment(value) {
|
|
|
55496
55949
|
const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
55497
55950
|
return normalized.length > 0 ? normalized : "tool";
|
|
55498
55951
|
}
|
|
55499
|
-
function buildProxyToolName(used, serverId,
|
|
55500
|
-
const base = `signet_${sanitizeToolSegment(serverId)}_${sanitizeToolSegment(
|
|
55952
|
+
function buildProxyToolName(used, serverId, toolName2) {
|
|
55953
|
+
const base = `signet_${sanitizeToolSegment(serverId)}_${sanitizeToolSegment(toolName2)}`;
|
|
55501
55954
|
if (!used.has(base)) {
|
|
55502
55955
|
used.add(base);
|
|
55503
55956
|
return base;
|
package/native-manifest.json
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.185.
|
|
3
|
+
"version": "0.185.6",
|
|
4
4
|
"assets": [
|
|
5
5
|
{
|
|
6
6
|
"name": "signet-darwin-arm64",
|
|
7
7
|
"platform": "darwin-arm64",
|
|
8
|
-
"sha256": "
|
|
9
|
-
"size":
|
|
8
|
+
"sha256": "6bbf39902e1b531ab07f7357622665d6bbc857489e56a80171eeb364d7b7430a",
|
|
9
|
+
"size": 117622816
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"name": "signet-darwin-x64",
|
|
13
13
|
"platform": "darwin-x64",
|
|
14
|
-
"sha256": "
|
|
15
|
-
"size":
|
|
14
|
+
"sha256": "dbfda523a97154371c65c7c9bacd482eb4f8a7055cb386617ed8880b6bd8e25d",
|
|
15
|
+
"size": 122243648
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"name": "signet-linux-arm64",
|
|
19
19
|
"platform": "linux-arm64",
|
|
20
|
-
"sha256": "
|
|
21
|
-
"size":
|
|
20
|
+
"sha256": "762ae1d73d33d80192c65f0eb1fcb96845c844cfc8e3bfa918f2cd7ed101d5be",
|
|
21
|
+
"size": 154863504
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"name": "signet-linux-x64",
|
|
25
25
|
"platform": "linux-x64",
|
|
26
|
-
"sha256": "
|
|
27
|
-
"size":
|
|
26
|
+
"sha256": "503ca3b06b390b601dfe543850c827e61c69de3298c6b1809dd8ce3c15e72433",
|
|
27
|
+
"size": 155422489
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"name": "signet-win32-x64.exe",
|
|
31
31
|
"platform": "win32-x64",
|
|
32
|
-
"sha256": "
|
|
33
|
-
"size":
|
|
32
|
+
"sha256": "e11d2af93b67bae951434990d1e6e4d6ed8eb7a3169d6f99fce6f2364c4f2c53",
|
|
33
|
+
"size": 171555840
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"components": {
|
|
37
37
|
"connectors": {
|
|
38
|
-
"url": "signet-connectors-0.185.
|
|
39
|
-
"sha256": "
|
|
40
|
-
"size":
|
|
38
|
+
"url": "signet-connectors-0.185.6.tar.gz",
|
|
39
|
+
"sha256": "886a3aa889374f66e6be9bb1c4345f860806290b6c93d6c34599df94f260d32c",
|
|
40
|
+
"size": 16885
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "signetai",
|
|
3
|
-
"version": "0.185.
|
|
3
|
+
"version": "0.185.6",
|
|
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.6/signetai-darwin-arm64-0.185.6.tgz",
|
|
69
|
+
"signetai-darwin-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.6/signetai-darwin-x64-0.185.6.tgz",
|
|
70
|
+
"signetai-linux-arm64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.6/signetai-linux-arm64-0.185.6.tgz",
|
|
71
|
+
"signetai-linux-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.6/signetai-linux-x64-0.185.6.tgz",
|
|
72
|
+
"signetai-win32-x64": "https://github.com/Signet-AI/signetai/releases/download/v0.185.6/signetai-win32-x64-0.185.6.tgz"
|
|
73
73
|
}
|
|
74
74
|
}
|