@pylabmit/agent-cmdb 1.5.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/LICENSE +21 -0
- package/README.md +249 -0
- package/dist/agent-preflight.d.ts +6 -0
- package/dist/agent-preflight.d.ts.map +1 -0
- package/dist/agent-preflight.js +55 -0
- package/dist/agent-preflight.js.map +1 -0
- package/dist/brain.d.ts +12 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +372 -0
- package/dist/brain.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +495 -0
- package/dist/cli.js.map +1 -0
- package/dist/digest.d.ts +14 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +122 -0
- package/dist/digest.js.map +1 -0
- package/dist/doctor.d.ts +9 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +170 -0
- package/dist/doctor.js.map +1 -0
- package/dist/duration.d.ts +2 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +15 -0
- package/dist/duration.js.map +1 -0
- package/dist/engine.d.ts +12 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +12 -0
- package/dist/engine.js.map +1 -0
- package/dist/freshness.d.ts +3 -0
- package/dist/freshness.d.ts.map +1 -0
- package/dist/freshness.js +19 -0
- package/dist/freshness.js.map +1 -0
- package/dist/graph-engine.d.ts +4 -0
- package/dist/graph-engine.d.ts.map +1 -0
- package/dist/graph-engine.js +36 -0
- package/dist/graph-engine.js.map +1 -0
- package/dist/interface.d.ts +34 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +91 -0
- package/dist/interface.js.map +1 -0
- package/dist/loader.d.ts +9 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +199 -0
- package/dist/loader.js.map +1 -0
- package/dist/policy-engine.d.ts +7 -0
- package/dist/policy-engine.d.ts.map +1 -0
- package/dist/policy-engine.js +143 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/preflight-action.d.ts +3 -0
- package/dist/preflight-action.d.ts.map +1 -0
- package/dist/preflight-action.js +101 -0
- package/dist/preflight-action.js.map +1 -0
- package/dist/preflight.d.ts +4 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +36 -0
- package/dist/preflight.js.map +1 -0
- package/dist/route-resolver.d.ts +6 -0
- package/dist/route-resolver.d.ts.map +1 -0
- package/dist/route-resolver.js +130 -0
- package/dist/route-resolver.js.map +1 -0
- package/dist/store.d.ts +15 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +230 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +277 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +6 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +165 -0
- package/dist/validator.js.map +1 -0
- package/examples/basic/control-plane.yaml +122 -0
- package/examples/multi-agent/control-plane.yaml +352 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentCmdbReport, CmdbObject, ControlPlane, ObjectQuery, ValidationIssue } from './types.js';
|
|
2
|
+
export declare function listObjects(controlPlane: ControlPlane, query?: ObjectQuery): CmdbObject[];
|
|
3
|
+
export declare function getObject(controlPlane: ControlPlane, objectId: string): CmdbObject;
|
|
4
|
+
export declare function validateControlPlane(controlPlane: ControlPlane): ValidationIssue[];
|
|
5
|
+
export declare function generateReadinessReport(controlPlane: ControlPlane): AgentCmdbReport;
|
|
6
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,GAAE,WAAgB,GAAG,UAAU,EAAE,CAS7F;AAED,wBAAgB,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAOlF;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,YAAY,GAAG,eAAe,EAAE,CA6GlF;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,eAAe,CA6BnF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { ensureGraphNode } from './graph-engine.js';
|
|
2
|
+
import { policiesConflict, policyShadows } from './policy-engine.js';
|
|
3
|
+
import { parseDuration } from './duration.js';
|
|
4
|
+
export function listObjects(controlPlane, query = {}) {
|
|
5
|
+
return controlPlane.objects.filter((object) => {
|
|
6
|
+
if (query.profile && object.profile && object.profile !== query.profile)
|
|
7
|
+
return false;
|
|
8
|
+
if (query.profile && !object.profile && object.kind !== 'profile')
|
|
9
|
+
return false;
|
|
10
|
+
if (query.kind && object.kind !== query.kind)
|
|
11
|
+
return false;
|
|
12
|
+
if (query.status && object.status !== query.status)
|
|
13
|
+
return false;
|
|
14
|
+
if (query.tag && !object.tags.includes(query.tag))
|
|
15
|
+
return false;
|
|
16
|
+
return true;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function getObject(controlPlane, objectId) {
|
|
20
|
+
const normalizedObjectId = requireNonEmptyString(objectId, 'CMDB object id');
|
|
21
|
+
const object = controlPlane.objects.find((candidate) => candidate.id === normalizedObjectId);
|
|
22
|
+
if (!object) {
|
|
23
|
+
throw new Error(`Unknown CMDB object: ${normalizedObjectId}.`);
|
|
24
|
+
}
|
|
25
|
+
return object;
|
|
26
|
+
}
|
|
27
|
+
export function validateControlPlane(controlPlane) {
|
|
28
|
+
const issues = [];
|
|
29
|
+
const sourceIds = new Set(controlPlane.sources.map((source) => source.id));
|
|
30
|
+
const profileIds = new Set(controlPlane.profiles.map((profile) => profile.id));
|
|
31
|
+
const policyIds = new Set();
|
|
32
|
+
for (const profile of controlPlane.profiles) {
|
|
33
|
+
for (const route of profile.routes) {
|
|
34
|
+
for (const sourceId of route.sources) {
|
|
35
|
+
if (!sourceIds.has(sourceId)) {
|
|
36
|
+
issues.push({
|
|
37
|
+
severity: 'error',
|
|
38
|
+
code: 'route_unknown_source',
|
|
39
|
+
message: `Route ${profile.id}/${route.intent} references unknown source ${sourceId}.`
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const source of controlPlane.sources) {
|
|
46
|
+
if (source.freshnessTtl) {
|
|
47
|
+
try {
|
|
48
|
+
parseDuration(source.freshnessTtl);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
issues.push({
|
|
52
|
+
severity: 'error',
|
|
53
|
+
code: 'source_invalid_freshness_ttl',
|
|
54
|
+
message: `Source ${source.id} has invalid freshnessTtl ${source.freshnessTtl}: ${error instanceof Error ? error.message : String(error)}`
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const policy of controlPlane.policies) {
|
|
60
|
+
if (policyIds.has(policy.id)) {
|
|
61
|
+
issues.push({
|
|
62
|
+
severity: 'error',
|
|
63
|
+
code: 'duplicate_policy_id',
|
|
64
|
+
message: `Duplicate policy id ${policy.id}.`
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
policyIds.add(policy.id);
|
|
68
|
+
for (const profileId of policy.profiles ?? []) {
|
|
69
|
+
if (profileId !== '*' && !profileIds.has(profileId)) {
|
|
70
|
+
issues.push({
|
|
71
|
+
severity: 'error',
|
|
72
|
+
code: 'policy_unknown_profile',
|
|
73
|
+
message: `Policy ${policy.id} references unknown profile ${profileId}.`
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
for (const toolId of policy.tools ?? []) {
|
|
78
|
+
if (toolId !== '*' && !sourceIds.has(toolId)) {
|
|
79
|
+
issues.push({
|
|
80
|
+
severity: 'error',
|
|
81
|
+
code: 'policy_unknown_tool',
|
|
82
|
+
message: `Policy ${policy.id} references unknown tool ${toolId}.`
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (let index = 1; index < controlPlane.policies.length; index += 1) {
|
|
88
|
+
const policy = controlPlane.policies[index];
|
|
89
|
+
const shadowingPolicy = controlPlane.policies
|
|
90
|
+
.slice(0, index)
|
|
91
|
+
.find((candidate) => policyShadows(candidate, policy));
|
|
92
|
+
if (shadowingPolicy) {
|
|
93
|
+
issues.push({
|
|
94
|
+
severity: 'warning',
|
|
95
|
+
code: 'policy_shadowed',
|
|
96
|
+
message: `Policy ${policy.id} is shadowed by earlier policy ${shadowingPolicy.id}.`
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (let leftIndex = 0; leftIndex < controlPlane.policies.length; leftIndex += 1) {
|
|
101
|
+
for (let rightIndex = leftIndex + 1; rightIndex < controlPlane.policies.length; rightIndex += 1) {
|
|
102
|
+
const left = controlPlane.policies[leftIndex];
|
|
103
|
+
const right = controlPlane.policies[rightIndex];
|
|
104
|
+
if (policiesConflict(left, right)) {
|
|
105
|
+
issues.push({
|
|
106
|
+
severity: 'warning',
|
|
107
|
+
code: 'policy_conflict',
|
|
108
|
+
message: `Policy ${left.id} conflicts with policy ${right.id}; deny will win for overlapping requests.`
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const relationship of controlPlane.relationships) {
|
|
114
|
+
for (const endpoint of [relationship.from, relationship.to]) {
|
|
115
|
+
try {
|
|
116
|
+
ensureGraphNode(controlPlane, endpoint);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
issues.push({
|
|
120
|
+
severity: 'error',
|
|
121
|
+
code: 'relationship_unknown_node',
|
|
122
|
+
message: `Relationship ${relationship.from} -> ${relationship.to} references unknown node ${endpoint}.`
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return issues;
|
|
128
|
+
}
|
|
129
|
+
export function generateReadinessReport(controlPlane) {
|
|
130
|
+
const issues = validateControlPlane(controlPlane);
|
|
131
|
+
const deniedActions = unique(controlPlane.policies
|
|
132
|
+
.filter((policy) => policy.effect === 'deny')
|
|
133
|
+
.flatMap((policy) => policy.actions));
|
|
134
|
+
return {
|
|
135
|
+
version: controlPlane.version,
|
|
136
|
+
updatedAt: controlPlane.updatedAt,
|
|
137
|
+
counts: {
|
|
138
|
+
profiles: controlPlane.profiles.length,
|
|
139
|
+
sources: controlPlane.sources.length,
|
|
140
|
+
policies: controlPlane.policies.length,
|
|
141
|
+
objects: controlPlane.objects.length,
|
|
142
|
+
relationships: controlPlane.relationships.length
|
|
143
|
+
},
|
|
144
|
+
guardrails: {
|
|
145
|
+
deniedActions,
|
|
146
|
+
pausedObjects: controlPlane.objects.filter((object) => object.status === 'paused').map((object) => object.id),
|
|
147
|
+
blockedObjects: controlPlane.objects.filter((object) => object.status === 'blocked').map((object) => object.id)
|
|
148
|
+
},
|
|
149
|
+
validation: {
|
|
150
|
+
errors: issues.filter((issue) => issue.severity === 'error').length,
|
|
151
|
+
warnings: issues.filter((issue) => issue.severity === 'warning').length,
|
|
152
|
+
issues
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function unique(values) {
|
|
157
|
+
return [...new Set(values)];
|
|
158
|
+
}
|
|
159
|
+
function requireNonEmptyString(value, label) {
|
|
160
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
161
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
162
|
+
}
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
updatedAt: "2026-05-25"
|
|
3
|
+
|
|
4
|
+
sources:
|
|
5
|
+
- id: serpapi
|
|
6
|
+
label: SerpAPI Web Search
|
|
7
|
+
kind: tool
|
|
8
|
+
readOnly: true
|
|
9
|
+
|
|
10
|
+
- id: openai-api
|
|
11
|
+
label: OpenAI API
|
|
12
|
+
kind: tool
|
|
13
|
+
readOnly: false
|
|
14
|
+
|
|
15
|
+
- id: local-docs
|
|
16
|
+
label: Local Documentation
|
|
17
|
+
kind: wiki
|
|
18
|
+
readOnly: true
|
|
19
|
+
freshnessTtl: 7d
|
|
20
|
+
brainEntityId: agent-security
|
|
21
|
+
|
|
22
|
+
profiles:
|
|
23
|
+
- id: research-agent
|
|
24
|
+
name: Research Agent
|
|
25
|
+
purpose: Web research and summarization
|
|
26
|
+
guardrails:
|
|
27
|
+
- Do not make purchases or financial transactions
|
|
28
|
+
- Do not post to social media
|
|
29
|
+
- Prefer local documentation before external search
|
|
30
|
+
routes:
|
|
31
|
+
- intent: web_research
|
|
32
|
+
sources:
|
|
33
|
+
- local-docs
|
|
34
|
+
- serpapi
|
|
35
|
+
notes: Check local docs first, then search the web
|
|
36
|
+
- intent: code_generation
|
|
37
|
+
sources:
|
|
38
|
+
- local-docs
|
|
39
|
+
- openai-api
|
|
40
|
+
|
|
41
|
+
policies:
|
|
42
|
+
- id: deny-social-posting
|
|
43
|
+
effect: deny
|
|
44
|
+
actions:
|
|
45
|
+
- social_post
|
|
46
|
+
- social_reply
|
|
47
|
+
- social_dm
|
|
48
|
+
reason: Social media posting is disabled for all agents
|
|
49
|
+
code: social_actions_disabled
|
|
50
|
+
canEscalate: false
|
|
51
|
+
suggestedAlternative: Draft the post for a human to review.
|
|
52
|
+
|
|
53
|
+
- id: deny-financial
|
|
54
|
+
effect: deny
|
|
55
|
+
actions:
|
|
56
|
+
- purchase
|
|
57
|
+
- transfer
|
|
58
|
+
- payment
|
|
59
|
+
reason: Financial transactions require human approval
|
|
60
|
+
code: financial_actions_require_human
|
|
61
|
+
canEscalate: true
|
|
62
|
+
suggestedAlternative: Ask a human operator to approve or execute the transaction.
|
|
63
|
+
|
|
64
|
+
- id: allow-research
|
|
65
|
+
effect: allow
|
|
66
|
+
profiles:
|
|
67
|
+
- research-agent
|
|
68
|
+
actions:
|
|
69
|
+
- web_search
|
|
70
|
+
- summarize
|
|
71
|
+
- extract
|
|
72
|
+
tools:
|
|
73
|
+
- serpapi
|
|
74
|
+
- local-docs
|
|
75
|
+
reason: Research agent can search and summarize read-only sources
|
|
76
|
+
code: research_agent_readonly_allowed
|
|
77
|
+
canEscalate: false
|
|
78
|
+
|
|
79
|
+
objects:
|
|
80
|
+
- id: profile.research-agent
|
|
81
|
+
kind: profile
|
|
82
|
+
label: Research Agent
|
|
83
|
+
status: active
|
|
84
|
+
profile: research-agent
|
|
85
|
+
tags:
|
|
86
|
+
- agent
|
|
87
|
+
- research
|
|
88
|
+
|
|
89
|
+
- id: source.local-docs
|
|
90
|
+
kind: source
|
|
91
|
+
label: Local Documentation
|
|
92
|
+
status: active
|
|
93
|
+
profile: research-agent
|
|
94
|
+
tags:
|
|
95
|
+
- docs
|
|
96
|
+
- read-only
|
|
97
|
+
|
|
98
|
+
- id: source.serpapi
|
|
99
|
+
kind: source
|
|
100
|
+
label: SerpAPI Web Search
|
|
101
|
+
status: active
|
|
102
|
+
profile: research-agent
|
|
103
|
+
tags:
|
|
104
|
+
- web
|
|
105
|
+
- read-only
|
|
106
|
+
|
|
107
|
+
- id: tool.openai-api
|
|
108
|
+
kind: tool
|
|
109
|
+
label: OpenAI API
|
|
110
|
+
status: active
|
|
111
|
+
tags:
|
|
112
|
+
- llm
|
|
113
|
+
- generation
|
|
114
|
+
|
|
115
|
+
relationships:
|
|
116
|
+
- from: profile.research-agent
|
|
117
|
+
to: source.local-docs
|
|
118
|
+
type: uses
|
|
119
|
+
|
|
120
|
+
- from: profile.research-agent
|
|
121
|
+
to: source.serpapi
|
|
122
|
+
type: uses
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
version: "agent-cmdb-v2"
|
|
2
|
+
updatedAt: "2026-05-25"
|
|
3
|
+
|
|
4
|
+
sources:
|
|
5
|
+
- id: web-search-api
|
|
6
|
+
label: Web Search API
|
|
7
|
+
kind: oauth
|
|
8
|
+
readOnly: true
|
|
9
|
+
notes: Read-only external research source.
|
|
10
|
+
freshnessTtl: 2h
|
|
11
|
+
brainEntityId: web-research
|
|
12
|
+
|
|
13
|
+
- id: recent-history-cache
|
|
14
|
+
label: Recent History Cache
|
|
15
|
+
kind: memory
|
|
16
|
+
readOnly: true
|
|
17
|
+
notes: Local record of recent findings.
|
|
18
|
+
|
|
19
|
+
- id: news-aggregator
|
|
20
|
+
label: News Aggregator
|
|
21
|
+
kind: tool
|
|
22
|
+
readOnly: true
|
|
23
|
+
notes: Curated startup and technology news source.
|
|
24
|
+
|
|
25
|
+
- id: tech-forum
|
|
26
|
+
label: Technical Forum
|
|
27
|
+
kind: web
|
|
28
|
+
readOnly: true
|
|
29
|
+
notes: Community technology discussion source.
|
|
30
|
+
|
|
31
|
+
- id: vulnerability-scanner
|
|
32
|
+
label: Vulnerability Scanner
|
|
33
|
+
kind: tool
|
|
34
|
+
readOnly: true
|
|
35
|
+
notes: Public vulnerability and security advisory lookup.
|
|
36
|
+
|
|
37
|
+
- id: local-knowledge-base
|
|
38
|
+
label: Local Knowledge Base
|
|
39
|
+
kind: wiki
|
|
40
|
+
readOnly: true
|
|
41
|
+
notes: Human-maintained local project knowledge.
|
|
42
|
+
freshnessTtl: 7d
|
|
43
|
+
brainEntityId: local-knowledge
|
|
44
|
+
|
|
45
|
+
- id: weather-api
|
|
46
|
+
label: Weather API
|
|
47
|
+
kind: tool
|
|
48
|
+
readOnly: true
|
|
49
|
+
notes: Primary weather signal source.
|
|
50
|
+
|
|
51
|
+
- id: weather-backup
|
|
52
|
+
label: Weather Backup
|
|
53
|
+
kind: tool
|
|
54
|
+
readOnly: true
|
|
55
|
+
notes: Secondary weather signal source.
|
|
56
|
+
|
|
57
|
+
- id: video-summary-tool
|
|
58
|
+
label: Video Summary Tool
|
|
59
|
+
kind: tool
|
|
60
|
+
readOnly: true
|
|
61
|
+
notes: Read-only video summary source.
|
|
62
|
+
|
|
63
|
+
- id: podcast-summary-tool
|
|
64
|
+
label: Podcast Summary Tool
|
|
65
|
+
kind: tool
|
|
66
|
+
readOnly: true
|
|
67
|
+
notes: Read-only podcast summary source.
|
|
68
|
+
|
|
69
|
+
- id: social-media-tool
|
|
70
|
+
label: Social Media Tool
|
|
71
|
+
kind: tool
|
|
72
|
+
readOnly: false
|
|
73
|
+
notes: Account-mutation tool disabled by default policy.
|
|
74
|
+
|
|
75
|
+
profiles:
|
|
76
|
+
- id: research-agent
|
|
77
|
+
name: Research Agent
|
|
78
|
+
purpose: Read-only agent research, market scans, and security summaries.
|
|
79
|
+
guardrails:
|
|
80
|
+
- Use read-only sources for research.
|
|
81
|
+
- Do not mutate social accounts.
|
|
82
|
+
- Log policy denials and source decisions.
|
|
83
|
+
routes:
|
|
84
|
+
- intent: web_research
|
|
85
|
+
sources:
|
|
86
|
+
- web-search-api
|
|
87
|
+
- recent-history-cache
|
|
88
|
+
- news-aggregator
|
|
89
|
+
- tech-forum
|
|
90
|
+
notes: Prefer read-only research and recent local context.
|
|
91
|
+
- intent: security_research
|
|
92
|
+
sources:
|
|
93
|
+
- vulnerability-scanner
|
|
94
|
+
- web-search-api
|
|
95
|
+
- news-aggregator
|
|
96
|
+
- tech-forum
|
|
97
|
+
notes: Check vulnerability sources before broader web context.
|
|
98
|
+
|
|
99
|
+
- id: content-agent
|
|
100
|
+
name: Content Agent
|
|
101
|
+
purpose: Read-only content research with local knowledge as primary truth.
|
|
102
|
+
guardrails:
|
|
103
|
+
- Prefer local knowledge before external sources.
|
|
104
|
+
- Draft content only.
|
|
105
|
+
- Do not mutate social accounts.
|
|
106
|
+
routes:
|
|
107
|
+
- intent: weather
|
|
108
|
+
sources:
|
|
109
|
+
- local-knowledge-base
|
|
110
|
+
- weather-api
|
|
111
|
+
- weather-backup
|
|
112
|
+
notes: Start from local knowledge, then verify live weather.
|
|
113
|
+
- intent: content_research
|
|
114
|
+
sources:
|
|
115
|
+
- local-knowledge-base
|
|
116
|
+
- video-summary-tool
|
|
117
|
+
- podcast-summary-tool
|
|
118
|
+
notes: Use local knowledge before external media summaries.
|
|
119
|
+
|
|
120
|
+
- id: support-agent
|
|
121
|
+
name: Support Agent
|
|
122
|
+
purpose: Customer-support lookup and draft generation.
|
|
123
|
+
guardrails:
|
|
124
|
+
- Draft responses only.
|
|
125
|
+
- Do not send direct messages.
|
|
126
|
+
- Escalate unknown customer-impacting actions.
|
|
127
|
+
routes:
|
|
128
|
+
- intent: support_lookup
|
|
129
|
+
sources:
|
|
130
|
+
- local-knowledge-base
|
|
131
|
+
- recent-history-cache
|
|
132
|
+
|
|
133
|
+
policies:
|
|
134
|
+
- id: global-deny-social-media-tool-account-actions
|
|
135
|
+
effect: deny
|
|
136
|
+
actions:
|
|
137
|
+
- social_post
|
|
138
|
+
- social_reply
|
|
139
|
+
- social_like
|
|
140
|
+
- social_bookmark
|
|
141
|
+
- social_dm
|
|
142
|
+
- media_upload
|
|
143
|
+
tools:
|
|
144
|
+
- social-media-tool
|
|
145
|
+
reason: The social-media-tool source is disabled for account mutations.
|
|
146
|
+
code: social_media_tool_account_actions_disabled
|
|
147
|
+
canEscalate: false
|
|
148
|
+
suggestedAlternative: Use read-only research sources and prepare a draft for review.
|
|
149
|
+
|
|
150
|
+
- id: global-deny-social-account-actions
|
|
151
|
+
effect: deny
|
|
152
|
+
actions:
|
|
153
|
+
- social_post
|
|
154
|
+
- social_reply
|
|
155
|
+
- social_like
|
|
156
|
+
- social_bookmark
|
|
157
|
+
- social_dm
|
|
158
|
+
- media_upload
|
|
159
|
+
reason: Social account actions are disabled for this example control plane.
|
|
160
|
+
code: social_account_actions_disabled
|
|
161
|
+
canEscalate: false
|
|
162
|
+
suggestedAlternative: Draft the action for a human operator or use read-only research sources.
|
|
163
|
+
|
|
164
|
+
- id: global-deny-bot-ops-status
|
|
165
|
+
effect: deny
|
|
166
|
+
actions:
|
|
167
|
+
- send_bot_ops_status
|
|
168
|
+
reason: Internal bot operations status messages are disabled in user-facing channels.
|
|
169
|
+
code: bot_ops_status_disabled
|
|
170
|
+
canEscalate: false
|
|
171
|
+
suggestedAlternative: Write operational status to logs or an internal dashboard.
|
|
172
|
+
|
|
173
|
+
- id: research-allow-readonly-research
|
|
174
|
+
effect: allow
|
|
175
|
+
profiles:
|
|
176
|
+
- research-agent
|
|
177
|
+
actions:
|
|
178
|
+
- web_research
|
|
179
|
+
- summarize
|
|
180
|
+
- security_research
|
|
181
|
+
tools:
|
|
182
|
+
- web-search-api
|
|
183
|
+
- recent-history-cache
|
|
184
|
+
- news-aggregator
|
|
185
|
+
- tech-forum
|
|
186
|
+
- vulnerability-scanner
|
|
187
|
+
reason: Research agent can use read-only research sources.
|
|
188
|
+
code: research_readonly_allowed
|
|
189
|
+
canEscalate: false
|
|
190
|
+
|
|
191
|
+
- id: content-allow-readonly-research
|
|
192
|
+
effect: allow
|
|
193
|
+
profiles:
|
|
194
|
+
- content-agent
|
|
195
|
+
actions:
|
|
196
|
+
- weather_lookup
|
|
197
|
+
- content_research
|
|
198
|
+
- summarize
|
|
199
|
+
tools:
|
|
200
|
+
- local-knowledge-base
|
|
201
|
+
- weather-api
|
|
202
|
+
- weather-backup
|
|
203
|
+
- video-summary-tool
|
|
204
|
+
- podcast-summary-tool
|
|
205
|
+
reason: Content agent can use read-only knowledge and media sources.
|
|
206
|
+
code: content_readonly_allowed
|
|
207
|
+
canEscalate: false
|
|
208
|
+
|
|
209
|
+
- id: support-allow-lookup
|
|
210
|
+
effect: allow
|
|
211
|
+
profiles:
|
|
212
|
+
- support-agent
|
|
213
|
+
actions:
|
|
214
|
+
- support_lookup
|
|
215
|
+
- summarize
|
|
216
|
+
tools:
|
|
217
|
+
- local-knowledge-base
|
|
218
|
+
- recent-history-cache
|
|
219
|
+
reason: Support agent can look up local support context.
|
|
220
|
+
code: support_lookup_allowed
|
|
221
|
+
canEscalate: false
|
|
222
|
+
|
|
223
|
+
objects:
|
|
224
|
+
- id: profile.research-agent
|
|
225
|
+
kind: profile
|
|
226
|
+
label: Research Agent Profile
|
|
227
|
+
status: active
|
|
228
|
+
profile: research-agent
|
|
229
|
+
tags:
|
|
230
|
+
- agent
|
|
231
|
+
- research
|
|
232
|
+
|
|
233
|
+
- id: profile.content-agent
|
|
234
|
+
kind: profile
|
|
235
|
+
label: Content Agent Profile
|
|
236
|
+
status: active
|
|
237
|
+
profile: content-agent
|
|
238
|
+
tags:
|
|
239
|
+
- agent
|
|
240
|
+
- content
|
|
241
|
+
|
|
242
|
+
- id: profile.support-agent
|
|
243
|
+
kind: profile
|
|
244
|
+
label: Support Agent Profile
|
|
245
|
+
status: active
|
|
246
|
+
profile: support-agent
|
|
247
|
+
tags:
|
|
248
|
+
- agent
|
|
249
|
+
- support
|
|
250
|
+
|
|
251
|
+
- id: source.web-search-api
|
|
252
|
+
kind: source
|
|
253
|
+
label: Web Search API
|
|
254
|
+
status: active
|
|
255
|
+
profile: research-agent
|
|
256
|
+
tags:
|
|
257
|
+
- research
|
|
258
|
+
- read-only
|
|
259
|
+
|
|
260
|
+
- id: source.local-knowledge-base
|
|
261
|
+
kind: source
|
|
262
|
+
label: Local Knowledge Base
|
|
263
|
+
status: active
|
|
264
|
+
profile: content-agent
|
|
265
|
+
tags:
|
|
266
|
+
- knowledge
|
|
267
|
+
- read-only
|
|
268
|
+
|
|
269
|
+
- id: source.news-aggregator
|
|
270
|
+
kind: source
|
|
271
|
+
label: News Aggregator
|
|
272
|
+
status: active
|
|
273
|
+
profile: research-agent
|
|
274
|
+
tags:
|
|
275
|
+
- news
|
|
276
|
+
- read-only
|
|
277
|
+
|
|
278
|
+
- id: source.weather-api
|
|
279
|
+
kind: source
|
|
280
|
+
label: Weather API
|
|
281
|
+
status: active
|
|
282
|
+
profile: content-agent
|
|
283
|
+
tags:
|
|
284
|
+
- weather
|
|
285
|
+
- read-only
|
|
286
|
+
|
|
287
|
+
- id: tool.social-media-tool
|
|
288
|
+
kind: tool
|
|
289
|
+
label: Social Media Tool
|
|
290
|
+
status: blocked
|
|
291
|
+
tags:
|
|
292
|
+
- social
|
|
293
|
+
- mutation
|
|
294
|
+
|
|
295
|
+
- id: memory.local-brain
|
|
296
|
+
kind: memory
|
|
297
|
+
label: Local Brain
|
|
298
|
+
status: paused
|
|
299
|
+
tags:
|
|
300
|
+
- memory
|
|
301
|
+
- optional
|
|
302
|
+
notes: Optional local markdown memory is disabled until a brain directory is configured.
|
|
303
|
+
|
|
304
|
+
- id: job.research-radar
|
|
305
|
+
kind: job
|
|
306
|
+
label: Research Radar Job
|
|
307
|
+
status: active
|
|
308
|
+
profile: research-agent
|
|
309
|
+
tags:
|
|
310
|
+
- scheduled
|
|
311
|
+
- research
|
|
312
|
+
|
|
313
|
+
- id: job.content-brief
|
|
314
|
+
kind: job
|
|
315
|
+
label: Content Brief Job
|
|
316
|
+
status: active
|
|
317
|
+
profile: content-agent
|
|
318
|
+
tags:
|
|
319
|
+
- scheduled
|
|
320
|
+
- content
|
|
321
|
+
|
|
322
|
+
- id: policy.global-deny-social-media-tool-account-actions
|
|
323
|
+
kind: policy
|
|
324
|
+
label: Deny Social Media Tool Account Actions
|
|
325
|
+
status: active
|
|
326
|
+
tags:
|
|
327
|
+
- policy
|
|
328
|
+
- deny
|
|
329
|
+
|
|
330
|
+
relationships:
|
|
331
|
+
- from: profile.research-agent
|
|
332
|
+
to: source.web-search-api
|
|
333
|
+
type: uses
|
|
334
|
+
notes: Research agent uses read-only web search.
|
|
335
|
+
|
|
336
|
+
- from: profile.research-agent
|
|
337
|
+
to: job.research-radar
|
|
338
|
+
type: owns
|
|
339
|
+
|
|
340
|
+
- from: profile.content-agent
|
|
341
|
+
to: source.local-knowledge-base
|
|
342
|
+
type: uses
|
|
343
|
+
notes: Content agent starts from local knowledge.
|
|
344
|
+
|
|
345
|
+
- from: profile.content-agent
|
|
346
|
+
to: job.content-brief
|
|
347
|
+
type: owns
|
|
348
|
+
|
|
349
|
+
- from: tool.social-media-tool
|
|
350
|
+
to: policy.global-deny-social-media-tool-account-actions
|
|
351
|
+
type: governed_by
|
|
352
|
+
notes: Account mutation tool is blocked by policy.
|