@rivus/agent 0.14.3 → 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.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/acp.js +1 -2
  3. package/dist/bootstrap/pi-feishu.d.ts +2 -2
  4. package/dist/bootstrap/pi-feishu.js +4119 -389
  5. package/dist/chunks/agent-loop.d.ts +55 -300
  6. package/dist/chunks/agent-loop.js +3 -1123
  7. package/dist/chunks/background-session-authority.js +230 -0
  8. package/dist/chunks/background-session-control-input.js +51 -0
  9. package/dist/chunks/background-session-service.d.ts +382 -0
  10. package/dist/chunks/index.d.ts +1294 -515
  11. package/dist/chunks/pi-tool-proxy.d.ts +22 -90
  12. package/dist/chunks/pi.js +60 -20
  13. package/dist/chunks/rivus-agent-definition-resolver.js +508 -0
  14. package/dist/chunks/rivus-daemon-cli.js +3004 -3164
  15. package/dist/chunks/rivus-model-management-wire.js +344 -0
  16. package/dist/chunks/rivus-plugin-testkit.d.ts +175 -2
  17. package/dist/chunks/rivus-plugin-testkit.js +11 -4
  18. package/dist/chunks/rivus-skill.d.ts +95 -0
  19. package/dist/chunks/rivus-tool.js +158 -0
  20. package/dist/chunks/sha256-digest.js +2 -7
  21. package/dist/chunks/src.js +13402 -8264
  22. package/dist/cli.js +901 -698
  23. package/dist/index.d.ts +7 -8
  24. package/dist/index.js +8 -9
  25. package/dist/mcp.d.ts +46 -7
  26. package/dist/mcp.js +145 -19
  27. package/dist/pi.d.ts +5 -4
  28. package/dist/pi.js +1 -1
  29. package/examples/pi-feishu-deployment.bootstrap.ts +557 -462
  30. package/package.json +9 -7
  31. package/skills/runtime-management/SKILL.md +61 -0
  32. package/dist/chunks/api.d.ts +0 -70
  33. package/dist/chunks/api.js +0 -471
  34. package/dist/chunks/api2.d.ts +0 -387
  35. package/dist/chunks/api2.js +0 -1331
  36. package/dist/chunks/api3.d.ts +0 -402
  37. package/dist/chunks/module.js +0 -267
  38. package/dist/chunks/pi-skill-tool.js +0 -460
  39. package/dist/chunks/spi.d.ts +0 -1
  40. package/dist/chunks/spi.js +0 -2
@@ -0,0 +1,158 @@
1
+ import { Unsafe } from "typebox";
2
+ //#region src/core/application/tool-execution/authority/invocation-authority-registry.ts
3
+ const authorities = /* @__PURE__ */ new WeakMap();
4
+ let localAuthoritySequence = 0;
5
+ var InvalidInvocationAuthority = class extends Error {
6
+ name = "InvalidInvocationAuthority";
7
+ };
8
+ function createInvocationAuthority(authority, identity = { next: () => String(++localAuthoritySequence) }) {
9
+ const reference = Object.freeze({ id: `authority:${identity.next()}` });
10
+ authorities.set(reference, normalizeInvocationAuthority(authority));
11
+ return reference;
12
+ }
13
+ function resolveInvocationAuthority(reference) {
14
+ const authority = authorities.get(reference);
15
+ if (!authority) throw new InvalidInvocationAuthority("invocation authority was not issued by this host");
16
+ return authority;
17
+ }
18
+ function normalizeInvocationAuthority(authority) {
19
+ if (!isRecord(authority) || typeof authority.sourceMessageId !== "string" || !authority.sourceMessageId.trim()) throw new InvalidInvocationAuthority("invocation authority requires a trusted source message id");
20
+ if (authority.endpointId !== void 0 && (!authority.endpointId || !authority.endpointId.trim())) throw new InvalidInvocationAuthority("invocation authority requires a trusted endpoint id");
21
+ return Object.freeze({
22
+ ...authority,
23
+ ...authority.allowedActorOpenIds === void 0 ? {} : { allowedActorOpenIds: Object.freeze([...authority.allowedActorOpenIds]) },
24
+ ...authority.memory === void 0 ? {} : { memory: freezeMemoryAuthority(authority.memory) },
25
+ toolGrantSet: freezeGrantSet(authority.toolGrantSet)
26
+ });
27
+ }
28
+ function freezeMemoryAuthority(value) {
29
+ const scopes = value.audience === "group" ? value.scopes.filter(isGroupMemoryScope) : [...value.scopes];
30
+ return Object.freeze({
31
+ ...value,
32
+ scopes: Object.freeze(scopes)
33
+ });
34
+ }
35
+ function freezeGrantSet(value) {
36
+ return Object.freeze({
37
+ revision: value.revision,
38
+ toolIds: Object.freeze([...value.toolIds])
39
+ });
40
+ }
41
+ function isGroupMemoryScope(value) {
42
+ return value === "conversation" || value === "project";
43
+ }
44
+ function isRecord(value) {
45
+ return value !== null && typeof value === "object" && !Array.isArray(value);
46
+ }
47
+ //#endregion
48
+ //#region src/core/application/tool-execution/brokerage/tool-input-digest.ts
49
+ var InvalidStableJson = class extends Error {
50
+ name = "InvalidStableJson";
51
+ };
52
+ var InvalidToolInput = class extends InvalidStableJson {
53
+ name = "InvalidToolInput";
54
+ };
55
+ function createToolInputDigest(input, digest) {
56
+ try {
57
+ return digest(serializeStableJson(input, /* @__PURE__ */ new Set()));
58
+ } catch (error) {
59
+ if (error instanceof InvalidStableJson) throw new InvalidToolInput(error.message);
60
+ throw error;
61
+ }
62
+ }
63
+ function normalizeStableJson(value) {
64
+ return JSON.parse(serializeStableJson(value, /* @__PURE__ */ new Set()));
65
+ }
66
+ function serializeStableJson(value, ancestors) {
67
+ if (value === null) return "null";
68
+ if (typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
69
+ if (typeof value === "number") {
70
+ if (!Number.isFinite(value)) throw new InvalidStableJson("stable JSON numbers must be finite");
71
+ return JSON.stringify(value);
72
+ }
73
+ if (typeof value !== "object" || value === null) throw new InvalidStableJson("value must contain only stable JSON values");
74
+ if (ancestors.has(value)) throw new InvalidStableJson("stable JSON must not contain cycles");
75
+ ancestors.add(value);
76
+ try {
77
+ if (Array.isArray(value)) {
78
+ const output = [];
79
+ for (let index = 0; index < value.length; index += 1) {
80
+ if (!Object.hasOwn(value, index)) throw new InvalidStableJson("stable JSON arrays must not contain holes");
81
+ output.push(serializeStableJson(value[index], ancestors));
82
+ }
83
+ return `[${output.join(",")}]`;
84
+ }
85
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new InvalidStableJson("stable JSON objects must be plain objects");
86
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${serializeStableJson(value[key], ancestors)}`).join(",")}}`;
87
+ } finally {
88
+ ancestors.delete(value);
89
+ }
90
+ }
91
+ //#endregion
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 };
@@ -1,12 +1,7 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- //#region src/platform/identity/random-id.ts
3
- function createRandomId() {
4
- return randomUUID();
5
- }
6
- //#endregion
1
+ import { createHash } from "node:crypto";
7
2
  //#region src/platform/identity/sha256-digest.ts
8
3
  function createSha256Digest(value) {
9
4
  return `sha256:${createHash("sha256").update(value).digest("hex")}`;
10
5
  }
11
6
  //#endregion
12
- export { createRandomId as n, createSha256Digest as t };
7
+ export { createSha256Digest as t };