@sage-protocol/pi-adapter 0.3.12 → 0.4.1
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/README.md +72 -23
- package/SKILL.md +143 -166
- package/USAGE.md +100 -38
- package/dist/behavior/pi-executor.d.ts.map +1 -1
- package/dist/behavior/pi-executor.js +26 -6
- package/dist/behavior/pi-executor.js.map +1 -1
- package/dist/behavior/types.d.ts +15 -4
- package/dist/behavior/types.d.ts.map +1 -1
- package/dist/index.d.ts +29 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -7
- package/dist/index.js.map +1 -1
- package/dist/sage-pi-adapter.d.ts +70 -12
- package/dist/sage-pi-adapter.d.ts.map +1 -1
- package/dist/sage-pi-adapter.js +341 -58
- package/dist/sage-pi-adapter.js.map +1 -1
- package/extensions/index.ts +419 -642
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sage-pi-adapter.d.ts","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sage-pi-adapter.d.ts","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/sage-pi-adapter.js
CHANGED
|
@@ -437,6 +437,7 @@ function normalizeAction(aliasesByDomain, domain, action) {
|
|
|
437
437
|
export async function defaultSageCommandRunner(request) {
|
|
438
438
|
return new Promise((resolve, reject) => {
|
|
439
439
|
const proc = spawn(request.command, request.args, {
|
|
440
|
+
cwd: request.cwd,
|
|
440
441
|
env: { ...process.env, ...request.env },
|
|
441
442
|
stdio: ["pipe", "pipe", "pipe"],
|
|
442
443
|
});
|
|
@@ -657,26 +658,59 @@ function loadHostPiTui() {
|
|
|
657
658
|
hostPiTui = null;
|
|
658
659
|
return null;
|
|
659
660
|
}
|
|
660
|
-
/**
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
661
|
+
/** Return terminal-visible width while ignoring ANSI SGR sequences. */
|
|
662
|
+
export function visibleWidthOf(line) {
|
|
663
|
+
const mod = loadHostPiTui();
|
|
664
|
+
if (mod?.visibleWidth) {
|
|
665
|
+
try {
|
|
666
|
+
return mod.visibleWidth(line);
|
|
667
|
+
}
|
|
668
|
+
catch {
|
|
669
|
+
/* fall through to the dependency-free counter */
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
// eslint-disable-next-line no-control-regex
|
|
673
|
+
return [...line.replace(/\x1b\[[0-9;]*m/g, "")].length;
|
|
674
|
+
}
|
|
675
|
+
/** Truncate one ANSI-styled line without counting styling bytes as columns. */
|
|
676
|
+
export function truncateLineToWidth(line, width) {
|
|
667
677
|
const cols = Number.isFinite(width) && width > 0 ? Math.floor(width) : 80;
|
|
678
|
+
if (visibleWidthOf(line) <= cols)
|
|
679
|
+
return line;
|
|
668
680
|
const mod = loadHostPiTui();
|
|
669
681
|
if (mod?.truncateToWidth) {
|
|
670
682
|
try {
|
|
671
683
|
return mod.truncateToWidth(line, cols);
|
|
672
684
|
}
|
|
673
685
|
catch {
|
|
674
|
-
/* fall through to
|
|
686
|
+
/* fall through to the dependency-free truncator */
|
|
675
687
|
}
|
|
676
688
|
}
|
|
689
|
+
// Preserve SGR styling while counting only visible code points.
|
|
677
690
|
// eslint-disable-next-line no-control-regex
|
|
678
|
-
const
|
|
679
|
-
|
|
691
|
+
const tokens = line.match(/\x1b\[[0-9;]*m|./gu) ?? [];
|
|
692
|
+
let visible = 0;
|
|
693
|
+
let sawStyle = false;
|
|
694
|
+
let result = "";
|
|
695
|
+
for (const token of tokens) {
|
|
696
|
+
// eslint-disable-next-line no-control-regex
|
|
697
|
+
if (/^\x1b\[[0-9;]*m$/.test(token)) {
|
|
698
|
+
result += token;
|
|
699
|
+
sawStyle = true;
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
if (visible >= cols)
|
|
703
|
+
break;
|
|
704
|
+
result += token;
|
|
705
|
+
visible += 1;
|
|
706
|
+
}
|
|
707
|
+
if (sawStyle && !result.endsWith("\x1b[0m"))
|
|
708
|
+
result += "\x1b[0m";
|
|
709
|
+
return result;
|
|
710
|
+
}
|
|
711
|
+
/** Clamp a line so custom TUI/status rendering cannot exceed terminal width. */
|
|
712
|
+
export function clampLineToWidth(line, width) {
|
|
713
|
+
return truncateLineToWidth(line, width);
|
|
680
714
|
}
|
|
681
715
|
function createTextComponent(text) {
|
|
682
716
|
// Canonical path: return the host pi-tui's real Text component. It wraps via
|
|
@@ -1104,6 +1138,140 @@ function looksUnknownToolError(error) {
|
|
|
1104
1138
|
msg.includes("no such tool") ||
|
|
1105
1139
|
msg.includes("does not exist"));
|
|
1106
1140
|
}
|
|
1141
|
+
const FAILED_NATIVE_SKILL_LOAD_RESULT = {
|
|
1142
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1143
|
+
status: "failed",
|
|
1144
|
+
recorded: false,
|
|
1145
|
+
};
|
|
1146
|
+
const NATIVE_SKILL_LOAD_EVIDENCE_TIERS = new Set([
|
|
1147
|
+
"full_serve",
|
|
1148
|
+
"native_observed",
|
|
1149
|
+
]);
|
|
1150
|
+
function parseJsonObject(stdout) {
|
|
1151
|
+
try {
|
|
1152
|
+
const parsed = JSON.parse(stdout.trim());
|
|
1153
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
1154
|
+
? parsed
|
|
1155
|
+
: null;
|
|
1156
|
+
}
|
|
1157
|
+
catch {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
function parseNativeSkillLoadResult(stdout) {
|
|
1162
|
+
const parsed = parseJsonObject(stdout);
|
|
1163
|
+
if (!parsed ||
|
|
1164
|
+
parsed.schema !== "sage.native-skill-load-signal.v1") {
|
|
1165
|
+
return null;
|
|
1166
|
+
}
|
|
1167
|
+
if (parsed.status === "ignored" && parsed.recorded === false) {
|
|
1168
|
+
const result = {
|
|
1169
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1170
|
+
status: "ignored",
|
|
1171
|
+
recorded: false,
|
|
1172
|
+
};
|
|
1173
|
+
if (typeof parsed.reason === "string" && parsed.reason.trim()) {
|
|
1174
|
+
result.reason = parsed.reason;
|
|
1175
|
+
}
|
|
1176
|
+
return result;
|
|
1177
|
+
}
|
|
1178
|
+
if (parsed.status !== "recorded" ||
|
|
1179
|
+
parsed.recorded !== true ||
|
|
1180
|
+
typeof parsed.qualified_key !== "string" ||
|
|
1181
|
+
!parsed.qualified_key.trim() ||
|
|
1182
|
+
parsed.load_evidence_tier !== "native_observed" ||
|
|
1183
|
+
typeof parsed.loaded_at_ms !== "number" ||
|
|
1184
|
+
!Number.isSafeInteger(parsed.loaded_at_ms) ||
|
|
1185
|
+
parsed.loaded_at_ms < 0) {
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
return {
|
|
1189
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1190
|
+
status: "recorded",
|
|
1191
|
+
recorded: true,
|
|
1192
|
+
qualified_key: parsed.qualified_key,
|
|
1193
|
+
load_evidence_tier: "native_observed",
|
|
1194
|
+
loaded_at_ms: parsed.loaded_at_ms,
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
function normalizeNativeSkillName(value) {
|
|
1198
|
+
return value.trim().toLocaleLowerCase("en-US");
|
|
1199
|
+
}
|
|
1200
|
+
function dedupeNativeSkillNames(skillKeys) {
|
|
1201
|
+
const names = new Map();
|
|
1202
|
+
for (const raw of skillKeys) {
|
|
1203
|
+
const trimmed = raw.trim();
|
|
1204
|
+
if (!trimmed)
|
|
1205
|
+
continue;
|
|
1206
|
+
const normalized = normalizeNativeSkillName(trimmed);
|
|
1207
|
+
if (!names.has(normalized))
|
|
1208
|
+
names.set(normalized, trimmed);
|
|
1209
|
+
}
|
|
1210
|
+
return [...names.values()];
|
|
1211
|
+
}
|
|
1212
|
+
function parseNativeSkillUseResult(stdout, expectedCaptureId, expectedNames) {
|
|
1213
|
+
const parsed = parseJsonObject(stdout);
|
|
1214
|
+
if (!parsed ||
|
|
1215
|
+
parsed.schema !== "sage.native-skill-use.v1" ||
|
|
1216
|
+
parsed.status !== "recorded" ||
|
|
1217
|
+
parsed.capture_id !== expectedCaptureId ||
|
|
1218
|
+
!Array.isArray(parsed.uses) ||
|
|
1219
|
+
parsed.uses.length === 0) {
|
|
1220
|
+
return null;
|
|
1221
|
+
}
|
|
1222
|
+
const expected = new Set(expectedNames.map(normalizeNativeSkillName));
|
|
1223
|
+
if (expected.size === 0 || parsed.uses.length !== expected.size)
|
|
1224
|
+
return null;
|
|
1225
|
+
if (parsed.capture_linkage !== "explicit")
|
|
1226
|
+
return null;
|
|
1227
|
+
const returnedNames = new Set();
|
|
1228
|
+
const returnedQualifiedKeys = new Set();
|
|
1229
|
+
const uses = [];
|
|
1230
|
+
for (const entry of parsed.uses) {
|
|
1231
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
1232
|
+
return null;
|
|
1233
|
+
const record = entry;
|
|
1234
|
+
if (typeof record.requested_name !== "string" ||
|
|
1235
|
+
!record.requested_name.trim() ||
|
|
1236
|
+
typeof record.qualified_key !== "string" ||
|
|
1237
|
+
!record.qualified_key.trim() ||
|
|
1238
|
+
typeof record.load_evidence_tier !== "string" ||
|
|
1239
|
+
!NATIVE_SKILL_LOAD_EVIDENCE_TIERS.has(record.load_evidence_tier) ||
|
|
1240
|
+
typeof record.load_observed_at_ms !== "number" ||
|
|
1241
|
+
!Number.isSafeInteger(record.load_observed_at_ms) ||
|
|
1242
|
+
record.load_observed_at_ms < 0 ||
|
|
1243
|
+
typeof record.recorded !== "boolean") {
|
|
1244
|
+
return null;
|
|
1245
|
+
}
|
|
1246
|
+
const requestedName = record.requested_name.trim();
|
|
1247
|
+
const normalizedName = normalizeNativeSkillName(requestedName);
|
|
1248
|
+
const qualifiedKey = record.qualified_key.trim();
|
|
1249
|
+
const normalizedQualifiedKey = normalizeNativeSkillName(qualifiedKey);
|
|
1250
|
+
if (!expected.has(normalizedName) ||
|
|
1251
|
+
returnedNames.has(normalizedName) ||
|
|
1252
|
+
returnedQualifiedKeys.has(normalizedQualifiedKey)) {
|
|
1253
|
+
return null;
|
|
1254
|
+
}
|
|
1255
|
+
returnedNames.add(normalizedName);
|
|
1256
|
+
returnedQualifiedKeys.add(normalizedQualifiedKey);
|
|
1257
|
+
uses.push({
|
|
1258
|
+
requested_name: requestedName,
|
|
1259
|
+
qualified_key: qualifiedKey,
|
|
1260
|
+
load_evidence_tier: record.load_evidence_tier,
|
|
1261
|
+
load_observed_at_ms: record.load_observed_at_ms,
|
|
1262
|
+
recorded: record.recorded,
|
|
1263
|
+
});
|
|
1264
|
+
}
|
|
1265
|
+
if ([...expected].some((name) => !returnedNames.has(name)))
|
|
1266
|
+
return null;
|
|
1267
|
+
return {
|
|
1268
|
+
schema: "sage.native-skill-use.v1",
|
|
1269
|
+
status: "recorded",
|
|
1270
|
+
capture_id: expectedCaptureId,
|
|
1271
|
+
capture_linkage: "explicit",
|
|
1272
|
+
uses,
|
|
1273
|
+
};
|
|
1274
|
+
}
|
|
1107
1275
|
function parseSecurityDecision(stdout) {
|
|
1108
1276
|
const lines = stdout
|
|
1109
1277
|
.split(/\r?\n/)
|
|
@@ -1422,6 +1590,7 @@ export class SageMcpBridge {
|
|
|
1422
1590
|
export class SageHookRuntime {
|
|
1423
1591
|
config;
|
|
1424
1592
|
commandRunner;
|
|
1593
|
+
workingDirectory;
|
|
1425
1594
|
sessionContextCache = new Map();
|
|
1426
1595
|
skillVisibilityCache = null;
|
|
1427
1596
|
softFailureState = new Map();
|
|
@@ -1429,6 +1598,10 @@ export class SageHookRuntime {
|
|
|
1429
1598
|
this.config = config;
|
|
1430
1599
|
this.commandRunner = config.commandRunner ?? defaultSageCommandRunner;
|
|
1431
1600
|
}
|
|
1601
|
+
setWorkingDirectory(cwd) {
|
|
1602
|
+
this.workingDirectory =
|
|
1603
|
+
typeof cwd === "string" && cwd.trim() ? cwd.trim() : undefined;
|
|
1604
|
+
}
|
|
1432
1605
|
getSoftTimeout(maxTimeoutMs) {
|
|
1433
1606
|
return Math.max(250, Math.min(this.config.timeoutMs, maxTimeoutMs));
|
|
1434
1607
|
}
|
|
@@ -1544,7 +1717,11 @@ export class SageHookRuntime {
|
|
|
1544
1717
|
}
|
|
1545
1718
|
return this.skillVisibilityCache ?? current;
|
|
1546
1719
|
}
|
|
1547
|
-
|
|
1720
|
+
/**
|
|
1721
|
+
* @deprecated Low-level compatibility helper. The default Pi path uses
|
|
1722
|
+
* native skill discovery/loading and does not call this per prompt.
|
|
1723
|
+
*/
|
|
1724
|
+
async suggestSkill(prompt, sessionId, model) {
|
|
1548
1725
|
const trimmed = prompt.trim();
|
|
1549
1726
|
if (!trimmed)
|
|
1550
1727
|
return "";
|
|
@@ -1562,6 +1739,7 @@ export class SageHookRuntime {
|
|
|
1562
1739
|
SAGE_PROMPT: trimmed,
|
|
1563
1740
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1564
1741
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1742
|
+
SAGE_MODEL: model ?? "",
|
|
1565
1743
|
}, JSON.stringify({ prompt: trimmed }), {
|
|
1566
1744
|
failurePolicy: "warn",
|
|
1567
1745
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.suggest),
|
|
@@ -1570,11 +1748,11 @@ export class SageHookRuntime {
|
|
|
1570
1748
|
}
|
|
1571
1749
|
async capturePrompt(prompt, sessionId) {
|
|
1572
1750
|
if (this.config.enableRlmFeedback === false)
|
|
1573
|
-
return;
|
|
1751
|
+
return undefined;
|
|
1574
1752
|
const trimmed = prompt.trim();
|
|
1575
1753
|
if (!trimmed)
|
|
1576
|
-
return;
|
|
1577
|
-
await this.run(["capture", "hook", "prompt"], {
|
|
1754
|
+
return undefined;
|
|
1755
|
+
const result = await this.run(["capture", "hook", "prompt"], {
|
|
1578
1756
|
PROMPT: trimmed,
|
|
1579
1757
|
SAGE_PROMPT: trimmed,
|
|
1580
1758
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
@@ -1583,34 +1761,153 @@ export class SageHookRuntime {
|
|
|
1583
1761
|
failurePolicy: "silent",
|
|
1584
1762
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1585
1763
|
});
|
|
1764
|
+
const captureId = result?.stdout
|
|
1765
|
+
.trim()
|
|
1766
|
+
.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i)?.[0];
|
|
1767
|
+
return captureId;
|
|
1586
1768
|
}
|
|
1587
|
-
async captureResponse(response, usage, sessionId) {
|
|
1769
|
+
async captureResponse(response, usage, sessionId, captureId) {
|
|
1588
1770
|
if (this.config.enableRlmFeedback === false)
|
|
1589
|
-
return;
|
|
1771
|
+
return false;
|
|
1590
1772
|
const trimmed = response.trim();
|
|
1591
1773
|
if (!trimmed)
|
|
1592
|
-
return;
|
|
1593
|
-
|
|
1774
|
+
return false;
|
|
1775
|
+
const args = ["capture", "hook", "response"];
|
|
1776
|
+
const exactCaptureId = captureId?.trim();
|
|
1777
|
+
if (exactCaptureId)
|
|
1778
|
+
args.push("--correlation-id", exactCaptureId);
|
|
1779
|
+
const result = await this.run(args, {
|
|
1594
1780
|
SAGE_RESPONSE: trimmed,
|
|
1595
1781
|
LAST_RESPONSE: trimmed,
|
|
1596
1782
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1597
1783
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1784
|
+
SAGE_DEFER_SUGGESTION_FEEDBACK: "1",
|
|
1598
1785
|
TOKENS_INPUT: usage.input ?? "",
|
|
1599
1786
|
TOKENS_OUTPUT: usage.output ?? "",
|
|
1600
1787
|
}, JSON.stringify({ response: trimmed }), {
|
|
1601
1788
|
failurePolicy: "silent",
|
|
1602
1789
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1603
1790
|
});
|
|
1791
|
+
return result !== null;
|
|
1604
1792
|
}
|
|
1605
|
-
async recordSuggestionUse(skillKeys, sessionId) {
|
|
1793
|
+
async recordSuggestionUse(skillKeys, sessionId, correlationId) {
|
|
1606
1794
|
if (this.config.enableRlmFeedback === false)
|
|
1607
|
-
return;
|
|
1795
|
+
return false;
|
|
1608
1796
|
const used = [
|
|
1609
1797
|
...new Set(skillKeys.map((key) => key.trim()).filter(Boolean)),
|
|
1610
1798
|
];
|
|
1611
1799
|
if (used.length === 0)
|
|
1800
|
+
return false;
|
|
1801
|
+
const args = [
|
|
1802
|
+
"suggest",
|
|
1803
|
+
"feedback",
|
|
1804
|
+
"use",
|
|
1805
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1806
|
+
];
|
|
1807
|
+
const correlation = correlationId?.trim();
|
|
1808
|
+
if (correlation)
|
|
1809
|
+
args.push("--correlation-id", correlation);
|
|
1810
|
+
const result = await this.run(args, {
|
|
1811
|
+
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1812
|
+
SAGE_SESSION_ID: sessionId ?? "",
|
|
1813
|
+
}, undefined, {
|
|
1814
|
+
failurePolicy: "silent",
|
|
1815
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1816
|
+
});
|
|
1817
|
+
return result !== null;
|
|
1818
|
+
}
|
|
1819
|
+
/**
|
|
1820
|
+
* Atomically record use of procedures that Pi loaded natively. This path
|
|
1821
|
+
* intentionally has no fallback to legacy suggestion feedback: the daemon
|
|
1822
|
+
* must authorize every returned qualified record from session-scoped load
|
|
1823
|
+
* evidence and link the complete batch to the exact capture.
|
|
1824
|
+
*/
|
|
1825
|
+
async recordNativeSkillUse(skillKeys, sessionId, captureId) {
|
|
1826
|
+
if (this.config.enableRlmFeedback === false)
|
|
1827
|
+
return null;
|
|
1828
|
+
const used = dedupeNativeSkillNames(skillKeys);
|
|
1829
|
+
const session = sessionId?.trim();
|
|
1830
|
+
const capture = captureId?.trim();
|
|
1831
|
+
if (used.length === 0 || !session || !capture)
|
|
1832
|
+
return null;
|
|
1833
|
+
const source = this.config.source?.trim() || "pi";
|
|
1834
|
+
const result = await this.run([
|
|
1835
|
+
"suggest",
|
|
1836
|
+
"feedback",
|
|
1837
|
+
"native-use",
|
|
1838
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1839
|
+
"--capture-id",
|
|
1840
|
+
capture,
|
|
1841
|
+
"--source",
|
|
1842
|
+
source,
|
|
1843
|
+
"--session",
|
|
1844
|
+
session,
|
|
1845
|
+
"--format",
|
|
1846
|
+
"json",
|
|
1847
|
+
], {
|
|
1848
|
+
SAGE_SOURCE: source,
|
|
1849
|
+
SAGE_SESSION_ID: session,
|
|
1850
|
+
}, undefined, {
|
|
1851
|
+
failurePolicy: "silent",
|
|
1852
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1853
|
+
});
|
|
1854
|
+
return result
|
|
1855
|
+
? parseNativeSkillUseResult(result.stdout, capture, used)
|
|
1856
|
+
: null;
|
|
1857
|
+
}
|
|
1858
|
+
/**
|
|
1859
|
+
* Record a daemon load receipt for a full skill procedure this session
|
|
1860
|
+
* loaded through Pi's native full SKILL.md read or sage_execute get. The
|
|
1861
|
+
* structured result only reports `recorded: true` after validating the
|
|
1862
|
+
* explicit CLI's versioned JSON receipt. Ignored and failed writes remain
|
|
1863
|
+
* non-recorded so callers can retry honestly.
|
|
1864
|
+
*/
|
|
1865
|
+
async recordSkillLoadSignal(skillKey, sessionId, via = "slash") {
|
|
1866
|
+
if (this.config.enableRlmFeedback === false) {
|
|
1867
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1868
|
+
}
|
|
1869
|
+
const key = skillKey.trim();
|
|
1870
|
+
const session = sessionId?.trim();
|
|
1871
|
+
// A receipt is session-scoped evidence. Without the real Pi session id,
|
|
1872
|
+
// the CLI would fall back to ambient env (a foreign harness session) and
|
|
1873
|
+
// record evidence that verifies the WRONG scope — worse than nothing.
|
|
1874
|
+
if (!key || !session)
|
|
1875
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1876
|
+
const source = this.config.source?.trim() || "pi";
|
|
1877
|
+
const result = await this.run([
|
|
1878
|
+
"suggest",
|
|
1879
|
+
"load-signal",
|
|
1880
|
+
"--name",
|
|
1881
|
+
key,
|
|
1882
|
+
"--via",
|
|
1883
|
+
via,
|
|
1884
|
+
"--source",
|
|
1885
|
+
source,
|
|
1886
|
+
"--session",
|
|
1887
|
+
session,
|
|
1888
|
+
"--format",
|
|
1889
|
+
"json",
|
|
1890
|
+
], {
|
|
1891
|
+
SAGE_SOURCE: source,
|
|
1892
|
+
SAGE_SESSION_ID: session,
|
|
1893
|
+
}, undefined, {
|
|
1894
|
+
failurePolicy: "silent",
|
|
1895
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1896
|
+
});
|
|
1897
|
+
if (!result)
|
|
1898
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1899
|
+
return (parseNativeSkillLoadResult(result.stdout) ?? {
|
|
1900
|
+
...FAILED_NATIVE_SKILL_LOAD_RESULT,
|
|
1901
|
+
});
|
|
1902
|
+
}
|
|
1903
|
+
async recordSuggestionSkip(sessionId, correlationId) {
|
|
1904
|
+
if (this.config.enableRlmFeedback === false)
|
|
1612
1905
|
return;
|
|
1613
|
-
|
|
1906
|
+
const args = ["suggest", "feedback", "skip"];
|
|
1907
|
+
const correlation = correlationId?.trim();
|
|
1908
|
+
if (correlation)
|
|
1909
|
+
args.push("--correlation-id", correlation);
|
|
1910
|
+
await this.run(args, {
|
|
1614
1911
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1615
1912
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1616
1913
|
}, undefined, {
|
|
@@ -1618,10 +1915,14 @@ export class SageHookRuntime {
|
|
|
1618
1915
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1619
1916
|
});
|
|
1620
1917
|
}
|
|
1621
|
-
async
|
|
1918
|
+
async recordSuggestionReject(sessionId, correlationId) {
|
|
1622
1919
|
if (this.config.enableRlmFeedback === false)
|
|
1623
1920
|
return;
|
|
1624
|
-
|
|
1921
|
+
const args = ["suggest", "feedback", "reject"];
|
|
1922
|
+
const correlation = correlationId?.trim();
|
|
1923
|
+
if (correlation)
|
|
1924
|
+
args.push("--correlation-id", correlation);
|
|
1925
|
+
await this.run(args, {
|
|
1625
1926
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1626
1927
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1627
1928
|
}, undefined, {
|
|
@@ -1629,7 +1930,7 @@ export class SageHookRuntime {
|
|
|
1629
1930
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1630
1931
|
});
|
|
1631
1932
|
}
|
|
1632
|
-
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model) {
|
|
1933
|
+
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model, correlationId, captureId) {
|
|
1633
1934
|
if (this.config.enableRlmFeedback === false)
|
|
1634
1935
|
return;
|
|
1635
1936
|
const key = skillKey.trim();
|
|
@@ -1639,6 +1940,12 @@ export class SageHookRuntime {
|
|
|
1639
1940
|
const preview = queryPreview?.trim();
|
|
1640
1941
|
if (preview)
|
|
1641
1942
|
args.push("--query-preview", preview.slice(0, 500));
|
|
1943
|
+
const correlation = correlationId?.trim();
|
|
1944
|
+
if (correlation)
|
|
1945
|
+
args.push("--correlation-id", correlation);
|
|
1946
|
+
const exactCaptureId = captureId?.trim();
|
|
1947
|
+
if (exactCaptureId)
|
|
1948
|
+
args.push("--capture-id", exactCaptureId);
|
|
1642
1949
|
await this.run(args, {
|
|
1643
1950
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1644
1951
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
@@ -1774,11 +2081,15 @@ export class SageHookRuntime {
|
|
|
1774
2081
|
if (this.config.sageProfile) {
|
|
1775
2082
|
commandEnv.SAGE_PROFILE = this.config.sageProfile;
|
|
1776
2083
|
}
|
|
2084
|
+
if (this.workingDirectory && !commandEnv.SAGE_WORKSPACE) {
|
|
2085
|
+
commandEnv.SAGE_WORKSPACE = this.workingDirectory;
|
|
2086
|
+
}
|
|
1777
2087
|
const result = await this.commandRunner({
|
|
1778
2088
|
command: this.config.sageBin,
|
|
1779
2089
|
args,
|
|
1780
2090
|
env: commandEnv,
|
|
1781
2091
|
stdin,
|
|
2092
|
+
cwd: this.workingDirectory,
|
|
1782
2093
|
timeoutMs: options.timeoutMs ?? this.config.timeoutMs,
|
|
1783
2094
|
});
|
|
1784
2095
|
if (result.timedOut || result.exitCode !== 0) {
|
|
@@ -2351,7 +2662,7 @@ async function injectHookMessage(session, customType, content, display = false)
|
|
|
2351
2662
|
console.log(`\n[${customType}]\n${trimmed}\n`);
|
|
2352
2663
|
}
|
|
2353
2664
|
export function createSageExtensions(options) {
|
|
2354
|
-
const { mcpBridge
|
|
2665
|
+
const { mcpBridge } = options;
|
|
2355
2666
|
const hookRuntime = options.hookRuntime ??
|
|
2356
2667
|
new SageHookRuntime({
|
|
2357
2668
|
sageBin: options.config.sageBin ?? "sage",
|
|
@@ -2375,40 +2686,13 @@ export function createSageExtensions(options) {
|
|
|
2375
2686
|
hookRuntime,
|
|
2376
2687
|
getSessionId: options.getSessionId,
|
|
2377
2688
|
});
|
|
2378
|
-
let currentSuggestions = "";
|
|
2379
|
-
let lastInjectionTimestamp = 0;
|
|
2380
|
-
let lastSuggestionPrompt = "";
|
|
2381
2689
|
return {
|
|
2382
2690
|
customTools,
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
if (now - lastInjectionTimestamp < debounceMs)
|
|
2389
|
-
return;
|
|
2390
|
-
if (prompt === lastSuggestionPrompt)
|
|
2391
|
-
return;
|
|
2392
|
-
lastInjectionTimestamp = now;
|
|
2393
|
-
lastSuggestionPrompt = prompt;
|
|
2394
|
-
try {
|
|
2395
|
-
const suggestions = await hookRuntime.suggestSkill(prompt, sessionId);
|
|
2396
|
-
if (!suggestions.trim())
|
|
2397
|
-
return;
|
|
2398
|
-
currentSuggestions = suggestions;
|
|
2399
|
-
if (session) {
|
|
2400
|
-
await injectHookMessage(session, "sage-suggested-skills", suggestions, false);
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
catch (error) {
|
|
2404
|
-
console.error("[sage-pi-adapter] suggestion hook failed:", error);
|
|
2405
|
-
}
|
|
2406
|
-
},
|
|
2407
|
-
sageClearSuggestions: () => {
|
|
2408
|
-
currentSuggestions = "";
|
|
2409
|
-
lastSuggestionPrompt = "";
|
|
2410
|
-
},
|
|
2411
|
-
sageGetSuggestions: () => currentSuggestions,
|
|
2691
|
+
// Preserved for one compatibility release. Pi's native skill surface owns
|
|
2692
|
+
// discovery/loading now, so adapter-side prompt injection must stay inert.
|
|
2693
|
+
sageInjectSuggestion: async (_userPrompt, _session, _sessionId) => { },
|
|
2694
|
+
sageClearSuggestions: () => { },
|
|
2695
|
+
sageGetSuggestions: () => "",
|
|
2412
2696
|
};
|
|
2413
2697
|
}
|
|
2414
2698
|
export async function createSageSessionConfig(config = {}) {
|
|
@@ -2487,7 +2771,6 @@ export async function createSageSessionConfig(config = {}) {
|
|
|
2487
2771
|
.catch((error) => {
|
|
2488
2772
|
console.error("[sage-pi-adapter] prompt capture failed:", error);
|
|
2489
2773
|
});
|
|
2490
|
-
void extension.sageInjectSuggestion(content, session, activeSessionId);
|
|
2491
2774
|
return;
|
|
2492
2775
|
}
|
|
2493
2776
|
if (parsed.role === "assistant") {
|