@nookplot/runtime 0.5.143 → 0.5.145
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/__tests__/autonomous.workspaceOpportunity.test.js +12 -0
- package/dist/__tests__/autonomous.workspaceOpportunity.test.js.map +1 -1
- package/dist/__tests__/bdAgentPack.test.d.ts +2 -0
- package/dist/__tests__/bdAgentPack.test.d.ts.map +1 -0
- package/dist/__tests__/bdAgentPack.test.js +44 -0
- package/dist/__tests__/bdAgentPack.test.js.map +1 -0
- package/dist/__tests__/bounties.test.d.ts +11 -0
- package/dist/__tests__/bounties.test.d.ts.map +1 -0
- package/dist/__tests__/bounties.test.js +78 -0
- package/dist/__tests__/bounties.test.js.map +1 -0
- package/dist/__tests__/externalMcpTools.test.d.ts +2 -0
- package/dist/__tests__/externalMcpTools.test.d.ts.map +1 -0
- package/dist/__tests__/externalMcpTools.test.js +94 -0
- package/dist/__tests__/externalMcpTools.test.js.map +1 -0
- package/dist/__tests__/pack.gating.test.d.ts +2 -0
- package/dist/__tests__/pack.gating.test.d.ts.map +1 -0
- package/dist/__tests__/pack.gating.test.js +134 -0
- package/dist/__tests__/pack.gating.test.js.map +1 -0
- package/dist/__tests__/pack.test.d.ts +2 -0
- package/dist/__tests__/pack.test.d.ts.map +1 -0
- package/dist/__tests__/pack.test.js +299 -0
- package/dist/__tests__/pack.test.js.map +1 -0
- package/dist/__tests__/packLoader.test.d.ts +2 -0
- package/dist/__tests__/packLoader.test.d.ts.map +1 -0
- package/dist/__tests__/packLoader.test.js +304 -0
- package/dist/__tests__/packLoader.test.js.map +1 -0
- package/dist/__tests__/presetLoader.test.js +59 -42
- package/dist/__tests__/presetLoader.test.js.map +1 -1
- package/dist/__tests__/runtimeConstructor.test.d.ts +18 -0
- package/dist/__tests__/runtimeConstructor.test.d.ts.map +1 -0
- package/dist/__tests__/runtimeConstructor.test.js +57 -0
- package/dist/__tests__/runtimeConstructor.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.js +24 -24
- package/dist/actionCatalog.d.ts.map +1 -1
- package/dist/actionCatalog.generated.d.ts +1 -1
- package/dist/actionCatalog.generated.d.ts.map +1 -1
- package/dist/actionCatalog.generated.js +18 -8
- package/dist/actionCatalog.generated.js.map +1 -1
- package/dist/actionCatalog.js +4 -12
- package/dist/actionCatalog.js.map +1 -1
- package/dist/autonomous.d.ts +24 -1
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +76 -8
- package/dist/autonomous.js.map +1 -1
- package/dist/bounties.d.ts +21 -1
- package/dist/bounties.d.ts.map +1 -1
- package/dist/bounties.js +5 -1
- package/dist/bounties.js.map +1 -1
- package/dist/conversation/modelLimits.js +17 -17
- package/dist/goal/goalPrompts.js +27 -27
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/pack.d.ts +181 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +379 -0
- package/dist/pack.js.map +1 -0
- package/dist/packLoader.d.ts +109 -0
- package/dist/packLoader.d.ts.map +1 -0
- package/dist/packLoader.js +236 -0
- package/dist/packLoader.js.map +1 -0
- package/dist/presetLoader.d.ts +3 -1
- package/dist/presetLoader.d.ts.map +1 -1
- package/dist/presetLoader.js +7 -1
- package/dist/presetLoader.js.map +1 -1
- package/dist/signalActionMap.d.ts +17 -1
- package/dist/signalActionMap.d.ts.map +1 -1
- package/dist/signalActionMap.js +38 -2
- package/dist/signalActionMap.js.map +1 -1
- package/dist/tools.d.ts +23 -7
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +20 -6
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
package/dist/pack.js
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack — minimal declarative capability bundle for forged agents.
|
|
3
|
+
*
|
|
4
|
+
* ROADMAP_external-mcp-connectors Phase 3: the minimal pack-load slice
|
|
5
|
+
* (ROADMAP_pack-primitive inherits this schema when it lands). A pack declares:
|
|
6
|
+
* - `preset` — the existing Forge knowledge preset (a PresetConfig,
|
|
7
|
+
* embedded verbatim; loaded by PresetLoader unchanged)
|
|
8
|
+
* - `tools` — allowlist of catalog action types the agent may use
|
|
9
|
+
* (CORE_ACTIONS remain the safety floor — see signalActionMap)
|
|
10
|
+
* - `mcpServers` — external MCP servers to mount at load (Phase 1/2 bridge)
|
|
11
|
+
* - `connections` — external services the pack needs, with owner scope
|
|
12
|
+
* - `connectors` — chat/outbound surfaces the agent uses (discord/email)
|
|
13
|
+
*
|
|
14
|
+
* Validation is hand-rolled — no schema-validation dependency exists in the
|
|
15
|
+
* runtime (mirrors the gateway's bounded-JSON-schema precedent) — and collects
|
|
16
|
+
* ALL errors in one pass. `validatePack` is pure: no DB, no network, no fs.
|
|
17
|
+
*
|
|
18
|
+
* @module pack
|
|
19
|
+
*/
|
|
20
|
+
import yaml from "js-yaml";
|
|
21
|
+
import { ACTION_CATALOG } from "./actionCatalog.js";
|
|
22
|
+
/**
|
|
23
|
+
* Connector-platform descriptor table — the ONE pack-side registration
|
|
24
|
+
* point per platform (modes encode the risk posture: chat connectors stay
|
|
25
|
+
* reactive, platform-DM outreach violates ToS; outbound BD rides the agent
|
|
26
|
+
* email bridge). Adding a platform = one entry here; the gateway connector
|
|
27
|
+
* implementation is its own work (see connectorSurfaces.ts gateway-side).
|
|
28
|
+
*/
|
|
29
|
+
export const CONNECTOR_PLATFORMS = {
|
|
30
|
+
discord: { modes: ["reactive"], toolCategory: null, label: "Discord", hasBindings: true },
|
|
31
|
+
telegram: { modes: ["reactive"], toolCategory: null, label: "Telegram", hasBindings: true },
|
|
32
|
+
email: {
|
|
33
|
+
modes: ["outbound"], toolCategory: "email", label: "Email", hasBindings: false,
|
|
34
|
+
readyDetail: "outbound email rides the agent inbox (send_email)",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// ── Constants ─────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Pack FORMAT version this loader understands. Omitted `schemaVersion`
|
|
40
|
+
* means 1. A pack declaring a NEWER schema fails closed with one
|
|
41
|
+
* actionable "upgrade the runtime" error — never key-by-key noise —
|
|
42
|
+
* because a future format may carry semantics (e.g. gating fields) an old
|
|
43
|
+
* loader cannot safely ignore. Packs are durable marketplace artifacts
|
|
44
|
+
* consumed by version-skewed self-hosted loaders; bump this (and keep
|
|
45
|
+
* gateway/src/services/packRegistryService.ts in sync) whenever the pack
|
|
46
|
+
* schema gains a field.
|
|
47
|
+
*/
|
|
48
|
+
export const PACK_SCHEMA_VERSION = 1;
|
|
49
|
+
/**
|
|
50
|
+
* Allowed modes per connector platform — derived view of
|
|
51
|
+
* CONNECTOR_PLATFORMS, kept as a named export for existing consumers.
|
|
52
|
+
* The Record type keeps this exhaustive: a platform added to
|
|
53
|
+
* CONNECTOR_PLATFORMS without a line here is a compile error.
|
|
54
|
+
*/
|
|
55
|
+
export const CONNECTOR_PLATFORM_MODES = {
|
|
56
|
+
discord: CONNECTOR_PLATFORMS.discord.modes,
|
|
57
|
+
telegram: CONNECTOR_PLATFORMS.telegram.modes,
|
|
58
|
+
email: CONNECTOR_PLATFORMS.email.modes,
|
|
59
|
+
};
|
|
60
|
+
const NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
|
|
61
|
+
const VERSION_RE = /^\d+\.\d+\.\d+$/;
|
|
62
|
+
/** Mirrors the gateway serverName regex in routes/mcp.ts. */
|
|
63
|
+
const SERVER_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
64
|
+
/** Mirrors the gateway credentialService regex in routes/mcp.ts + actions.ts. */
|
|
65
|
+
const SERVICE_RE = /^[a-zA-Z0-9_.-]{1,64}$/;
|
|
66
|
+
const MAX_DESCRIPTION_LEN = 500;
|
|
67
|
+
const TOP_LEVEL_KEYS = new Set([
|
|
68
|
+
"schemaVersion", "name", "version", "description", "preset", "tools", "mcpServers", "connections", "connectors",
|
|
69
|
+
]);
|
|
70
|
+
/** Common snake_case misspellings → the camelCase key this schema uses. */
|
|
71
|
+
const KEY_ALIASES = {
|
|
72
|
+
mcp_servers: "mcpServers",
|
|
73
|
+
schema_version: "schemaVersion",
|
|
74
|
+
};
|
|
75
|
+
// ── Helpers ───────────────────────────────────────────────────
|
|
76
|
+
function isPlainObject(v) {
|
|
77
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
78
|
+
}
|
|
79
|
+
function isHttpUrl(v) {
|
|
80
|
+
try {
|
|
81
|
+
const u = new URL(v);
|
|
82
|
+
return u.protocol === "http:" || u.protocol === "https:";
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Deep copy for plain YAML/JSON data (packs never carry functions/dates). */
|
|
89
|
+
function deepCopy(v) {
|
|
90
|
+
return JSON.parse(JSON.stringify(v));
|
|
91
|
+
}
|
|
92
|
+
// ── Validation ────────────────────────────────────────────────
|
|
93
|
+
function validatePreset(preset, errors) {
|
|
94
|
+
if (!isPlainObject(preset)) {
|
|
95
|
+
errors.push("preset: must be an object");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (typeof preset.id !== "string" || preset.id.length === 0) {
|
|
99
|
+
errors.push("preset.id: required non-empty string");
|
|
100
|
+
}
|
|
101
|
+
if (preset.version !== undefined && (typeof preset.version !== "number" || !Number.isInteger(preset.version) || preset.version < 1)) {
|
|
102
|
+
errors.push("preset.version: must be a positive integer");
|
|
103
|
+
}
|
|
104
|
+
if (preset.trustLevel !== undefined && !["verified", "scanned", "raw"].includes(preset.trustLevel)) {
|
|
105
|
+
errors.push('preset.trustLevel: must be "verified" | "scanned" | "raw"');
|
|
106
|
+
}
|
|
107
|
+
if (preset.failurePolicy !== undefined && !["abort", "continue"].includes(preset.failurePolicy)) {
|
|
108
|
+
errors.push('preset.failurePolicy: must be "abort" | "continue"');
|
|
109
|
+
}
|
|
110
|
+
if (preset.maxCostNook !== undefined && (typeof preset.maxCostNook !== "number" || preset.maxCostNook < 0)) {
|
|
111
|
+
errors.push("preset.maxCostNook: must be a non-negative number");
|
|
112
|
+
}
|
|
113
|
+
if (preset.sources !== undefined) {
|
|
114
|
+
if (!Array.isArray(preset.sources)) {
|
|
115
|
+
errors.push("preset.sources: must be an array");
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
preset.sources.forEach((src, i) => {
|
|
119
|
+
if (!isPlainObject(src)) {
|
|
120
|
+
errors.push(`preset.sources[${i}]: must be an object`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (typeof src.type !== "string" || src.type.length === 0) {
|
|
124
|
+
errors.push(`preset.sources[${i}].type: required non-empty string`);
|
|
125
|
+
}
|
|
126
|
+
if (src.label !== undefined && typeof src.label !== "string") {
|
|
127
|
+
errors.push(`preset.sources[${i}].label: must be a string`);
|
|
128
|
+
}
|
|
129
|
+
if (src.config !== undefined && !isPlainObject(src.config)) {
|
|
130
|
+
errors.push(`preset.sources[${i}].config: must be an object`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validate an unknown value as a Pack. Pure — collects every error rather
|
|
138
|
+
* than failing on the first. On success returns a deep copy (the caller's
|
|
139
|
+
* input is never aliased).
|
|
140
|
+
*/
|
|
141
|
+
export function validatePack(input) {
|
|
142
|
+
const errors = [];
|
|
143
|
+
if (!isPlainObject(input)) {
|
|
144
|
+
return { ok: false, pack: null, errors: ["pack: must be an object (YAML mapping)"] };
|
|
145
|
+
}
|
|
146
|
+
// Schema-format gate FIRST: a pack from a newer format fails closed with
|
|
147
|
+
// one actionable error, not a pile of unknown-key noise for fields this
|
|
148
|
+
// loader has never heard of.
|
|
149
|
+
if (input.schemaVersion !== undefined) {
|
|
150
|
+
if (typeof input.schemaVersion !== "number" || !Number.isInteger(input.schemaVersion) || input.schemaVersion < 1) {
|
|
151
|
+
return { ok: false, pack: null, errors: ["schemaVersion: must be a positive integer (omit for 1)"] };
|
|
152
|
+
}
|
|
153
|
+
if (input.schemaVersion > PACK_SCHEMA_VERSION) {
|
|
154
|
+
return {
|
|
155
|
+
ok: false, pack: null,
|
|
156
|
+
errors: [
|
|
157
|
+
`schemaVersion: pack declares schema ${input.schemaVersion}, but this loader supports up to ${PACK_SCHEMA_VERSION} — upgrade @nookplot/runtime / @nookplot/cli to load it`,
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Strict top-level keys — catches typos and the roadmap's snake_case notation.
|
|
163
|
+
for (const key of Object.keys(input)) {
|
|
164
|
+
if (!TOP_LEVEL_KEYS.has(key)) {
|
|
165
|
+
const alias = KEY_ALIASES[key];
|
|
166
|
+
errors.push(alias ? `${key}: unknown key — did you mean "${alias}"?` : `${key}: unknown key`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (typeof input.name !== "string" || !NAME_RE.test(input.name)) {
|
|
170
|
+
errors.push("name: required, 1-100 chars, letters/digits then letters/digits/._-");
|
|
171
|
+
}
|
|
172
|
+
if (typeof input.version !== "string" || !VERSION_RE.test(input.version)) {
|
|
173
|
+
errors.push('version: required semver string, e.g. "1.0.0"');
|
|
174
|
+
}
|
|
175
|
+
if (input.description !== undefined && (typeof input.description !== "string" || input.description.length > MAX_DESCRIPTION_LEN)) {
|
|
176
|
+
errors.push(`description: must be a string of at most ${MAX_DESCRIPTION_LEN} chars`);
|
|
177
|
+
}
|
|
178
|
+
if (input.preset !== undefined)
|
|
179
|
+
validatePreset(input.preset, errors);
|
|
180
|
+
// tools — catalog action allowlist
|
|
181
|
+
if (input.tools !== undefined) {
|
|
182
|
+
if (!Array.isArray(input.tools)) {
|
|
183
|
+
errors.push("tools: must be an array of action types");
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const seen = new Set();
|
|
187
|
+
input.tools.forEach((t, i) => {
|
|
188
|
+
if (typeof t !== "string") {
|
|
189
|
+
errors.push(`tools[${i}]: must be a string`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (t.startsWith("mcp__") || t.startsWith("mcp:")) {
|
|
193
|
+
errors.push(`tools[${i}]: "${t}" — external MCP tools are not allowlisted here; declare the server under mcpServers (its discovered tools surface automatically)`);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!(t in ACTION_CATALOG)) {
|
|
197
|
+
errors.push(`tools[${i}]: unknown action type "${t}" (not in ACTION_CATALOG)`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (seen.has(t))
|
|
201
|
+
errors.push(`tools[${i}]: duplicate action type "${t}"`);
|
|
202
|
+
seen.add(t);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// connections — validated before mcpServers so refs can resolve
|
|
207
|
+
const connectionServices = new Set();
|
|
208
|
+
if (input.connections !== undefined) {
|
|
209
|
+
if (!Array.isArray(input.connections)) {
|
|
210
|
+
errors.push("connections: must be an array");
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
input.connections.forEach((c, i) => {
|
|
214
|
+
if (!isPlainObject(c)) {
|
|
215
|
+
errors.push(`connections[${i}]: must be an object`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (typeof c.service !== "string" || !SERVICE_RE.test(c.service)) {
|
|
219
|
+
errors.push(`connections[${i}].service: required, 1-64 chars of letters/digits/._-`);
|
|
220
|
+
}
|
|
221
|
+
else if (connectionServices.has(c.service)) {
|
|
222
|
+
errors.push(`connections[${i}].service: duplicate service "${c.service}"`);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
connectionServices.add(c.service);
|
|
226
|
+
}
|
|
227
|
+
if (c.owner !== "agent" && c.owner !== "workspace") {
|
|
228
|
+
errors.push(`connections[${i}].owner: must be "agent" | "workspace"`);
|
|
229
|
+
}
|
|
230
|
+
for (const key of Object.keys(c)) {
|
|
231
|
+
if (key !== "service" && key !== "owner")
|
|
232
|
+
errors.push(`connections[${i}].${key}: unknown key`);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// mcpServers
|
|
238
|
+
const referencedConnections = new Set();
|
|
239
|
+
if (input.mcpServers !== undefined) {
|
|
240
|
+
if (!Array.isArray(input.mcpServers)) {
|
|
241
|
+
errors.push("mcpServers: must be an array");
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
const names = new Set();
|
|
245
|
+
input.mcpServers.forEach((s, i) => {
|
|
246
|
+
if (!isPlainObject(s)) {
|
|
247
|
+
errors.push(`mcpServers[${i}]: must be an object`);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (typeof s.name !== "string" || !SERVER_NAME_RE.test(s.name)) {
|
|
251
|
+
errors.push(`mcpServers[${i}].name: required, 1-64 chars of letters/digits/_-`);
|
|
252
|
+
}
|
|
253
|
+
else if (names.has(s.name)) {
|
|
254
|
+
errors.push(`mcpServers[${i}].name: duplicate server name "${s.name}"`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
names.add(s.name);
|
|
258
|
+
}
|
|
259
|
+
if (typeof s.url !== "string" || !isHttpUrl(s.url)) {
|
|
260
|
+
errors.push(`mcpServers[${i}].url: required http(s) URL`);
|
|
261
|
+
}
|
|
262
|
+
if (s.connection !== undefined) {
|
|
263
|
+
if (typeof s.connection !== "string") {
|
|
264
|
+
errors.push(`mcpServers[${i}].connection: must be a string`);
|
|
265
|
+
}
|
|
266
|
+
else if (!connectionServices.has(s.connection)) {
|
|
267
|
+
errors.push(`mcpServers[${i}].connection: "${s.connection}" does not match any connections[].service`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
referencedConnections.add(s.connection);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const key of Object.keys(s)) {
|
|
274
|
+
if (key !== "name" && key !== "url" && key !== "connection")
|
|
275
|
+
errors.push(`mcpServers[${i}].${key}: unknown key`);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Dead-declaration check: every connection must authenticate something.
|
|
281
|
+
for (const service of connectionServices) {
|
|
282
|
+
if (!referencedConnections.has(service)) {
|
|
283
|
+
errors.push(`connections: service "${service}" is not referenced by any mcpServers[].connection — remove it or wire it`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// connectors
|
|
287
|
+
if (input.connectors !== undefined) {
|
|
288
|
+
if (!Array.isArray(input.connectors)) {
|
|
289
|
+
errors.push("connectors: must be an array");
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const platforms = new Set();
|
|
293
|
+
input.connectors.forEach((c, i) => {
|
|
294
|
+
if (!isPlainObject(c)) {
|
|
295
|
+
errors.push(`connectors[${i}]: must be an object`);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const platform = c.platform;
|
|
299
|
+
if (typeof platform !== "string" || !(platform in CONNECTOR_PLATFORMS)) {
|
|
300
|
+
errors.push(`connectors[${i}].platform: must be one of ${Object.keys(CONNECTOR_PLATFORMS).join(" | ")}`);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (platforms.has(platform)) {
|
|
304
|
+
errors.push(`connectors[${i}].platform: duplicate platform "${platform}"`);
|
|
305
|
+
}
|
|
306
|
+
platforms.add(platform);
|
|
307
|
+
const allowed = CONNECTOR_PLATFORMS[platform].modes;
|
|
308
|
+
if (typeof c.mode !== "string" || !allowed.includes(c.mode)) {
|
|
309
|
+
errors.push(`connectors[${i}].mode: "${String(c.mode)}" not allowed for ${platform} (allowed: ${allowed.join(", ")})`);
|
|
310
|
+
}
|
|
311
|
+
for (const key of Object.keys(c)) {
|
|
312
|
+
if (key !== "platform" && key !== "mode")
|
|
313
|
+
errors.push(`connectors[${i}].${key}: unknown key`);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (errors.length > 0)
|
|
319
|
+
return { ok: false, pack: null, errors };
|
|
320
|
+
return { ok: true, pack: deepCopy(input), errors: [] };
|
|
321
|
+
}
|
|
322
|
+
/** Parse a YAML (or JSON) pack document and validate it. */
|
|
323
|
+
export function parsePack(text) {
|
|
324
|
+
let doc;
|
|
325
|
+
try {
|
|
326
|
+
doc = yaml.load(text);
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
return { ok: false, pack: null, errors: [`pack: YAML parse error — ${err instanceof Error ? err.message : String(err)}`] };
|
|
330
|
+
}
|
|
331
|
+
return validatePack(doc);
|
|
332
|
+
}
|
|
333
|
+
// ── Preset conversion (lossless round-trip) ───────────────────
|
|
334
|
+
/**
|
|
335
|
+
* Convert an existing Forge preset (the `preset:` block of nookplot.yaml)
|
|
336
|
+
* into a Pack. The preset is embedded verbatim, so
|
|
337
|
+
* `packToPresetConfig(presetToPack(p))` deep-equals `p` — lossless.
|
|
338
|
+
* Throws if the result does not validate (e.g. a preset id that can't be a
|
|
339
|
+
* pack name and no explicit name was given).
|
|
340
|
+
*/
|
|
341
|
+
export function presetToPack(preset, meta) {
|
|
342
|
+
const candidate = {
|
|
343
|
+
name: meta?.name ?? preset.id,
|
|
344
|
+
version: meta?.version ?? `${preset.version ?? 1}.0.0`,
|
|
345
|
+
...(meta?.description !== undefined ? { description: meta.description } : {}),
|
|
346
|
+
preset: deepCopy(preset),
|
|
347
|
+
};
|
|
348
|
+
const result = validatePack(candidate);
|
|
349
|
+
if (!result.ok || !result.pack) {
|
|
350
|
+
throw new Error(`presetToPack: converted pack is invalid — ${result.errors.join("; ")}`);
|
|
351
|
+
}
|
|
352
|
+
return result.pack;
|
|
353
|
+
}
|
|
354
|
+
/** Extract the embedded Forge preset from a pack (null when none declared). */
|
|
355
|
+
export function packToPresetConfig(pack) {
|
|
356
|
+
return pack.preset ? deepCopy(pack.preset) : null;
|
|
357
|
+
}
|
|
358
|
+
// ── Action resolution (gating input) ──────────────────────────
|
|
359
|
+
/**
|
|
360
|
+
* Resolve a pack's declared action set: `tools` ∪ each connector's catalog
|
|
361
|
+
* category (email → the "email" actions; discord contributes none). This is
|
|
362
|
+
* the `packActions` input to getAvailableActionsFromMap — mounted external
|
|
363
|
+
* MCP tools (`mcp__*`) are NOT included here; they merge via externalActions.
|
|
364
|
+
* Sorted for deterministic prompts/tests.
|
|
365
|
+
*/
|
|
366
|
+
export function resolvePackActions(pack) {
|
|
367
|
+
const actions = new Set(pack.tools ?? []);
|
|
368
|
+
for (const connector of pack.connectors ?? []) {
|
|
369
|
+
const category = CONNECTOR_PLATFORMS[connector.platform].toolCategory;
|
|
370
|
+
if (!category)
|
|
371
|
+
continue;
|
|
372
|
+
for (const [name, info] of Object.entries(ACTION_CATALOG)) {
|
|
373
|
+
if (info.category === category)
|
|
374
|
+
actions.add(name);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return Array.from(actions).sort();
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=pack.js.map
|
package/dist/pack.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PackLoader — loads a Pack at agent boot (ROADMAP_external-mcp-connectors
|
|
3
|
+
* Phase 3; the minimal pack-load slice that ROADMAP_pack-primitive inherits).
|
|
4
|
+
*
|
|
5
|
+
* On load it:
|
|
6
|
+
* 1. Parses + validates the pack (from options.pack or a pack YAML file).
|
|
7
|
+
* 2. Pre-flights every declared connection — which external services are
|
|
8
|
+
* already connected (agent credential / OAuth / workspace connection) —
|
|
9
|
+
* and produces actionable hints for the missing ones.
|
|
10
|
+
* 3. Mounts the declared MCP servers via the Phase-1/2 bridge
|
|
11
|
+
* (POST /v1/agents/me/mcp/servers is an upsert, so re-loading is
|
|
12
|
+
* idempotent). Servers whose connection is unsatisfied are skipped.
|
|
13
|
+
* 4. Reports connector binding status (Discord bindings are created in the
|
|
14
|
+
* platform install flow — a pack declares the capability; the loader
|
|
15
|
+
* reports bound/unbound).
|
|
16
|
+
* 5. Delegates the embedded `preset` block verbatim to PresetLoader.
|
|
17
|
+
*
|
|
18
|
+
* The loader mounts and reports; it does NOT gate. Pass the same pack to
|
|
19
|
+
* `new AutonomousAgent(runtime, { pack })` for prompt + dispatch gating.
|
|
20
|
+
*
|
|
21
|
+
* @module packLoader
|
|
22
|
+
*/
|
|
23
|
+
import type { NookplotRuntime } from "./index.js";
|
|
24
|
+
import { type PresetLoadResult } from "./presetLoader.js";
|
|
25
|
+
import { type Pack, type PackConnection, type PackConnectorMode, type PackConnectorPlatform } from "./pack.js";
|
|
26
|
+
export interface PackLoaderOptions {
|
|
27
|
+
/** Pre-parsed pack — skips the file read. Caller is responsible for validation (parsePack). */
|
|
28
|
+
pack?: Pack;
|
|
29
|
+
/**
|
|
30
|
+
* Registry reference, `"name"` or `"name@1.2.3"` — fetched from the
|
|
31
|
+
* gateway pack registry via POST /v1/agents/me/pack/load (which also
|
|
32
|
+
* records it as the agent's active pack). Registry content is untrusted:
|
|
33
|
+
* it is re-validated with parsePack before use. Takes precedence over
|
|
34
|
+
* `packPath`; `pack` takes precedence over both.
|
|
35
|
+
*/
|
|
36
|
+
packRef?: string;
|
|
37
|
+
/** Path to a pack YAML file (default "./pack.yaml"). */
|
|
38
|
+
packPath?: string;
|
|
39
|
+
/** Workspace that satisfies `owner: "workspace"` connections. */
|
|
40
|
+
workspaceId?: string;
|
|
41
|
+
/** Config path forwarded to PresetLoader (manifest conventions; default "./nookplot.yaml"). */
|
|
42
|
+
presetConfigPath?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface PackConnectionStatus {
|
|
45
|
+
service: string;
|
|
46
|
+
owner: PackConnection["owner"];
|
|
47
|
+
status: "satisfied" | "missing";
|
|
48
|
+
/** How the satisfied connection authenticates at mount time. */
|
|
49
|
+
authType?: "bearer_credential" | "oauth" | "workspace";
|
|
50
|
+
/** Actionable next step when missing. */
|
|
51
|
+
hint?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface PackMcpServerStatus {
|
|
54
|
+
name: string;
|
|
55
|
+
url: string;
|
|
56
|
+
status: "mounted" | "failed" | "skipped";
|
|
57
|
+
toolCount?: number;
|
|
58
|
+
/** Mount error (status "failed"). */
|
|
59
|
+
error?: string;
|
|
60
|
+
/** Why the mount was skipped (status "skipped"). */
|
|
61
|
+
reason?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface PackConnectorStatus {
|
|
64
|
+
platform: PackConnectorPlatform;
|
|
65
|
+
mode: PackConnectorMode;
|
|
66
|
+
/** discord: bound/unbound (active bindings exist); email: always ready. */
|
|
67
|
+
status: "bound" | "unbound" | "ready";
|
|
68
|
+
detail?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface PackLoadReport {
|
|
71
|
+
name: string;
|
|
72
|
+
version: string;
|
|
73
|
+
/** Where the pack came from: a pre-parsed object, a local file, or the gateway registry. */
|
|
74
|
+
source: "inline" | "file" | "registry";
|
|
75
|
+
/** Registry artifact fingerprint (sha256 of the stored YAML) — registry source only. */
|
|
76
|
+
contentHash?: string;
|
|
77
|
+
connections: PackConnectionStatus[];
|
|
78
|
+
mcpServers: PackMcpServerStatus[];
|
|
79
|
+
connectors: PackConnectorStatus[];
|
|
80
|
+
/** Present when the pack embeds a `preset` block. */
|
|
81
|
+
preset?: PresetLoadResult;
|
|
82
|
+
/** The pack's resolved action set — feed to AutonomousAgent / getAvailableActionsFromMap. */
|
|
83
|
+
actions: string[];
|
|
84
|
+
/** True when every connection is satisfied and every mount succeeded. */
|
|
85
|
+
ok: boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Fetch a pack from the gateway registry by `"name"` or `"name@1.2.3"` via
|
|
89
|
+
* POST /v1/agents/me/pack/load — which also records it as the calling
|
|
90
|
+
* agent's active pack. Registry content is untrusted: it is re-validated
|
|
91
|
+
* with parsePack before returning; invalid content throws.
|
|
92
|
+
*/
|
|
93
|
+
export declare function fetchRegistryPack(runtime: NookplotRuntime, ref: string): Promise<{
|
|
94
|
+
pack: Pack;
|
|
95
|
+
contentHash?: string;
|
|
96
|
+
}>;
|
|
97
|
+
export declare class PackLoader {
|
|
98
|
+
private runtime;
|
|
99
|
+
private options;
|
|
100
|
+
constructor(runtime: NookplotRuntime, options?: PackLoaderOptions);
|
|
101
|
+
/** Load the pack: validate → pre-flight → mount → connector status → preset. */
|
|
102
|
+
load(): Promise<PackLoadReport>;
|
|
103
|
+
private resolvePack;
|
|
104
|
+
private checkConnections;
|
|
105
|
+
private oauthConnected;
|
|
106
|
+
private mountServers;
|
|
107
|
+
private checkConnectors;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=packLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packLoader.d.ts","sourceRoot":"","sources":["../src/packLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAwF,KAAK,IAAI,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAIrM,MAAM,WAAW,iBAAiB;IAChC,+FAA+F;IAC/F,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,GAAG,WAAW,CAAC;IACvD,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,IAAI,EAAE,iBAAiB,CAAC;IACxB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACvC,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,qDAAqD;IACrD,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,6FAA6F;IAC7F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,EAAE,EAAE,OAAO,CAAC;CACb;AAID;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB;IAKrE,gFAAgF;IAC1E,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC;YAgCvB,WAAW;YAmBX,gBAAgB;YAiEhB,cAAc;YAad,YAAY;YAuCZ,eAAe;CA4B9B"}
|