@sage-protocol/pi-adapter 0.3.12 → 0.4.3
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 +79 -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 +83 -12
- package/dist/sage-pi-adapter.d.ts.map +1 -1
- package/dist/sage-pi-adapter.js +402 -58
- package/dist/sage-pi-adapter.js.map +1 -1
- package/extensions/index.ts +423 -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,175 @@ 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
|
+
}
|
|
1275
|
+
function classifyNativeSkillUseFailure(failure) {
|
|
1276
|
+
if (failure?.timedOut) {
|
|
1277
|
+
return {
|
|
1278
|
+
code: "native_use_timeout",
|
|
1279
|
+
message: "Sage timed out while recording native guided use.",
|
|
1280
|
+
recovery: "Check `sage daemon status`, then retry the same declaration.",
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1283
|
+
const parsed = failure ? parseJsonObject(failure.stdout) : null;
|
|
1284
|
+
const error = parsed?.error && typeof parsed.error === "object" && !Array.isArray(parsed.error)
|
|
1285
|
+
? parsed.error
|
|
1286
|
+
: null;
|
|
1287
|
+
if (parsed?.schema === "sage.native-skill-use.v1" &&
|
|
1288
|
+
parsed.status === "unsupported" &&
|
|
1289
|
+
error?.code === "native_skill_use_unsupported") {
|
|
1290
|
+
return {
|
|
1291
|
+
code: "native_skill_use_unsupported",
|
|
1292
|
+
message: "The running Sage daemon does not advertise native_skill_use_v1.",
|
|
1293
|
+
recovery: "Update and restart `saged`, then retry the same declaration.",
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
const detail = `${failure?.stderr ?? ""}\n${failure?.stdout ?? ""}`;
|
|
1297
|
+
if (/unrecognized subcommand\s+['"]native-use['"]/i.test(detail)) {
|
|
1298
|
+
return {
|
|
1299
|
+
code: "native_use_cli_unsupported",
|
|
1300
|
+
message: "The configured Sage CLI does not expose feedback native-use.",
|
|
1301
|
+
recovery: "Update the Sage CLI selected by `SAGE_BIN`, then retry. Restart `saged` only if the updated CLI reports a daemon capability mismatch.",
|
|
1302
|
+
};
|
|
1303
|
+
}
|
|
1304
|
+
return {
|
|
1305
|
+
code: "native_use_write_failed",
|
|
1306
|
+
message: "Sage did not persist the native guided-use batch.",
|
|
1307
|
+
recovery: "Check `sage daemon status` and daemon logs before retrying.",
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
1107
1310
|
function parseSecurityDecision(stdout) {
|
|
1108
1311
|
const lines = stdout
|
|
1109
1312
|
.split(/\r?\n/)
|
|
@@ -1422,6 +1625,7 @@ export class SageMcpBridge {
|
|
|
1422
1625
|
export class SageHookRuntime {
|
|
1423
1626
|
config;
|
|
1424
1627
|
commandRunner;
|
|
1628
|
+
workingDirectory;
|
|
1425
1629
|
sessionContextCache = new Map();
|
|
1426
1630
|
skillVisibilityCache = null;
|
|
1427
1631
|
softFailureState = new Map();
|
|
@@ -1429,6 +1633,10 @@ export class SageHookRuntime {
|
|
|
1429
1633
|
this.config = config;
|
|
1430
1634
|
this.commandRunner = config.commandRunner ?? defaultSageCommandRunner;
|
|
1431
1635
|
}
|
|
1636
|
+
setWorkingDirectory(cwd) {
|
|
1637
|
+
this.workingDirectory =
|
|
1638
|
+
typeof cwd === "string" && cwd.trim() ? cwd.trim() : undefined;
|
|
1639
|
+
}
|
|
1432
1640
|
getSoftTimeout(maxTimeoutMs) {
|
|
1433
1641
|
return Math.max(250, Math.min(this.config.timeoutMs, maxTimeoutMs));
|
|
1434
1642
|
}
|
|
@@ -1544,7 +1752,11 @@ export class SageHookRuntime {
|
|
|
1544
1752
|
}
|
|
1545
1753
|
return this.skillVisibilityCache ?? current;
|
|
1546
1754
|
}
|
|
1547
|
-
|
|
1755
|
+
/**
|
|
1756
|
+
* @deprecated Low-level compatibility helper. The default Pi path uses
|
|
1757
|
+
* native skill discovery/loading and does not call this per prompt.
|
|
1758
|
+
*/
|
|
1759
|
+
async suggestSkill(prompt, sessionId, model) {
|
|
1548
1760
|
const trimmed = prompt.trim();
|
|
1549
1761
|
if (!trimmed)
|
|
1550
1762
|
return "";
|
|
@@ -1562,6 +1774,7 @@ export class SageHookRuntime {
|
|
|
1562
1774
|
SAGE_PROMPT: trimmed,
|
|
1563
1775
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1564
1776
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1777
|
+
SAGE_MODEL: model ?? "",
|
|
1565
1778
|
}, JSON.stringify({ prompt: trimmed }), {
|
|
1566
1779
|
failurePolicy: "warn",
|
|
1567
1780
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.suggest),
|
|
@@ -1570,11 +1783,11 @@ export class SageHookRuntime {
|
|
|
1570
1783
|
}
|
|
1571
1784
|
async capturePrompt(prompt, sessionId) {
|
|
1572
1785
|
if (this.config.enableRlmFeedback === false)
|
|
1573
|
-
return;
|
|
1786
|
+
return undefined;
|
|
1574
1787
|
const trimmed = prompt.trim();
|
|
1575
1788
|
if (!trimmed)
|
|
1576
|
-
return;
|
|
1577
|
-
await this.run(["capture", "hook", "prompt"], {
|
|
1789
|
+
return undefined;
|
|
1790
|
+
const result = await this.run(["capture", "hook", "prompt"], {
|
|
1578
1791
|
PROMPT: trimmed,
|
|
1579
1792
|
SAGE_PROMPT: trimmed,
|
|
1580
1793
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
@@ -1583,34 +1796,172 @@ export class SageHookRuntime {
|
|
|
1583
1796
|
failurePolicy: "silent",
|
|
1584
1797
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1585
1798
|
});
|
|
1799
|
+
const captureId = result?.stdout
|
|
1800
|
+
.trim()
|
|
1801
|
+
.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i)?.[0];
|
|
1802
|
+
return captureId;
|
|
1586
1803
|
}
|
|
1587
|
-
async captureResponse(response, usage, sessionId) {
|
|
1804
|
+
async captureResponse(response, usage, sessionId, captureId) {
|
|
1588
1805
|
if (this.config.enableRlmFeedback === false)
|
|
1589
|
-
return;
|
|
1806
|
+
return false;
|
|
1590
1807
|
const trimmed = response.trim();
|
|
1591
1808
|
if (!trimmed)
|
|
1592
|
-
return;
|
|
1593
|
-
|
|
1809
|
+
return false;
|
|
1810
|
+
const args = ["capture", "hook", "response"];
|
|
1811
|
+
const exactCaptureId = captureId?.trim();
|
|
1812
|
+
if (exactCaptureId)
|
|
1813
|
+
args.push("--correlation-id", exactCaptureId);
|
|
1814
|
+
const result = await this.run(args, {
|
|
1594
1815
|
SAGE_RESPONSE: trimmed,
|
|
1595
1816
|
LAST_RESPONSE: trimmed,
|
|
1596
1817
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1597
1818
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1819
|
+
SAGE_DEFER_SUGGESTION_FEEDBACK: "1",
|
|
1598
1820
|
TOKENS_INPUT: usage.input ?? "",
|
|
1599
1821
|
TOKENS_OUTPUT: usage.output ?? "",
|
|
1600
1822
|
}, JSON.stringify({ response: trimmed }), {
|
|
1601
1823
|
failurePolicy: "silent",
|
|
1602
1824
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1603
1825
|
});
|
|
1826
|
+
return result !== null;
|
|
1604
1827
|
}
|
|
1605
|
-
async recordSuggestionUse(skillKeys, sessionId) {
|
|
1828
|
+
async recordSuggestionUse(skillKeys, sessionId, correlationId) {
|
|
1606
1829
|
if (this.config.enableRlmFeedback === false)
|
|
1607
|
-
return;
|
|
1830
|
+
return false;
|
|
1608
1831
|
const used = [
|
|
1609
1832
|
...new Set(skillKeys.map((key) => key.trim()).filter(Boolean)),
|
|
1610
1833
|
];
|
|
1611
1834
|
if (used.length === 0)
|
|
1835
|
+
return false;
|
|
1836
|
+
const args = [
|
|
1837
|
+
"suggest",
|
|
1838
|
+
"feedback",
|
|
1839
|
+
"use",
|
|
1840
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1841
|
+
];
|
|
1842
|
+
const correlation = correlationId?.trim();
|
|
1843
|
+
if (correlation)
|
|
1844
|
+
args.push("--correlation-id", correlation);
|
|
1845
|
+
const result = await this.run(args, {
|
|
1846
|
+
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1847
|
+
SAGE_SESSION_ID: sessionId ?? "",
|
|
1848
|
+
}, undefined, {
|
|
1849
|
+
failurePolicy: "silent",
|
|
1850
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1851
|
+
});
|
|
1852
|
+
return result !== null;
|
|
1853
|
+
}
|
|
1854
|
+
/**
|
|
1855
|
+
* Atomically record use of procedures that Pi loaded natively. This path
|
|
1856
|
+
* intentionally has no fallback to legacy suggestion feedback: the daemon
|
|
1857
|
+
* must authorize every returned qualified record from session-scoped load
|
|
1858
|
+
* evidence and link the complete batch to the exact capture.
|
|
1859
|
+
*/
|
|
1860
|
+
async recordNativeSkillUse(skillKeys, sessionId, captureId) {
|
|
1861
|
+
return (await this.recordNativeSkillUseAttempt(skillKeys, sessionId, captureId)).result;
|
|
1862
|
+
}
|
|
1863
|
+
async recordNativeSkillUseAttempt(skillKeys, sessionId, captureId) {
|
|
1864
|
+
if (this.config.enableRlmFeedback === false)
|
|
1865
|
+
return { result: null, failure: null };
|
|
1866
|
+
const used = dedupeNativeSkillNames(skillKeys);
|
|
1867
|
+
const session = sessionId?.trim();
|
|
1868
|
+
const capture = captureId?.trim();
|
|
1869
|
+
if (used.length === 0 || !session || !capture)
|
|
1870
|
+
return { result: null, failure: null };
|
|
1871
|
+
const source = this.config.source?.trim() || "pi";
|
|
1872
|
+
let commandFailure;
|
|
1873
|
+
const result = await this.run([
|
|
1874
|
+
"suggest",
|
|
1875
|
+
"feedback",
|
|
1876
|
+
"native-use",
|
|
1877
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1878
|
+
"--capture-id",
|
|
1879
|
+
capture,
|
|
1880
|
+
"--source",
|
|
1881
|
+
source,
|
|
1882
|
+
"--session",
|
|
1883
|
+
session,
|
|
1884
|
+
"--format",
|
|
1885
|
+
"json",
|
|
1886
|
+
], {
|
|
1887
|
+
SAGE_SOURCE: source,
|
|
1888
|
+
SAGE_SESSION_ID: session,
|
|
1889
|
+
}, undefined, {
|
|
1890
|
+
failurePolicy: "silent",
|
|
1891
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1892
|
+
onFailure: (failure) => {
|
|
1893
|
+
commandFailure = failure;
|
|
1894
|
+
},
|
|
1895
|
+
});
|
|
1896
|
+
if (!result) {
|
|
1897
|
+
return { result: null, failure: classifyNativeSkillUseFailure(commandFailure) };
|
|
1898
|
+
}
|
|
1899
|
+
const parsed = parseNativeSkillUseResult(result.stdout, capture, used);
|
|
1900
|
+
if (!parsed) {
|
|
1901
|
+
return {
|
|
1902
|
+
result: null,
|
|
1903
|
+
failure: {
|
|
1904
|
+
code: "native_use_write_failed",
|
|
1905
|
+
message: "Sage returned an invalid native-use response.",
|
|
1906
|
+
recovery: "Check `sage daemon status` and daemon logs before retrying.",
|
|
1907
|
+
},
|
|
1908
|
+
};
|
|
1909
|
+
}
|
|
1910
|
+
return { result: parsed, failure: null };
|
|
1911
|
+
}
|
|
1912
|
+
/**
|
|
1913
|
+
* Record a daemon load receipt for a full skill procedure this session
|
|
1914
|
+
* loaded through Pi's native full SKILL.md read or sage_execute get. The
|
|
1915
|
+
* structured result only reports `recorded: true` after validating the
|
|
1916
|
+
* explicit CLI's versioned JSON receipt. Ignored and failed writes remain
|
|
1917
|
+
* non-recorded so callers can retry honestly.
|
|
1918
|
+
*/
|
|
1919
|
+
async recordSkillLoadSignal(skillKey, sessionId, via = "slash") {
|
|
1920
|
+
if (this.config.enableRlmFeedback === false) {
|
|
1921
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1922
|
+
}
|
|
1923
|
+
const key = skillKey.trim();
|
|
1924
|
+
const session = sessionId?.trim();
|
|
1925
|
+
// A receipt is session-scoped evidence. Without the real Pi session id,
|
|
1926
|
+
// the CLI would fall back to ambient env (a foreign harness session) and
|
|
1927
|
+
// record evidence that verifies the WRONG scope — worse than nothing.
|
|
1928
|
+
if (!key || !session)
|
|
1929
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1930
|
+
const source = this.config.source?.trim() || "pi";
|
|
1931
|
+
const result = await this.run([
|
|
1932
|
+
"suggest",
|
|
1933
|
+
"load-signal",
|
|
1934
|
+
"--name",
|
|
1935
|
+
key,
|
|
1936
|
+
"--via",
|
|
1937
|
+
via,
|
|
1938
|
+
"--source",
|
|
1939
|
+
source,
|
|
1940
|
+
"--session",
|
|
1941
|
+
session,
|
|
1942
|
+
"--format",
|
|
1943
|
+
"json",
|
|
1944
|
+
], {
|
|
1945
|
+
SAGE_SOURCE: source,
|
|
1946
|
+
SAGE_SESSION_ID: session,
|
|
1947
|
+
}, undefined, {
|
|
1948
|
+
failurePolicy: "silent",
|
|
1949
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1950
|
+
});
|
|
1951
|
+
if (!result)
|
|
1952
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1953
|
+
return (parseNativeSkillLoadResult(result.stdout) ?? {
|
|
1954
|
+
...FAILED_NATIVE_SKILL_LOAD_RESULT,
|
|
1955
|
+
});
|
|
1956
|
+
}
|
|
1957
|
+
async recordSuggestionSkip(sessionId, correlationId) {
|
|
1958
|
+
if (this.config.enableRlmFeedback === false)
|
|
1612
1959
|
return;
|
|
1613
|
-
|
|
1960
|
+
const args = ["suggest", "feedback", "skip"];
|
|
1961
|
+
const correlation = correlationId?.trim();
|
|
1962
|
+
if (correlation)
|
|
1963
|
+
args.push("--correlation-id", correlation);
|
|
1964
|
+
await this.run(args, {
|
|
1614
1965
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1615
1966
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1616
1967
|
}, undefined, {
|
|
@@ -1618,10 +1969,14 @@ export class SageHookRuntime {
|
|
|
1618
1969
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1619
1970
|
});
|
|
1620
1971
|
}
|
|
1621
|
-
async
|
|
1972
|
+
async recordSuggestionReject(sessionId, correlationId) {
|
|
1622
1973
|
if (this.config.enableRlmFeedback === false)
|
|
1623
1974
|
return;
|
|
1624
|
-
|
|
1975
|
+
const args = ["suggest", "feedback", "reject"];
|
|
1976
|
+
const correlation = correlationId?.trim();
|
|
1977
|
+
if (correlation)
|
|
1978
|
+
args.push("--correlation-id", correlation);
|
|
1979
|
+
await this.run(args, {
|
|
1625
1980
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1626
1981
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1627
1982
|
}, undefined, {
|
|
@@ -1629,7 +1984,7 @@ export class SageHookRuntime {
|
|
|
1629
1984
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1630
1985
|
});
|
|
1631
1986
|
}
|
|
1632
|
-
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model) {
|
|
1987
|
+
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model, correlationId, captureId) {
|
|
1633
1988
|
if (this.config.enableRlmFeedback === false)
|
|
1634
1989
|
return;
|
|
1635
1990
|
const key = skillKey.trim();
|
|
@@ -1639,6 +1994,12 @@ export class SageHookRuntime {
|
|
|
1639
1994
|
const preview = queryPreview?.trim();
|
|
1640
1995
|
if (preview)
|
|
1641
1996
|
args.push("--query-preview", preview.slice(0, 500));
|
|
1997
|
+
const correlation = correlationId?.trim();
|
|
1998
|
+
if (correlation)
|
|
1999
|
+
args.push("--correlation-id", correlation);
|
|
2000
|
+
const exactCaptureId = captureId?.trim();
|
|
2001
|
+
if (exactCaptureId)
|
|
2002
|
+
args.push("--capture-id", exactCaptureId);
|
|
1642
2003
|
await this.run(args, {
|
|
1643
2004
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1644
2005
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
@@ -1774,14 +2135,19 @@ export class SageHookRuntime {
|
|
|
1774
2135
|
if (this.config.sageProfile) {
|
|
1775
2136
|
commandEnv.SAGE_PROFILE = this.config.sageProfile;
|
|
1776
2137
|
}
|
|
2138
|
+
if (this.workingDirectory && !commandEnv.SAGE_WORKSPACE) {
|
|
2139
|
+
commandEnv.SAGE_WORKSPACE = this.workingDirectory;
|
|
2140
|
+
}
|
|
1777
2141
|
const result = await this.commandRunner({
|
|
1778
2142
|
command: this.config.sageBin,
|
|
1779
2143
|
args,
|
|
1780
2144
|
env: commandEnv,
|
|
1781
2145
|
stdin,
|
|
2146
|
+
cwd: this.workingDirectory,
|
|
1782
2147
|
timeoutMs: options.timeoutMs ?? this.config.timeoutMs,
|
|
1783
2148
|
});
|
|
1784
2149
|
if (result.timedOut || result.exitCode !== 0) {
|
|
2150
|
+
options.onFailure?.(result);
|
|
1785
2151
|
const detail = (result.stderr || result.stdout || "").trim();
|
|
1786
2152
|
const message = result.timedOut
|
|
1787
2153
|
? `[sage-pi-adapter] Sage command timed out: ${commandText}`
|
|
@@ -1799,6 +2165,12 @@ export class SageHookRuntime {
|
|
|
1799
2165
|
}
|
|
1800
2166
|
catch (error) {
|
|
1801
2167
|
const detail = error instanceof Error ? error.message : String(error);
|
|
2168
|
+
options.onFailure?.({
|
|
2169
|
+
exitCode: -1,
|
|
2170
|
+
stdout: "",
|
|
2171
|
+
stderr: detail,
|
|
2172
|
+
timedOut: false,
|
|
2173
|
+
});
|
|
1802
2174
|
const message = `[sage-pi-adapter] Sage command error: ${commandText}${detail ? `\n${detail}` : ""}`;
|
|
1803
2175
|
if (failurePolicy === "throw")
|
|
1804
2176
|
throw new Error(message);
|
|
@@ -2351,7 +2723,7 @@ async function injectHookMessage(session, customType, content, display = false)
|
|
|
2351
2723
|
console.log(`\n[${customType}]\n${trimmed}\n`);
|
|
2352
2724
|
}
|
|
2353
2725
|
export function createSageExtensions(options) {
|
|
2354
|
-
const { mcpBridge
|
|
2726
|
+
const { mcpBridge } = options;
|
|
2355
2727
|
const hookRuntime = options.hookRuntime ??
|
|
2356
2728
|
new SageHookRuntime({
|
|
2357
2729
|
sageBin: options.config.sageBin ?? "sage",
|
|
@@ -2375,40 +2747,13 @@ export function createSageExtensions(options) {
|
|
|
2375
2747
|
hookRuntime,
|
|
2376
2748
|
getSessionId: options.getSessionId,
|
|
2377
2749
|
});
|
|
2378
|
-
let currentSuggestions = "";
|
|
2379
|
-
let lastInjectionTimestamp = 0;
|
|
2380
|
-
let lastSuggestionPrompt = "";
|
|
2381
2750
|
return {
|
|
2382
2751
|
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,
|
|
2752
|
+
// Preserved for one compatibility release. Pi's native skill surface owns
|
|
2753
|
+
// discovery/loading now, so adapter-side prompt injection must stay inert.
|
|
2754
|
+
sageInjectSuggestion: async (_userPrompt, _session, _sessionId) => { },
|
|
2755
|
+
sageClearSuggestions: () => { },
|
|
2756
|
+
sageGetSuggestions: () => "",
|
|
2412
2757
|
};
|
|
2413
2758
|
}
|
|
2414
2759
|
export async function createSageSessionConfig(config = {}) {
|
|
@@ -2487,7 +2832,6 @@ export async function createSageSessionConfig(config = {}) {
|
|
|
2487
2832
|
.catch((error) => {
|
|
2488
2833
|
console.error("[sage-pi-adapter] prompt capture failed:", error);
|
|
2489
2834
|
});
|
|
2490
|
-
void extension.sageInjectSuggestion(content, session, activeSessionId);
|
|
2491
2835
|
return;
|
|
2492
2836
|
}
|
|
2493
2837
|
if (parsed.role === "assistant") {
|