@rivus/agent 0.14.4 → 0.15.0
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/bootstrap/pi-feishu.d.ts +2 -2
- package/dist/bootstrap/pi-feishu.js +4118 -388
- package/dist/chunks/index.d.ts +117 -1
- package/dist/chunks/pi.js +56 -19
- package/dist/chunks/rivus-daemon-cli.js +452 -144
- package/dist/chunks/rivus-model-management-wire.js +344 -0
- package/dist/chunks/rivus-plugin-testkit.js +1 -1
- package/dist/chunks/{tool-input-digest.js → rivus-tool.js} +67 -67
- package/dist/chunks/src.js +1885 -1687
- package/dist/cli.js +152 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -4
- package/dist/mcp.js +1 -1
- package/dist/pi.d.ts +2 -0
- package/dist/pi.js +1 -1
- package/examples/pi-feishu-deployment.bootstrap.ts +557 -462
- package/package.json +5 -3
- package/skills/runtime-management/SKILL.md +61 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
//#region src/adapters/cli/model/rivus-model-cli-protocol.ts
|
|
2
|
+
const RIVUS_MODEL_CLI_USAGE = `Usage:
|
|
3
|
+
rivus model status --json [--request <id>] [--verbose]
|
|
4
|
+
rivus model set --model <provider/model> --expected-revision <n> --request <id> --json [--verbose]
|
|
5
|
+
rivus model rollback --expected-revision <n> --request <id> --json [--verbose]
|
|
6
|
+
|
|
7
|
+
Commands:
|
|
8
|
+
status Read the effective and persistent model selection
|
|
9
|
+
set Submit one authorized model change
|
|
10
|
+
rollback Submit one authorized change to the previous model
|
|
11
|
+
|
|
12
|
+
All command results are JSON. A successful set or rollback call means the request
|
|
13
|
+
was accepted; query status by request id for the final outcome.
|
|
14
|
+
`;
|
|
15
|
+
function parseRivusModelCliArguments(argv) {
|
|
16
|
+
if (argv.includes("--help") || argv.includes("-h")) return { help: true };
|
|
17
|
+
const operation = argv[0];
|
|
18
|
+
if (operation !== "status" && operation !== "set" && operation !== "rollback") return { error: "model requires one of status, set, rollback" };
|
|
19
|
+
let expectedRevision;
|
|
20
|
+
let json = false;
|
|
21
|
+
let model;
|
|
22
|
+
let requestId;
|
|
23
|
+
let verbose = false;
|
|
24
|
+
for (let index = 1; index < argv.length; index += 1) {
|
|
25
|
+
const argument = argv[index];
|
|
26
|
+
if (argument === "--json") {
|
|
27
|
+
if (json) return { error: "--json may only be provided once" };
|
|
28
|
+
json = true;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (argument === "--verbose") {
|
|
32
|
+
if (verbose) return { error: "--verbose may only be provided once" };
|
|
33
|
+
verbose = true;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (argument === "--request") {
|
|
37
|
+
if (requestId !== void 0) return { error: "--request may only be provided once" };
|
|
38
|
+
const value = argv[index + 1];
|
|
39
|
+
if (!value || value.startsWith("-")) return { error: "--request requires an id" };
|
|
40
|
+
requestId = value;
|
|
41
|
+
index += 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (argument.startsWith("--request=")) {
|
|
45
|
+
if (requestId !== void 0) return { error: "--request may only be provided once" };
|
|
46
|
+
requestId = argument.slice(10);
|
|
47
|
+
if (!requestId) return { error: "--request requires an id" };
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (argument === "--expected-revision") {
|
|
51
|
+
if (expectedRevision !== void 0) return { error: "--expected-revision may only be provided once" };
|
|
52
|
+
const value = argv[index + 1];
|
|
53
|
+
if (!value || value.startsWith("-")) return { error: "--expected-revision requires a non-negative integer" };
|
|
54
|
+
const parsed = parseRevision(value);
|
|
55
|
+
if (parsed === void 0) return { error: "--expected-revision requires a non-negative integer" };
|
|
56
|
+
expectedRevision = parsed;
|
|
57
|
+
index += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (argument.startsWith("--expected-revision=")) {
|
|
61
|
+
if (expectedRevision !== void 0) return { error: "--expected-revision may only be provided once" };
|
|
62
|
+
const parsed = parseRevision(argument.slice(20));
|
|
63
|
+
if (parsed === void 0) return { error: "--expected-revision requires a non-negative integer" };
|
|
64
|
+
expectedRevision = parsed;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (argument === "--model") {
|
|
68
|
+
if (model !== void 0) return { error: "--model may only be provided once" };
|
|
69
|
+
const value = argv[index + 1];
|
|
70
|
+
if (!value || value.startsWith("-")) return { error: "--model requires provider/model" };
|
|
71
|
+
if (!isModelReference(value)) return { error: "--model must be provider/model" };
|
|
72
|
+
model = value;
|
|
73
|
+
index += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (argument.startsWith("--model=")) {
|
|
77
|
+
if (model !== void 0) return { error: "--model may only be provided once" };
|
|
78
|
+
const value = argument.slice(8);
|
|
79
|
+
if (!isModelReference(value)) return { error: "--model must be provider/model" };
|
|
80
|
+
model = value;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
return { error: `Unknown model option: ${argument}` };
|
|
84
|
+
}
|
|
85
|
+
if (!json) return { error: "model commands require --json" };
|
|
86
|
+
if (operation === "status") {
|
|
87
|
+
if (model !== void 0) return { error: "status does not accept --model" };
|
|
88
|
+
if (expectedRevision !== void 0) return { error: "status does not accept --expected-revision" };
|
|
89
|
+
return {
|
|
90
|
+
json: true,
|
|
91
|
+
operation,
|
|
92
|
+
...requestId !== void 0 ? { requestId } : {},
|
|
93
|
+
...verbose ? { verbose: true } : {}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (requestId === void 0) return { error: "--request is required for model changes" };
|
|
97
|
+
if (expectedRevision === void 0) return { error: "--expected-revision is required for model changes" };
|
|
98
|
+
if (operation === "set" && model === void 0) return { error: "--model is required for model set" };
|
|
99
|
+
if (operation === "rollback" && model !== void 0) return { error: "rollback does not accept --model" };
|
|
100
|
+
return operation === "set" ? {
|
|
101
|
+
expectedRevision,
|
|
102
|
+
json: true,
|
|
103
|
+
model,
|
|
104
|
+
operation,
|
|
105
|
+
requestId,
|
|
106
|
+
...verbose ? { verbose: true } : {}
|
|
107
|
+
} : {
|
|
108
|
+
expectedRevision,
|
|
109
|
+
json: true,
|
|
110
|
+
operation,
|
|
111
|
+
requestId,
|
|
112
|
+
...verbose ? { verbose: true } : {}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function renderRivusModelCliHelp() {
|
|
116
|
+
return RIVUS_MODEL_CLI_USAGE;
|
|
117
|
+
}
|
|
118
|
+
function renderRivusModelCliArgumentError(error) {
|
|
119
|
+
return `${error}\n\n${RIVUS_MODEL_CLI_USAGE}`;
|
|
120
|
+
}
|
|
121
|
+
function isModelReference(value) {
|
|
122
|
+
return /^[^/\s]+\/[^/\s]+$/.test(value);
|
|
123
|
+
}
|
|
124
|
+
function parseRevision(value) {
|
|
125
|
+
if (!/^\d+$/.test(value)) return void 0;
|
|
126
|
+
const revision = Number(value);
|
|
127
|
+
return Number.isSafeInteger(revision) ? revision : void 0;
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
//#region src/adapters/cli/model/rivus-model-management-wire.ts
|
|
131
|
+
function createRivusModelManagementWireRequest(command, env) {
|
|
132
|
+
const context = optionalString(env.RIVUS_MODEL_CONTEXT);
|
|
133
|
+
return {
|
|
134
|
+
...command,
|
|
135
|
+
...context ? { context } : {}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function parseRivusModelManagementWireRequest(value) {
|
|
139
|
+
if (!isRecord(value)) throw new Error("model request must be a JSON object");
|
|
140
|
+
const operation = value.operation;
|
|
141
|
+
if (operation !== "status" && operation !== "set" && operation !== "rollback") throw new Error("model request operation is invalid");
|
|
142
|
+
const context = optionalString(value.context);
|
|
143
|
+
const requestId = optionalString(value.requestId);
|
|
144
|
+
const verbose = value.verbose === true ? true : void 0;
|
|
145
|
+
if (operation === "status") {
|
|
146
|
+
if (value.json !== true) throw new Error("model request must require JSON output");
|
|
147
|
+
return {
|
|
148
|
+
json: true,
|
|
149
|
+
operation,
|
|
150
|
+
...context ? { context } : {},
|
|
151
|
+
...requestId ? { requestId } : {},
|
|
152
|
+
...verbose ? { verbose: true } : {}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const expectedRevision = value.expectedRevision;
|
|
156
|
+
if (value.json !== true || typeof expectedRevision !== "number" || !Number.isSafeInteger(expectedRevision) || expectedRevision < 0) throw new Error("model request has an invalid expected revision or output mode");
|
|
157
|
+
if (!requestId) throw new Error("model request requires a request id");
|
|
158
|
+
if (operation === "set") {
|
|
159
|
+
const model = optionalString(value.model);
|
|
160
|
+
if (!model || !/^[^/\s]+\/[^/\s]+$/.test(model)) throw new Error("model request target is invalid");
|
|
161
|
+
return {
|
|
162
|
+
expectedRevision,
|
|
163
|
+
json: true,
|
|
164
|
+
model,
|
|
165
|
+
operation,
|
|
166
|
+
requestId,
|
|
167
|
+
...context ? { context } : {},
|
|
168
|
+
...verbose ? { verbose: true } : {}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
expectedRevision,
|
|
173
|
+
json: true,
|
|
174
|
+
operation,
|
|
175
|
+
requestId,
|
|
176
|
+
...context ? { context } : {},
|
|
177
|
+
...verbose ? { verbose: true } : {}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function toRivusModelManagementSubmission(request) {
|
|
181
|
+
const target = request.operation === "set" ? parseTarget(request.model) : void 0;
|
|
182
|
+
return {
|
|
183
|
+
expectedRevision: request.expectedRevision,
|
|
184
|
+
operation: request.operation,
|
|
185
|
+
requestId: request.requestId,
|
|
186
|
+
...target ? { target } : {},
|
|
187
|
+
...request.verbose ? { verbose: true } : {}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function projectRivusModelCliResponse(value, operation) {
|
|
191
|
+
if (!isRecord(value)) throw new Error("model handler must return a JSON object");
|
|
192
|
+
const response = { schemaVersion: 1 };
|
|
193
|
+
copyScalar(response, value, "requestId");
|
|
194
|
+
copyScalar(response, value, "revision");
|
|
195
|
+
copyScalar(response, value, "source");
|
|
196
|
+
copyScalar(response, value, "protocolVersion");
|
|
197
|
+
copyScalar(response, value, "runtimeVersion");
|
|
198
|
+
copyScalar(response, value, "operation");
|
|
199
|
+
copyScalar(response, value, "expectedRevision");
|
|
200
|
+
copyScalar(response, value, "phase");
|
|
201
|
+
copyScalar(response, value, "reason");
|
|
202
|
+
for (const key of [
|
|
203
|
+
"actual",
|
|
204
|
+
"current",
|
|
205
|
+
"persisted",
|
|
206
|
+
"previous",
|
|
207
|
+
"target"
|
|
208
|
+
]) {
|
|
209
|
+
const model = projectModelReference(value[key]);
|
|
210
|
+
if (model) response[key] = model;
|
|
211
|
+
}
|
|
212
|
+
const budget = projectBudget(value.budget);
|
|
213
|
+
if (budget) response.budget = budget;
|
|
214
|
+
const pending = projectPending(value.pending);
|
|
215
|
+
if (pending) response.pending = pending;
|
|
216
|
+
const request = projectReceipt(value.request);
|
|
217
|
+
if (request) response.request = request;
|
|
218
|
+
const error = projectError(value.error);
|
|
219
|
+
if (error) response.error = error;
|
|
220
|
+
const recoveryRequired = projectError(value.recoveryRequired);
|
|
221
|
+
if (recoveryRequired) response.recoveryRequired = recoveryRequired;
|
|
222
|
+
const notification = projectNotification(value.notification);
|
|
223
|
+
if (notification) response.notification = notification;
|
|
224
|
+
const status = value.status;
|
|
225
|
+
response.status = isPublicStatus(status) ? status : value.recoveryRequired !== void 0 ? "recovery-required" : operation === "status" && value.pending !== void 0 ? "pending" : operation === "status" ? "applied" : "failed";
|
|
226
|
+
return response;
|
|
227
|
+
}
|
|
228
|
+
function createRivusModelManagementFailure(code, message) {
|
|
229
|
+
return {
|
|
230
|
+
error: {
|
|
231
|
+
code,
|
|
232
|
+
message
|
|
233
|
+
},
|
|
234
|
+
schemaVersion: 1,
|
|
235
|
+
status: "failed"
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function projectModelReference(value) {
|
|
239
|
+
if (!isRecord(value) || typeof value.provider !== "string" || typeof value.model !== "string") return void 0;
|
|
240
|
+
const result = {
|
|
241
|
+
model: value.model,
|
|
242
|
+
provider: value.provider
|
|
243
|
+
};
|
|
244
|
+
if (typeof value.label === "string") return {
|
|
245
|
+
...result,
|
|
246
|
+
label: value.label
|
|
247
|
+
};
|
|
248
|
+
if (typeof value.bindingRevision === "string") return {
|
|
249
|
+
...result,
|
|
250
|
+
bindingRevision: value.bindingRevision
|
|
251
|
+
};
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
function projectPending(value) {
|
|
255
|
+
if (!isRecord(value)) return void 0;
|
|
256
|
+
const result = {};
|
|
257
|
+
copyScalar(result, value, "phase");
|
|
258
|
+
copyScalar(result, value, "reason");
|
|
259
|
+
if (result.reason === void 0 && typeof result.phase === "string") result.reason = result.phase;
|
|
260
|
+
copyScalar(result, value, "requestId");
|
|
261
|
+
copyScalar(result, value, "updatedAt");
|
|
262
|
+
const request = projectReceipt(value.request);
|
|
263
|
+
if (request) result.request = request;
|
|
264
|
+
const target = projectModelReference(value.target);
|
|
265
|
+
if (target) result.target = target;
|
|
266
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
267
|
+
}
|
|
268
|
+
function projectReceipt(value) {
|
|
269
|
+
if (!isRecord(value)) return void 0;
|
|
270
|
+
const result = {};
|
|
271
|
+
for (const key of [
|
|
272
|
+
"requestId",
|
|
273
|
+
"revision",
|
|
274
|
+
"status",
|
|
275
|
+
"phase",
|
|
276
|
+
"operation",
|
|
277
|
+
"expectedRevision",
|
|
278
|
+
"acceptedAt",
|
|
279
|
+
"updatedAt"
|
|
280
|
+
]) copyScalar(result, value, key);
|
|
281
|
+
const current = projectModelReference(value.current);
|
|
282
|
+
if (current) result.current = current;
|
|
283
|
+
const previous = projectModelReference(value.previous);
|
|
284
|
+
if (previous) result.previous = previous;
|
|
285
|
+
const target = projectModelReference(value.target);
|
|
286
|
+
if (target) result.target = target;
|
|
287
|
+
const budget = projectBudget(value.budget);
|
|
288
|
+
if (budget) result.budget = budget;
|
|
289
|
+
const error = projectError(value.error);
|
|
290
|
+
if (error) result.error = error;
|
|
291
|
+
const notification = projectNotification(value.notification);
|
|
292
|
+
if (notification) result.notification = notification;
|
|
293
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
294
|
+
}
|
|
295
|
+
function projectBudget(value) {
|
|
296
|
+
if (!isRecord(value)) return void 0;
|
|
297
|
+
const result = {};
|
|
298
|
+
for (const key of [
|
|
299
|
+
"deadlineAt",
|
|
300
|
+
"maxOutputTokens",
|
|
301
|
+
"maxPaidRequests",
|
|
302
|
+
"outputTokens",
|
|
303
|
+
"paidRequests"
|
|
304
|
+
]) copyScalar(result, value, key);
|
|
305
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
306
|
+
}
|
|
307
|
+
function projectError(value) {
|
|
308
|
+
if (!isRecord(value) || typeof value.code !== "string" || typeof value.message !== "string") return void 0;
|
|
309
|
+
return {
|
|
310
|
+
code: value.code,
|
|
311
|
+
message: value.message
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function projectNotification(value) {
|
|
315
|
+
if (!isRecord(value)) return void 0;
|
|
316
|
+
const result = {};
|
|
317
|
+
copyScalar(result, value, "attempts");
|
|
318
|
+
copyScalar(result, value, "lastAttemptAt");
|
|
319
|
+
copyScalar(result, value, "status");
|
|
320
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
321
|
+
}
|
|
322
|
+
function copyScalar(target, source, key) {
|
|
323
|
+
const value = source[key];
|
|
324
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") target[key] = value;
|
|
325
|
+
}
|
|
326
|
+
function parseTarget(value) {
|
|
327
|
+
if (!value) throw new Error("model request target is missing");
|
|
328
|
+
const separator = value.indexOf("/");
|
|
329
|
+
return {
|
|
330
|
+
model: value.slice(separator + 1),
|
|
331
|
+
provider: value.slice(0, separator)
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function isPublicStatus(value) {
|
|
335
|
+
return value === "applied" || value === "failed" || value === "pending" || value === "recovery-required" || value === "restored";
|
|
336
|
+
}
|
|
337
|
+
function optionalString(value) {
|
|
338
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
339
|
+
}
|
|
340
|
+
function isRecord(value) {
|
|
341
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
342
|
+
}
|
|
343
|
+
//#endregion
|
|
344
|
+
export { toRivusModelManagementSubmission as a, renderRivusModelCliHelp as c, projectRivusModelCliResponse as i, createRivusModelManagementWireRequest as n, parseRivusModelCliArguments as o, parseRivusModelManagementWireRequest as r, renderRivusModelCliArgumentError as s, createRivusModelManagementFailure as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { o as createRivusHostToolDescriptorProvider, p as deepFreeze, r as createRivusPluginCatalog$1, s as RIVUS_MEMORY_TOOL_ID, t as createRivusAgentCatalog } from "./rivus-agent-definition-resolver.js";
|
|
2
1
|
import { t as createSha256Digest } from "./sha256-digest.js";
|
|
2
|
+
import { o as createRivusHostToolDescriptorProvider, p as deepFreeze, r as createRivusPluginCatalog$1, s as RIVUS_MEMORY_TOOL_ID, t as createRivusAgentCatalog } from "./rivus-agent-definition-resolver.js";
|
|
3
3
|
//#region src/adapters/compatibility/agent-catalog/rivus-agent-catalog.ts
|
|
4
4
|
const runtime = Object.freeze({
|
|
5
5
|
digest: createSha256Digest,
|
|
@@ -1,65 +1,4 @@
|
|
|
1
1
|
import { Unsafe } from "typebox";
|
|
2
|
-
//#region src/adapters/pi/skills/pi-skill-tool.ts
|
|
3
|
-
const PI_SKILL_READER_TOOL_NAME = "rivus_read_skill";
|
|
4
|
-
function createPiSkillRuntime(skills) {
|
|
5
|
-
if (skills.length === 0) return Object.freeze({ prompt: "" });
|
|
6
|
-
const skillsById = new Map(skills.map((skill) => [skill.id, skill]));
|
|
7
|
-
const prompt = [
|
|
8
|
-
"Granted Skills are versioned instructions loaded on demand.",
|
|
9
|
-
`Before following a Skill, call ${PI_SKILL_READER_TOOL_NAME} with its exact ID and follow the returned content.`,
|
|
10
|
-
"Granted Skill catalog:",
|
|
11
|
-
...skills.map((skill) => `- ${skill.id} | ${skill.title} | v${skill.version} | ${skill.digest}`)
|
|
12
|
-
].join("\n");
|
|
13
|
-
const tool = {
|
|
14
|
-
description: "Read the full versioned instructions for one Skill granted to this Agent Runtime.",
|
|
15
|
-
execute: async (_callId, input) => {
|
|
16
|
-
const skillId = readSkillId(input);
|
|
17
|
-
const skill = skillsById.get(skillId);
|
|
18
|
-
if (!skill) throw new Error(`Skill is not granted: ${skillId}`);
|
|
19
|
-
const details = {
|
|
20
|
-
contentLength: skill.content.length,
|
|
21
|
-
digest: skill.digest,
|
|
22
|
-
skillId: skill.id,
|
|
23
|
-
title: skill.title,
|
|
24
|
-
version: skill.version
|
|
25
|
-
};
|
|
26
|
-
return {
|
|
27
|
-
content: [{
|
|
28
|
-
text: skill.content,
|
|
29
|
-
type: "text"
|
|
30
|
-
}],
|
|
31
|
-
details
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
executionMode: "sequential",
|
|
35
|
-
label: "Read granted Skill",
|
|
36
|
-
name: PI_SKILL_READER_TOOL_NAME,
|
|
37
|
-
parameters: Unsafe({
|
|
38
|
-
additionalProperties: false,
|
|
39
|
-
properties: { skillId: {
|
|
40
|
-
description: "Exact Skill ID from the granted Skill catalog.",
|
|
41
|
-
type: "string"
|
|
42
|
-
} },
|
|
43
|
-
required: ["skillId"],
|
|
44
|
-
type: "object"
|
|
45
|
-
}),
|
|
46
|
-
promptSnippet: `${PI_SKILL_READER_TOOL_NAME}: read one granted Skill by exact ID`
|
|
47
|
-
};
|
|
48
|
-
return Object.freeze({
|
|
49
|
-
prompt,
|
|
50
|
-
tool
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
function readSkillId(input) {
|
|
54
|
-
if (input === null || typeof input !== "object" || Array.isArray(input) || typeof input.skillId !== "string") throw new Error("Skill reader input requires a string skillId");
|
|
55
|
-
return input.skillId;
|
|
56
|
-
}
|
|
57
|
-
//#endregion
|
|
58
|
-
//#region src/core/application/agent-catalog/contracts/rivus-tool.ts
|
|
59
|
-
var RivusToolInputRejected = class extends Error {
|
|
60
|
-
name = "RivusToolInputRejected";
|
|
61
|
-
};
|
|
62
|
-
//#endregion
|
|
63
2
|
//#region src/core/application/tool-execution/authority/invocation-authority-registry.ts
|
|
64
3
|
const authorities = /* @__PURE__ */ new WeakMap();
|
|
65
4
|
let localAuthoritySequence = 0;
|
|
@@ -106,11 +45,6 @@ function isRecord(value) {
|
|
|
106
45
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
107
46
|
}
|
|
108
47
|
//#endregion
|
|
109
|
-
//#region src/core/application/tool-execution/authority/tool-risk-policy.ts
|
|
110
|
-
function requiresToolApproval(risk) {
|
|
111
|
-
return risk === "irreversible" || risk === "host-control";
|
|
112
|
-
}
|
|
113
|
-
//#endregion
|
|
114
48
|
//#region src/core/application/tool-execution/brokerage/tool-input-digest.ts
|
|
115
49
|
var InvalidStableJson = class extends Error {
|
|
116
50
|
name = "InvalidStableJson";
|
|
@@ -155,4 +89,70 @@ function serializeStableJson(value, ancestors) {
|
|
|
155
89
|
}
|
|
156
90
|
}
|
|
157
91
|
//#endregion
|
|
158
|
-
|
|
92
|
+
//#region src/core/application/tool-execution/authority/tool-risk-policy.ts
|
|
93
|
+
function requiresToolApproval(risk) {
|
|
94
|
+
return risk === "irreversible" || risk === "host-control";
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/adapters/pi/skills/pi-skill-tool.ts
|
|
98
|
+
const PI_SKILL_READER_TOOL_NAME = "rivus_read_skill";
|
|
99
|
+
function createPiSkillRuntime(skills) {
|
|
100
|
+
if (skills.length === 0) return Object.freeze({ prompt: "" });
|
|
101
|
+
const skillsById = new Map(skills.map((skill) => [skill.id, skill]));
|
|
102
|
+
const prompt = [
|
|
103
|
+
"Granted Skills are versioned instructions loaded on demand.",
|
|
104
|
+
`Before following a Skill, call ${PI_SKILL_READER_TOOL_NAME} with its exact ID and follow the returned content.`,
|
|
105
|
+
"Granted Skill catalog:",
|
|
106
|
+
...skills.map((skill) => `- ${skill.id} | ${skill.title} | v${skill.version} | ${skill.digest}`)
|
|
107
|
+
].join("\n");
|
|
108
|
+
const tool = {
|
|
109
|
+
description: "Read the full versioned instructions for one Skill granted to this Agent Runtime.",
|
|
110
|
+
execute: async (_callId, input) => {
|
|
111
|
+
const skillId = readSkillId(input);
|
|
112
|
+
const skill = skillsById.get(skillId);
|
|
113
|
+
if (!skill) throw new Error(`Skill is not granted: ${skillId}`);
|
|
114
|
+
const details = {
|
|
115
|
+
contentLength: skill.content.length,
|
|
116
|
+
digest: skill.digest,
|
|
117
|
+
skillId: skill.id,
|
|
118
|
+
title: skill.title,
|
|
119
|
+
version: skill.version
|
|
120
|
+
};
|
|
121
|
+
return {
|
|
122
|
+
content: [{
|
|
123
|
+
text: skill.content,
|
|
124
|
+
type: "text"
|
|
125
|
+
}],
|
|
126
|
+
details
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
executionMode: "sequential",
|
|
130
|
+
label: "Read granted Skill",
|
|
131
|
+
name: PI_SKILL_READER_TOOL_NAME,
|
|
132
|
+
parameters: Unsafe({
|
|
133
|
+
additionalProperties: false,
|
|
134
|
+
properties: { skillId: {
|
|
135
|
+
description: "Exact Skill ID from the granted Skill catalog.",
|
|
136
|
+
type: "string"
|
|
137
|
+
} },
|
|
138
|
+
required: ["skillId"],
|
|
139
|
+
type: "object"
|
|
140
|
+
}),
|
|
141
|
+
promptSnippet: `${PI_SKILL_READER_TOOL_NAME}: read one granted Skill by exact ID`
|
|
142
|
+
};
|
|
143
|
+
return Object.freeze({
|
|
144
|
+
prompt,
|
|
145
|
+
tool
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function readSkillId(input) {
|
|
149
|
+
if (input === null || typeof input !== "object" || Array.isArray(input) || typeof input.skillId !== "string") throw new Error("Skill reader input requires a string skillId");
|
|
150
|
+
return input.skillId;
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region src/core/application/agent-catalog/contracts/rivus-tool.ts
|
|
154
|
+
var RivusToolInputRejected = class extends Error {
|
|
155
|
+
name = "RivusToolInputRejected";
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
export { InvalidStableJson as a, normalizeStableJson as c, resolveInvocationAuthority as d, requiresToolApproval as i, InvalidInvocationAuthority as l, PI_SKILL_READER_TOOL_NAME as n, InvalidToolInput as o, createPiSkillRuntime as r, createToolInputDigest as s, RivusToolInputRejected as t, createInvocationAuthority as u };
|