@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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/agent-preflight.d.ts +6 -0
  4. package/dist/agent-preflight.d.ts.map +1 -0
  5. package/dist/agent-preflight.js +55 -0
  6. package/dist/agent-preflight.js.map +1 -0
  7. package/dist/brain.d.ts +12 -0
  8. package/dist/brain.d.ts.map +1 -0
  9. package/dist/brain.js +372 -0
  10. package/dist/brain.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +495 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/digest.d.ts +14 -0
  16. package/dist/digest.d.ts.map +1 -0
  17. package/dist/digest.js +122 -0
  18. package/dist/digest.js.map +1 -0
  19. package/dist/doctor.d.ts +9 -0
  20. package/dist/doctor.d.ts.map +1 -0
  21. package/dist/doctor.js +170 -0
  22. package/dist/doctor.js.map +1 -0
  23. package/dist/duration.d.ts +2 -0
  24. package/dist/duration.d.ts.map +1 -0
  25. package/dist/duration.js +15 -0
  26. package/dist/duration.js.map +1 -0
  27. package/dist/engine.d.ts +12 -0
  28. package/dist/engine.d.ts.map +1 -0
  29. package/dist/engine.js +12 -0
  30. package/dist/engine.js.map +1 -0
  31. package/dist/freshness.d.ts +3 -0
  32. package/dist/freshness.d.ts.map +1 -0
  33. package/dist/freshness.js +19 -0
  34. package/dist/freshness.js.map +1 -0
  35. package/dist/graph-engine.d.ts +4 -0
  36. package/dist/graph-engine.d.ts.map +1 -0
  37. package/dist/graph-engine.js +36 -0
  38. package/dist/graph-engine.js.map +1 -0
  39. package/dist/interface.d.ts +34 -0
  40. package/dist/interface.d.ts.map +1 -0
  41. package/dist/interface.js +91 -0
  42. package/dist/interface.js.map +1 -0
  43. package/dist/loader.d.ts +9 -0
  44. package/dist/loader.d.ts.map +1 -0
  45. package/dist/loader.js +199 -0
  46. package/dist/loader.js.map +1 -0
  47. package/dist/policy-engine.d.ts +7 -0
  48. package/dist/policy-engine.d.ts.map +1 -0
  49. package/dist/policy-engine.js +143 -0
  50. package/dist/policy-engine.js.map +1 -0
  51. package/dist/preflight-action.d.ts +3 -0
  52. package/dist/preflight-action.d.ts.map +1 -0
  53. package/dist/preflight-action.js +101 -0
  54. package/dist/preflight-action.js.map +1 -0
  55. package/dist/preflight.d.ts +4 -0
  56. package/dist/preflight.d.ts.map +1 -0
  57. package/dist/preflight.js +36 -0
  58. package/dist/preflight.js.map +1 -0
  59. package/dist/route-resolver.d.ts +6 -0
  60. package/dist/route-resolver.d.ts.map +1 -0
  61. package/dist/route-resolver.js +130 -0
  62. package/dist/route-resolver.js.map +1 -0
  63. package/dist/store.d.ts +15 -0
  64. package/dist/store.d.ts.map +1 -0
  65. package/dist/store.js +230 -0
  66. package/dist/store.js.map +1 -0
  67. package/dist/types.d.ts +277 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/validator.d.ts +6 -0
  72. package/dist/validator.d.ts.map +1 -0
  73. package/dist/validator.js +165 -0
  74. package/dist/validator.js.map +1 -0
  75. package/examples/basic/control-plane.yaml +122 -0
  76. package/examples/multi-agent/control-plane.yaml +352 -0
  77. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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.