@happyvertical/smrt-agents 0.30.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/AGENTS.md +96 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +139 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/agent.d.ts +545 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/ai-config.d.ts +27 -0
- package/dist/ai-config.d.ts.map +1 -0
- package/dist/chunks/config-BYbOxt24.js +179 -0
- package/dist/chunks/config-BYbOxt24.js.map +1 -0
- package/dist/chunks/manifest-utils-DLXfTOq0.js +69 -0
- package/dist/chunks/manifest-utils-DLXfTOq0.js.map +1 -0
- package/dist/config.d.ts +117 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/identity.d.ts +19 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1477 -0
- package/dist/index.js.map +1 -0
- package/dist/interests.d.ts +291 -0
- package/dist/interests.d.ts.map +1 -0
- package/dist/manifest.json +2012 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +156 -0
- package/dist/playground.js.map +1 -0
- package/dist/schedule.d.ts +168 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/server/action-types.d.ts +65 -0
- package/dist/server/action-types.d.ts.map +1 -0
- package/dist/server/action-types.js +2 -0
- package/dist/server/action-types.js.map +1 -0
- package/dist/server/api-routes.d.ts +57 -0
- package/dist/server/api-routes.d.ts.map +1 -0
- package/dist/server/config-loader.d.ts +17 -0
- package/dist/server/config-loader.d.ts.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/manifest-utils.d.ts +63 -0
- package/dist/server/manifest-utils.d.ts.map +1 -0
- package/dist/server/serialization.d.ts +58 -0
- package/dist/server/serialization.d.ts.map +1 -0
- package/dist/server.js +105 -0
- package/dist/server.js.map +1 -0
- package/dist/smrt-knowledge.json +983 -0
- package/dist/summary-article.d.ts +30 -0
- package/dist/summary-article.d.ts.map +1 -0
- package/dist/summary-article.js +2 -0
- package/dist/summary-article.js.map +1 -0
- package/dist/svelte/components/AgentDashboard.svelte +250 -0
- package/dist/svelte/components/AgentDashboard.svelte.d.ts +21 -0
- package/dist/svelte/components/AgentDashboard.svelte.d.ts.map +1 -0
- package/dist/svelte/components/AgentRunHistory.svelte +225 -0
- package/dist/svelte/components/AgentRunHistory.svelte.d.ts +16 -0
- package/dist/svelte/components/AgentRunHistory.svelte.d.ts.map +1 -0
- package/dist/svelte/components/AgentScheduleForm.svelte +381 -0
- package/dist/svelte/components/AgentScheduleForm.svelte.d.ts +19 -0
- package/dist/svelte/components/AgentScheduleForm.svelte.d.ts.map +1 -0
- package/dist/svelte/components/AgentScheduleList.svelte +370 -0
- package/dist/svelte/components/AgentScheduleList.svelte.d.ts +24 -0
- package/dist/svelte/components/AgentScheduleList.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ScheduleStatusBadge.svelte +23 -0
- package/dist/svelte/components/ScheduleStatusBadge.svelte.d.ts +9 -0
- package/dist/svelte/components/ScheduleStatusBadge.svelte.d.ts.map +1 -0
- package/dist/svelte/i18n.d.ts +33 -0
- package/dist/svelte/i18n.d.ts.map +1 -0
- package/dist/svelte/i18n.js +37 -0
- package/dist/svelte/index.d.ts +23 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +26 -0
- package/dist/svelte/playground.d.ts +196 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +151 -0
- package/dist/svelte/types.d.ts +155 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +116 -0
- package/dist/tenant-agent.d.ts +106 -0
- package/dist/tenant-agent.d.ts.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +298 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +133 -0
- package/dist/ui.js.map +1 -0
- package/dist/vite-plugin.d.ts +61 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +173 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ResolvedAgentAvailability } from '../tenant-agent.js';
|
|
2
|
+
import { AgentAdminRoute, AgentUISlots } from '../ui.js';
|
|
3
|
+
/**
|
|
4
|
+
* Serialized agent data for passing to client components.
|
|
5
|
+
*
|
|
6
|
+
* Includes manifest-derived fields (icon, permissions, slots)
|
|
7
|
+
* alongside resolution metadata (source, sourceTenantId).
|
|
8
|
+
*/
|
|
9
|
+
export interface SerializedAgent {
|
|
10
|
+
/** Agent instance ID, or a synthetic key if no instance exists */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Human-readable name from manifest */
|
|
13
|
+
name?: string;
|
|
14
|
+
/** Human-readable agent class name (e.g., 'Praeco') */
|
|
15
|
+
agentClass: string;
|
|
16
|
+
/** Canonical agent type (qualified name when available) */
|
|
17
|
+
agentType: string;
|
|
18
|
+
/** STI type discriminator (same as agentType) */
|
|
19
|
+
_meta_type?: string;
|
|
20
|
+
/** UI slot definitions from manifest */
|
|
21
|
+
slots?: AgentUISlots;
|
|
22
|
+
/** Admin route declarations from manifest */
|
|
23
|
+
adminRoutes?: AgentAdminRoute[];
|
|
24
|
+
/** How this agent was resolved for the tenant */
|
|
25
|
+
source?: 'explicit' | 'inherited';
|
|
26
|
+
/** Which tenant the binding came from */
|
|
27
|
+
sourceTenantId?: string;
|
|
28
|
+
/** Merged permissions from manifest + tenant overrides */
|
|
29
|
+
permissions?: Record<string, boolean>;
|
|
30
|
+
/** Agent icon from manifest */
|
|
31
|
+
icon?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Tenant-level config overrides, **secret-sanitized** for client transport.
|
|
34
|
+
*
|
|
35
|
+
* SECURITY (#1553, follow-up to #1552): the raw `TenantAgent.config` is the
|
|
36
|
+
* tenant's own override blob and is `@field({ sensitive: true })` (stripped
|
|
37
|
+
* from the generated CRUD api/mcp surfaces). This hand-written admin
|
|
38
|
+
* serialization runs it through `sanitizeConfig()` from
|
|
39
|
+
* `@happyvertical/smrt-config` before it leaves the server, so secret-shaped
|
|
40
|
+
* keys (apiKey/token/password/…) are dropped and secret-shaped values
|
|
41
|
+
* (`sk-…`, `AKIA…`, `Bearer …`, URL credentials, PEM blocks) are masked —
|
|
42
|
+
* non-secret config still reaches the authorized admin UI for display.
|
|
43
|
+
*
|
|
44
|
+
* This is **display-only**: do not edit-round-trip it back to the server
|
|
45
|
+
* (a masked value would overwrite the real secret). Best practice remains to
|
|
46
|
+
* reference secrets by id via `@happyvertical/smrt-secrets` so only an opaque
|
|
47
|
+
* handle is ever stored in tenant config.
|
|
48
|
+
*/
|
|
49
|
+
config?: Record<string, any>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert a ResolvedAgentAvailability to a serializable shape for the UI.
|
|
53
|
+
*
|
|
54
|
+
* @param resolved - Output from TenantAgentCollection.resolveForTenant()
|
|
55
|
+
* @returns Serialized agent data safe for JSON transport
|
|
56
|
+
*/
|
|
57
|
+
export declare function serializeResolvedAgent(resolved: ResolvedAgentAvailability): SerializedAgent;
|
|
58
|
+
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/server/serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,iDAAiD;IACjD,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IAClC,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,yBAAyB,GAClC,eAAe,CAkBjB"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { A as AgentConfig } from "./chunks/config-BYbOxt24.js";
|
|
2
|
+
import { a, e, l, b } from "./chunks/manifest-utils-DLXfTOq0.js";
|
|
3
|
+
import { sanitizeConfig } from "@happyvertical/smrt-config";
|
|
4
|
+
function buildRouteMap(manifests) {
|
|
5
|
+
const routes = /* @__PURE__ */ new Map();
|
|
6
|
+
for (const manifest of manifests) {
|
|
7
|
+
const packageName = manifest.packageName;
|
|
8
|
+
for (const obj of Object.values(manifest.objects)) {
|
|
9
|
+
const config = obj.decoratorConfig;
|
|
10
|
+
if (!config) continue;
|
|
11
|
+
const api = config.api;
|
|
12
|
+
if (!api?.include || api.include.length === 0) continue;
|
|
13
|
+
const tableName = config.tableName;
|
|
14
|
+
const path = api.path || (tableName ? tableName.replace(/_/g, "-") : null);
|
|
15
|
+
if (!path) continue;
|
|
16
|
+
routes.set(path, {
|
|
17
|
+
className: obj.className,
|
|
18
|
+
allowedActions: api.include,
|
|
19
|
+
packageName
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return routes;
|
|
24
|
+
}
|
|
25
|
+
function resolveAPIRoute(urlPath, routes) {
|
|
26
|
+
const normalized = urlPath.replace(/^\/+|\/+$/g, "");
|
|
27
|
+
if (!normalized) return null;
|
|
28
|
+
const segments = normalized.split("/");
|
|
29
|
+
if (segments.length === 1) {
|
|
30
|
+
const route = routes.get(segments[0]);
|
|
31
|
+
if (route) return { route };
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (segments.length === 2) {
|
|
35
|
+
const route = routes.get(segments[0]);
|
|
36
|
+
if (route) return { route, id: segments[1] };
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (segments.length === 3) {
|
|
40
|
+
const route = routes.get(segments[0]);
|
|
41
|
+
if (route) return { route, id: segments[1], action: segments[2] };
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
async function loadSlotConfigs(agents, dbOptions) {
|
|
47
|
+
if (agents.length === 0) {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const configsByAgent = await AgentConfig.forAgents(
|
|
52
|
+
agents.map((agent) => agent.id),
|
|
53
|
+
dbOptions
|
|
54
|
+
);
|
|
55
|
+
const configs = {};
|
|
56
|
+
for (const [agentId, slotConfigs] of configsByAgent) {
|
|
57
|
+
const agentConfig = {};
|
|
58
|
+
for (const [slotId, configData] of slotConfigs) {
|
|
59
|
+
agentConfig[slotId] = configData;
|
|
60
|
+
}
|
|
61
|
+
if (Object.keys(agentConfig).length > 0) {
|
|
62
|
+
configs[agentId] = agentConfig;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return configs;
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (isMissingAgentConfigTableError(error)) {
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isMissingAgentConfigTableError(error) {
|
|
74
|
+
const message = String(error?.message || error || "");
|
|
75
|
+
return message.includes("Run 'smrt db:migrate'") || /no such table[:\s]+agent_configs/i.test(message) || /relation .*agent_configs.*does not exist/i.test(message) || /table .*agent_configs.*doesn'?t exist/i.test(message);
|
|
76
|
+
}
|
|
77
|
+
function serializeResolvedAgent(resolved) {
|
|
78
|
+
const manifest = resolved.manifest;
|
|
79
|
+
return {
|
|
80
|
+
id: resolved.agentId || `${resolved.sourceTenantId}:${resolved.agentType}`,
|
|
81
|
+
name: manifest?.name || resolved.agentClass,
|
|
82
|
+
agentClass: resolved.agentClass,
|
|
83
|
+
agentType: resolved.agentType,
|
|
84
|
+
_meta_type: resolved.agentType,
|
|
85
|
+
slots: manifest?.uiSlots,
|
|
86
|
+
adminRoutes: manifest?.adminRoutes,
|
|
87
|
+
source: resolved.source,
|
|
88
|
+
sourceTenantId: resolved.sourceTenantId,
|
|
89
|
+
permissions: resolved.permissions,
|
|
90
|
+
icon: manifest?.icon,
|
|
91
|
+
// Secret-sanitize before the blob crosses into the client payload (#1553).
|
|
92
|
+
config: sanitizeConfig(resolved.config)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
buildRouteMap,
|
|
97
|
+
a as extractAgentManifest,
|
|
98
|
+
e as extractAgentPackagesFromConfig,
|
|
99
|
+
l as loadManifestsFromConfig,
|
|
100
|
+
b as loadManifestsFromPackages,
|
|
101
|
+
loadSlotConfigs,
|
|
102
|
+
resolveAPIRoute,
|
|
103
|
+
serializeResolvedAgent
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/server/api-routes.ts","../src/server/config-loader.ts","../src/server/serialization.ts"],"sourcesContent":["/**\n * Server-side API route resolution for SMRT agents\n *\n * Reads agent package manifests and builds a route map from resource\n * paths (e.g., 'performers', 'video-contents') to SmrtObject class\n * names and allowed CRUD actions. The catch-all API handler uses this\n * to resolve incoming requests.\n *\n * @module @happyvertical/smrt-agents/server\n */\n\nimport type { PackageManifest } from './manifest-utils.js';\n\n/**\n * Info about a single API route (one SmrtObject with api.include)\n */\nexport interface AgentAPIRouteInfo {\n /** SmrtObject class name (e.g., 'Performer') */\n className: string;\n /** Allowed CRUD actions (e.g., ['list', 'get', 'create', 'update', 'delete']) */\n allowedActions: string[];\n /** Package that owns this resource */\n packageName?: string;\n}\n\n/**\n * Result of resolving a URL path against the route map\n */\nexport interface ResolvedAPIRoute {\n /** The matched route info */\n route: AgentAPIRouteInfo;\n /** Resource ID if path includes one (e.g., 'performers/abc-123') */\n id?: string;\n /** Custom action name if path includes one (e.g., 'performers/abc-123/generate-image') */\n action?: string;\n}\n\n/**\n * Build a route map from loaded package manifests.\n *\n * Iterates all objects in each manifest, and for any object with a\n * `decoratorConfig.api.include` array, registers a route. The route\n * path is derived from `decoratorConfig.api.path` if set, otherwise\n * from the table name with underscores converted to hyphens.\n *\n * @param manifests - Array of parsed package manifest JSON objects\n * @returns Map of resource path -> route info\n *\n * @example\n * ```typescript\n * const manifests = [histrioManifest, praecoManifest];\n * const routes = buildRouteMap(manifests);\n * // routes.get('performers') => { className: 'Performer', allowedActions: ['list', 'get', 'create', 'update', 'delete'] }\n * // routes.get('video-contents') => { className: 'VideoShot', allowedActions: ['list', 'get', 'create', 'update'] }\n * ```\n */\nexport function buildRouteMap(\n manifests: PackageManifest[],\n): Map<string, AgentAPIRouteInfo> {\n const routes = new Map<string, AgentAPIRouteInfo>();\n\n for (const manifest of manifests) {\n const packageName = (manifest as Record<string, unknown>).packageName as\n | string\n | undefined;\n\n for (const obj of Object.values(manifest.objects)) {\n const config = obj.decoratorConfig as Record<string, unknown> | undefined;\n if (!config) continue;\n\n const api = config.api as\n | { include?: string[]; path?: string }\n | undefined;\n if (!api?.include || api.include.length === 0) continue;\n\n // Derive the URL path: explicit api.path, or table name with _ -> -\n const tableName = config.tableName as string | undefined;\n const path =\n api.path || (tableName ? tableName.replace(/_/g, '-') : null);\n if (!path) continue;\n\n routes.set(path, {\n className: obj.className,\n allowedActions: api.include,\n packageName,\n });\n }\n }\n\n return routes;\n}\n\n/**\n * Resolve a URL resource path against a route map.\n *\n * Handles three URL patterns:\n * - `performers` → list/create (no id)\n * - `performers/abc-123` → get/update/delete (with id)\n * - `performers/abc-123/generate-image` → custom action\n *\n * @param urlPath - The resource portion of the URL (after `/api/agents/{agentId}/`)\n * @param routes - Route map from {@link buildRouteMap}\n * @returns Resolved route with optional id/action, or null if no match\n */\nexport function resolveAPIRoute(\n urlPath: string,\n routes: Map<string, AgentAPIRouteInfo>,\n): ResolvedAPIRoute | null {\n // Normalize: strip leading/trailing slashes\n const normalized = urlPath.replace(/^\\/+|\\/+$/g, '');\n if (!normalized) return null;\n\n const segments = normalized.split('/');\n\n // Try 1-segment: \"performers\"\n if (segments.length === 1) {\n const route = routes.get(segments[0]);\n if (route) return { route };\n return null;\n }\n\n // Try 2-segment: \"performers/{id}\"\n if (segments.length === 2) {\n const route = routes.get(segments[0]);\n if (route) return { route, id: segments[1] };\n return null;\n }\n\n // Try 3-segment: \"performers/{id}/{action}\"\n if (segments.length === 3) {\n const route = routes.get(segments[0]);\n if (route) return { route, id: segments[1], action: segments[2] };\n return null;\n }\n\n return null;\n}\n","/**\n * Server-side agent config loading utilities\n *\n * Loads slot configurations from the agent_configs table for a set of agents.\n * Agent-specific table loading (e.g., praeco_sources) stays in the host app.\n *\n * @module @happyvertical/smrt-agents/server\n */\n\nimport type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { AgentConfig } from '../config.js';\n\n/**\n * Load slot configs for multiple agents from the agent_configs table.\n *\n * Returns a nested map: agentId -> slotId -> configData.\n * Agent-specific tables (e.g., praeco_sources, praeco_reports)\n * are NOT loaded here — those stay in the host application.\n *\n * @param agents - Array of agent identifiers (id + agentClass)\n * @param dbOptions - Database options for SmrtCollection.create()\n * @returns Map of agentId -> slotId -> config data\n */\nexport async function loadSlotConfigs(\n agents: Array<{ id: string; agentClass: string }>,\n dbOptions: SmrtClassOptions,\n): Promise<Record<string, Record<string, unknown>>> {\n if (agents.length === 0) {\n return {};\n }\n\n try {\n const configsByAgent = await AgentConfig.forAgents(\n agents.map((agent) => agent.id),\n dbOptions,\n );\n\n const configs: Record<string, Record<string, unknown>> = {};\n for (const [agentId, slotConfigs] of configsByAgent) {\n const agentConfig: Record<string, unknown> = {};\n for (const [slotId, configData] of slotConfigs) {\n agentConfig[slotId] = configData;\n }\n if (Object.keys(agentConfig).length > 0) {\n configs[agentId] = agentConfig;\n }\n }\n\n return configs;\n } catch (error) {\n if (isMissingAgentConfigTableError(error)) {\n return {};\n }\n throw error;\n }\n}\n\nfunction isMissingAgentConfigTableError(error: unknown): boolean {\n const message = String((error as Error)?.message || error || '');\n\n return (\n message.includes(\"Run 'smrt db:migrate'\") ||\n /no such table[:\\s]+agent_configs/i.test(message) ||\n /relation .*agent_configs.*does not exist/i.test(message) ||\n /table .*agent_configs.*doesn'?t exist/i.test(message)\n );\n}\n","/**\n * Serialization utilities for resolved agents\n *\n * Converts ResolvedAgentAvailability (database + manifest data) into\n * a JSON-safe shape suitable for passing to client components.\n *\n * @module @happyvertical/smrt-agents/server\n */\n\nimport { sanitizeConfig } from '@happyvertical/smrt-config';\nimport type { ResolvedAgentAvailability } from '../tenant-agent.js';\nimport type { AgentAdminRoute, AgentUISlots } from '../ui.js';\n\n/**\n * Serialized agent data for passing to client components.\n *\n * Includes manifest-derived fields (icon, permissions, slots)\n * alongside resolution metadata (source, sourceTenantId).\n */\nexport interface SerializedAgent {\n /** Agent instance ID, or a synthetic key if no instance exists */\n id: string;\n /** Human-readable name from manifest */\n name?: string;\n /** Human-readable agent class name (e.g., 'Praeco') */\n agentClass: string;\n /** Canonical agent type (qualified name when available) */\n agentType: string;\n /** STI type discriminator (same as agentType) */\n _meta_type?: string;\n /** UI slot definitions from manifest */\n slots?: AgentUISlots;\n /** Admin route declarations from manifest */\n adminRoutes?: AgentAdminRoute[];\n /** How this agent was resolved for the tenant */\n source?: 'explicit' | 'inherited';\n /** Which tenant the binding came from */\n sourceTenantId?: string;\n /** Merged permissions from manifest + tenant overrides */\n permissions?: Record<string, boolean>;\n /** Agent icon from manifest */\n icon?: string;\n /**\n * Tenant-level config overrides, **secret-sanitized** for client transport.\n *\n * SECURITY (#1553, follow-up to #1552): the raw `TenantAgent.config` is the\n * tenant's own override blob and is `@field({ sensitive: true })` (stripped\n * from the generated CRUD api/mcp surfaces). This hand-written admin\n * serialization runs it through `sanitizeConfig()` from\n * `@happyvertical/smrt-config` before it leaves the server, so secret-shaped\n * keys (apiKey/token/password/…) are dropped and secret-shaped values\n * (`sk-…`, `AKIA…`, `Bearer …`, URL credentials, PEM blocks) are masked —\n * non-secret config still reaches the authorized admin UI for display.\n *\n * This is **display-only**: do not edit-round-trip it back to the server\n * (a masked value would overwrite the real secret). Best practice remains to\n * reference secrets by id via `@happyvertical/smrt-secrets` so only an opaque\n * handle is ever stored in tenant config.\n */\n config?: Record<string, any>;\n}\n\n/**\n * Convert a ResolvedAgentAvailability to a serializable shape for the UI.\n *\n * @param resolved - Output from TenantAgentCollection.resolveForTenant()\n * @returns Serialized agent data safe for JSON transport\n */\nexport function serializeResolvedAgent(\n resolved: ResolvedAgentAvailability,\n): SerializedAgent {\n const manifest = resolved.manifest;\n\n return {\n id: resolved.agentId || `${resolved.sourceTenantId}:${resolved.agentType}`,\n name: manifest?.name || resolved.agentClass,\n agentClass: resolved.agentClass,\n agentType: resolved.agentType,\n _meta_type: resolved.agentType,\n slots: manifest?.uiSlots as AgentUISlots | undefined,\n adminRoutes: manifest?.adminRoutes as AgentAdminRoute[] | undefined,\n source: resolved.source,\n sourceTenantId: resolved.sourceTenantId,\n permissions: resolved.permissions,\n icon: manifest?.icon,\n // Secret-sanitize before the blob crosses into the client payload (#1553).\n config: sanitizeConfig(resolved.config) as SerializedAgent['config'],\n };\n}\n"],"names":[],"mappings":"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"}
|