@treenity/mods 3.0.3 → 3.0.5

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 (116) hide show
  1. package/dist/agent/client.d.ts +3 -0
  2. package/dist/agent/client.d.ts.map +1 -0
  3. package/dist/agent/client.js +3 -0
  4. package/dist/agent/client.js.map +1 -0
  5. package/dist/agent/guardian.d.ts +47 -0
  6. package/dist/agent/guardian.d.ts.map +1 -0
  7. package/dist/agent/guardian.js +452 -0
  8. package/dist/agent/guardian.js.map +1 -0
  9. package/dist/agent/seed.d.ts +2 -0
  10. package/dist/agent/seed.d.ts.map +1 -0
  11. package/dist/agent/seed.js +68 -0
  12. package/dist/agent/seed.js.map +1 -0
  13. package/dist/agent/server.d.ts +5 -0
  14. package/dist/agent/server.d.ts.map +1 -0
  15. package/dist/agent/server.js +5 -0
  16. package/dist/agent/server.js.map +1 -0
  17. package/dist/agent/service.d.ts +2 -0
  18. package/dist/agent/service.d.ts.map +1 -0
  19. package/dist/agent/service.js +556 -0
  20. package/dist/agent/service.js.map +1 -0
  21. package/dist/agent/types.d.ts +115 -0
  22. package/dist/agent/types.d.ts.map +1 -0
  23. package/dist/agent/types.js +168 -0
  24. package/dist/agent/types.js.map +1 -0
  25. package/dist/agent/view.d.ts +2 -0
  26. package/dist/agent/view.d.ts.map +1 -0
  27. package/dist/agent/view.js +137 -0
  28. package/dist/agent/view.js.map +1 -0
  29. package/dist/mcp/mcp-server.d.ts +16 -0
  30. package/dist/mcp/mcp-server.d.ts.map +1 -0
  31. package/dist/mcp/mcp-server.js +344 -0
  32. package/dist/mcp/mcp-server.js.map +1 -0
  33. package/dist/mcp/server.d.ts +3 -0
  34. package/dist/mcp/server.d.ts.map +1 -0
  35. package/dist/mcp/server.js +3 -0
  36. package/dist/mcp/server.js.map +1 -0
  37. package/dist/mcp/service.d.ts +2 -0
  38. package/dist/mcp/service.d.ts.map +1 -0
  39. package/dist/mcp/service.js +16 -0
  40. package/dist/mcp/service.js.map +1 -0
  41. package/dist/mcp/types.d.ts +4 -0
  42. package/dist/mcp/types.d.ts.map +1 -0
  43. package/dist/mcp/types.js +6 -0
  44. package/dist/mcp/types.js.map +1 -0
  45. package/dist/metatron/claude.d.ts +30 -0
  46. package/dist/metatron/claude.d.ts.map +1 -0
  47. package/dist/metatron/claude.js +201 -0
  48. package/dist/metatron/claude.js.map +1 -0
  49. package/dist/metatron/client.d.ts +3 -0
  50. package/dist/metatron/client.d.ts.map +1 -0
  51. package/dist/metatron/client.js +3 -0
  52. package/dist/metatron/client.js.map +1 -0
  53. package/dist/metatron/mentions.d.ts +9 -0
  54. package/dist/metatron/mentions.d.ts.map +1 -0
  55. package/dist/metatron/mentions.js +21 -0
  56. package/dist/metatron/mentions.js.map +1 -0
  57. package/dist/metatron/permissions.d.ts +16 -0
  58. package/dist/metatron/permissions.d.ts.map +1 -0
  59. package/dist/metatron/permissions.js +52 -0
  60. package/dist/metatron/permissions.js.map +1 -0
  61. package/dist/metatron/seed.d.ts +2 -0
  62. package/dist/metatron/seed.d.ts.map +1 -0
  63. package/dist/metatron/seed.js +41 -0
  64. package/dist/metatron/seed.js.map +1 -0
  65. package/dist/metatron/server.d.ts +4 -0
  66. package/dist/metatron/server.d.ts.map +1 -0
  67. package/dist/metatron/server.js +4 -0
  68. package/dist/metatron/server.js.map +1 -0
  69. package/dist/metatron/service.d.ts +2 -0
  70. package/dist/metatron/service.d.ts.map +1 -0
  71. package/dist/metatron/service.js +329 -0
  72. package/dist/metatron/service.js.map +1 -0
  73. package/dist/metatron/types.d.ts +76 -0
  74. package/dist/metatron/types.d.ts.map +1 -0
  75. package/dist/metatron/types.js +112 -0
  76. package/dist/metatron/types.js.map +1 -0
  77. package/dist/metatron/view.d.ts +4 -0
  78. package/dist/metatron/view.d.ts.map +1 -0
  79. package/dist/metatron/view.js +5 -0
  80. package/dist/metatron/view.js.map +1 -0
  81. package/dist/metatron/views/config.d.ts +2 -0
  82. package/dist/metatron/views/config.d.ts.map +1 -0
  83. package/dist/metatron/views/config.js +116 -0
  84. package/dist/metatron/views/config.js.map +1 -0
  85. package/dist/metatron/views/log.d.ts +18 -0
  86. package/dist/metatron/views/log.d.ts.map +1 -0
  87. package/dist/metatron/views/log.js +224 -0
  88. package/dist/metatron/views/log.js.map +1 -0
  89. package/dist/metatron/views/shared.d.ts +13 -0
  90. package/dist/metatron/views/shared.d.ts.map +1 -0
  91. package/dist/metatron/views/shared.js +33 -0
  92. package/dist/metatron/views/shared.js.map +1 -0
  93. package/dist/metatron/views/task.d.ts +4 -0
  94. package/dist/metatron/views/task.d.ts.map +1 -0
  95. package/dist/metatron/views/task.js +106 -0
  96. package/dist/metatron/views/task.js.map +1 -0
  97. package/dist/metatron/views/workspace.d.ts +2 -0
  98. package/dist/metatron/views/workspace.d.ts.map +1 -0
  99. package/dist/metatron/views/workspace.js +138 -0
  100. package/dist/metatron/views/workspace.js.map +1 -0
  101. package/metatron/CLAUDE.md +22 -0
  102. package/metatron/claude.ts +258 -0
  103. package/metatron/client.ts +2 -0
  104. package/metatron/mentions.ts +31 -0
  105. package/metatron/permissions.ts +76 -0
  106. package/metatron/seed.ts +50 -0
  107. package/metatron/server.ts +3 -0
  108. package/metatron/service.ts +368 -0
  109. package/metatron/types.ts +120 -0
  110. package/metatron/view.tsx +4 -0
  111. package/metatron/views/config.tsx +408 -0
  112. package/metatron/views/log.tsx +412 -0
  113. package/metatron/views/shared.tsx +40 -0
  114. package/metatron/views/task.tsx +255 -0
  115. package/metatron/views/workspace.tsx +418 -0
  116. package/package.json +6 -1
@@ -0,0 +1,3 @@
1
+ import './types';
2
+ import './view';
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../agent/client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import './types';
2
+ import './view';
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../agent/client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type PermissionRule } from '#metatron/permissions';
2
+ import type { PermissionResult } from '@anthropic-ai/claude-agent-sdk';
3
+ import type { Tree } from '@treenity/core/tree';
4
+ export declare class AiApproval {
5
+ agentPath: string;
6
+ agentRole: string;
7
+ tool: string;
8
+ /** @format textarea */
9
+ input: string;
10
+ status: 'pending' | 'approved' | 'denied';
11
+ reason: string;
12
+ createdAt: number;
13
+ resolvedAt: number;
14
+ /** @description Approve this tool usage */
15
+ approve(data?: {
16
+ /** Remember this decision for future calls */
17
+ remember?: 'agent' | 'global';
18
+ }): void;
19
+ /** @description Deny this tool usage */
20
+ deny(data?: {
21
+ /** Remember this decision for future calls */
22
+ remember?: 'agent' | 'global';
23
+ }): void;
24
+ }
25
+ export type ToolPolicy = {
26
+ allow: string[];
27
+ deny: string[];
28
+ escalate: string[];
29
+ };
30
+ /** Static fallback rules for SDK upfront hints. Real enforcement in canUseTool. */
31
+ export declare function buildPermissionRules(_role: string): PermissionRule[];
32
+ export declare function splitBashParts(cmd: string): string[];
33
+ export declare function requestApproval(store: Tree, opts: {
34
+ agentPath: string;
35
+ role: string;
36
+ tool: string;
37
+ input: string;
38
+ reason: string;
39
+ }): Promise<boolean>;
40
+ /** Result of reconciliation — agents that should be resumed */
41
+ export type ResumableAgent = {
42
+ agentPath: string;
43
+ taskPath: string;
44
+ };
45
+ export declare function reconcileOnStartup(store: Tree): Promise<ResumableAgent[]>;
46
+ export declare function createCanUseTool(role: string, agentPath: string, store?: Tree): (toolName: string, input: Record<string, unknown>) => Promise<PermissionResult>;
47
+ //# sourceMappingURL=guardian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian.d.ts","sourceRoot":"","sources":["../../agent/guardian.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,cAAc,EAAqB,MAAM,uBAAuB,CAAC;AAExH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIvE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAKhD,qBAAa,UAAU;IACrB,SAAS,SAAM;IACf,SAAS,SAAM;IACf,IAAI,SAAM;IACV,uBAAuB;IACvB,KAAK,SAAM;IACX,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAa;IACtD,MAAM,SAAM;IACZ,SAAS,SAAK;IACd,UAAU,SAAK;IAEf,2CAA2C;IAC3C,OAAO,CAAC,IAAI,CAAC,EAAE;QACb,8CAA8C;QAC9C,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;KAC9B;IAaD,wCAAwC;IACxC,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,8CAA8C;QAC9C,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;KAC9B;CAYF;AAMD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAyEF,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CASpE;AAeD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BpD;AAMD,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,EACX,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrF,OAAO,CAAC,OAAO,CAAC,CAsClB;AAwCD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA4E/E;AAID,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,IAAI,IASV,UAAU,MAAM,EAChB,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,gBAAgB,CAAC,CA+G7B"}
@@ -0,0 +1,452 @@
1
+ // Guardian — extensible tool policy for AI agents.
2
+ // Cascade: agent ai.policy → global ai.policy (/agents/guardian) → hardcoded fallback.
3
+ // Escalation: creates ai.approval node → Promise resolution via pendingPermissions.
4
+ import { pendingPermissions, resolvePermission } from '#metatron/permissions';
5
+ import { MetatronConfig } from '#metatron/types';
6
+ import { createNode, getComponent } from '@treenity/core';
7
+ import { registerType, setComponent } from '@treenity/core/comp';
8
+ import { matchesAny } from '@treenity/core/glob';
9
+ import { AiPolicy } from './types';
10
+ // ── Approval type — lives in /agents/approvals/{id} ──
11
+ export class AiApproval {
12
+ agentPath = '';
13
+ agentRole = '';
14
+ tool = '';
15
+ /** @format textarea */
16
+ input = '';
17
+ status = 'pending';
18
+ reason = '';
19
+ createdAt = 0;
20
+ resolvedAt = 0;
21
+ /** @description Approve this tool usage */
22
+ approve(data) {
23
+ if (this.status !== 'pending')
24
+ throw new Error('already resolved');
25
+ this.status = 'approved';
26
+ this.resolvedAt = Date.now();
27
+ const id = this.$path?.split('/').pop();
28
+ if (id)
29
+ resolvePermission(id, true, {
30
+ tool: this.tool,
31
+ input: this.input,
32
+ agentPath: this.agentPath,
33
+ scope: data?.remember,
34
+ });
35
+ }
36
+ /** @description Deny this tool usage */
37
+ deny(data) {
38
+ if (this.status !== 'pending')
39
+ throw new Error('already resolved');
40
+ this.status = 'denied';
41
+ this.resolvedAt = Date.now();
42
+ const id = this.$path?.split('/').pop();
43
+ if (id)
44
+ resolvePermission(id, false, {
45
+ tool: this.tool,
46
+ input: this.input,
47
+ agentPath: this.agentPath,
48
+ scope: data?.remember,
49
+ });
50
+ }
51
+ }
52
+ registerType('ai.approval', AiApproval);
53
+ // ── Minimal fallback — read-only, everything else escalated ──
54
+ const FALLBACK_POLICY = {
55
+ allow: [
56
+ 'mcp__treenity__get_node', 'mcp__treenity__list_children',
57
+ 'mcp__treenity__catalog', 'mcp__treenity__describe_type',
58
+ 'mcp__treenity__search_types',
59
+ ],
60
+ deny: [],
61
+ escalate: ['mcp__treenity__set_node', 'mcp__treenity__execute', 'mcp__treenity__remove_node'],
62
+ };
63
+ // ── Convert ai.policy node data → runtime ToolPolicy ──
64
+ function policyFromNode(p) {
65
+ return {
66
+ allow: [...p.allow],
67
+ deny: [...p.deny],
68
+ escalate: [...p.escalate],
69
+ };
70
+ }
71
+ /** Merge two policies: b overrides a (more specific wins) */
72
+ function mergePolicies(base, override) {
73
+ const allow = [...new Set([...base.allow, ...override.allow])];
74
+ const deny = [...new Set([...base.deny, ...override.deny])];
75
+ const escalate = [...new Set([...base.escalate, ...override.escalate])];
76
+ // Remove from escalate/deny if explicitly allowed in override
77
+ const cleanEscalate = escalate.filter(t => !override.allow.includes(t));
78
+ const cleanDeny = deny.filter(t => !override.allow.includes(t));
79
+ return {
80
+ allow,
81
+ deny: cleanDeny,
82
+ escalate: cleanEscalate,
83
+ };
84
+ }
85
+ const GUARDIAN_PATH = '/agents/guardian';
86
+ /** Resolve policy cascade: agent → global → fallback */
87
+ async function resolvePolicy(store, agentPath) {
88
+ const hardcoded = FALLBACK_POLICY;
89
+ // Global policy from /agents/guardian
90
+ let base = hardcoded;
91
+ try {
92
+ const guardianNode = await store.get(GUARDIAN_PATH);
93
+ if (guardianNode) {
94
+ const globalPolicy = getComponent(guardianNode, AiPolicy);
95
+ if (globalPolicy && (globalPolicy.allow.length || globalPolicy.deny.length || globalPolicy.escalate.length)) {
96
+ base = mergePolicies(hardcoded, policyFromNode(globalPolicy));
97
+ }
98
+ }
99
+ }
100
+ catch { /* no guardian node yet */ }
101
+ // Agent-level policy
102
+ try {
103
+ const agentNode = await store.get(agentPath);
104
+ if (agentNode) {
105
+ const agentPolicy = getComponent(agentNode, AiPolicy);
106
+ if (agentPolicy && (agentPolicy.allow.length || agentPolicy.deny.length || agentPolicy.escalate.length)) {
107
+ return mergePolicies(base, policyFromNode(agentPolicy));
108
+ }
109
+ }
110
+ }
111
+ catch { /* agent has no policy component */ }
112
+ return base;
113
+ }
114
+ // ── Build metatron-compatible PermissionRule[] ──
115
+ /** Static fallback rules for SDK upfront hints. Real enforcement in canUseTool. */
116
+ export function buildPermissionRules(_role) {
117
+ const policy = FALLBACK_POLICY;
118
+ const rules = [];
119
+ for (const tool of policy.deny)
120
+ rules.push({ tool, pathPattern: '', policy: 'deny' });
121
+ for (const tool of policy.escalate)
122
+ rules.push({ tool, pathPattern: '', policy: 'ask-once' });
123
+ for (const tool of policy.allow)
124
+ rules.push({ tool, pathPattern: '', policy: 'allow' });
125
+ return rules;
126
+ }
127
+ // ── Always-deny bash patterns ──
128
+ const DANGEROUS_BASH = [
129
+ /rm\s+-rf/, /push\s+--force/, /reset\s+--hard/, /--no-verify/,
130
+ /curl\b.*\|\s*(?:ba)?sh/, /wget\b.*\|\s*(?:ba)?sh/, // pipe-to-shell
131
+ /\beval\s+/, // arbitrary eval
132
+ /chmod\s+777/, /chmod\s+\+s/, // permission escalation
133
+ /\bdd\s+.*of=\/dev\//, /\bmkfs\b/, // disk destruction
134
+ ];
135
+ // ── Split bash command by operators, respecting quotes ──
136
+ export function splitBashParts(cmd) {
137
+ const parts = [];
138
+ let cur = '';
139
+ let inSingle = false;
140
+ let inDouble = false;
141
+ let escaped = false;
142
+ for (let i = 0; i < cmd.length; i++) {
143
+ const ch = cmd[i];
144
+ if (escaped) {
145
+ cur += ch;
146
+ escaped = false;
147
+ continue;
148
+ }
149
+ if (ch === '\\' && !inSingle) {
150
+ cur += ch;
151
+ escaped = true;
152
+ continue;
153
+ }
154
+ if (ch === "'" && !inDouble) {
155
+ cur += ch;
156
+ inSingle = !inSingle;
157
+ continue;
158
+ }
159
+ if (ch === '"' && !inSingle) {
160
+ cur += ch;
161
+ inDouble = !inDouble;
162
+ continue;
163
+ }
164
+ if (!inSingle && !inDouble) {
165
+ if (ch === '|' && cmd[i + 1] === '|') {
166
+ parts.push(cur);
167
+ cur = '';
168
+ i++;
169
+ continue;
170
+ }
171
+ if (ch === '|') {
172
+ parts.push(cur);
173
+ cur = '';
174
+ continue;
175
+ }
176
+ if (ch === '&' && cmd[i + 1] === '&') {
177
+ parts.push(cur);
178
+ cur = '';
179
+ i++;
180
+ continue;
181
+ }
182
+ if (ch === ';') {
183
+ parts.push(cur);
184
+ cur = '';
185
+ continue;
186
+ }
187
+ }
188
+ cur += ch;
189
+ }
190
+ if (cur)
191
+ parts.push(cur);
192
+ return parts.map(p => p.trim()).filter(Boolean);
193
+ }
194
+ // ── Escalation via tree nodes + Promise resolution ──
195
+ const APPROVAL_TIMEOUT = 60 * 60 * 1000; // 1 hour
196
+ export async function requestApproval(store, opts) {
197
+ const id = `a-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
198
+ const path = `/agents/approvals/${id}`;
199
+ await store.set(createNode(path, 'ai.approval', {
200
+ agentPath: opts.agentPath,
201
+ agentRole: opts.role,
202
+ tool: opts.tool,
203
+ input: opts.input.slice(0, 1000),
204
+ status: 'pending',
205
+ reason: opts.reason,
206
+ createdAt: Date.now(),
207
+ }));
208
+ console.log(`[guardian] escalation: ${opts.role} wants ${opts.tool} → ${path}`);
209
+ return new Promise((resolve) => {
210
+ const timer = setTimeout(() => {
211
+ pendingPermissions.delete(id);
212
+ console.log(`[guardian] escalation timed out: ${path}`);
213
+ resolve(false);
214
+ }, APPROVAL_TIMEOUT);
215
+ pendingPermissions.set(id, async (allow, meta) => {
216
+ clearTimeout(timer);
217
+ // "Remember" — persist rule to tree policy
218
+ if (meta?.scope && meta.tool) {
219
+ try {
220
+ await rememberRule(store, meta.tool, meta.input ?? '', allow, meta.agentPath ?? '', meta.scope);
221
+ }
222
+ catch (err) {
223
+ console.error(`[guardian] failed to persist rule: ${err}`);
224
+ }
225
+ }
226
+ resolve(allow);
227
+ });
228
+ });
229
+ }
230
+ /** Write a persistent rule to agent or global policy (with OCC retry) */
231
+ async function rememberRule(store, tool, _input, allow, agentPath, scope) {
232
+ const targetPath = scope === 'agent' ? agentPath : GUARDIAN_PATH;
233
+ const MAX_RETRIES = 3;
234
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
235
+ const node = await store.get(targetPath);
236
+ if (!node)
237
+ return;
238
+ const policy = getComponent(node, AiPolicy) ?? Object.assign(new AiPolicy(), { $type: 'ai.policy' });
239
+ if (allow) {
240
+ if (!policy.allow.includes(tool))
241
+ policy.allow.push(tool);
242
+ policy.deny = policy.deny.filter(d => d !== tool);
243
+ policy.escalate = policy.escalate.filter(e => e !== tool);
244
+ }
245
+ else {
246
+ if (!policy.deny.includes(tool))
247
+ policy.deny.push(tool);
248
+ policy.allow = policy.allow.filter(a => a !== tool);
249
+ policy.escalate = policy.escalate.filter(e => e !== tool);
250
+ }
251
+ setComponent(node, AiPolicy, policy);
252
+ try {
253
+ await store.set(node);
254
+ console.log(`[guardian] remembered: ${allow ? 'allow' : 'deny'} ${tool} → ${targetPath}`);
255
+ return;
256
+ }
257
+ catch (err) {
258
+ if (err instanceof Error && err.message.startsWith('OptimisticConcurrencyError') && attempt < MAX_RETRIES - 1) {
259
+ console.warn(`[guardian] OCC conflict on ${targetPath}, retry ${attempt + 1}`);
260
+ continue;
261
+ }
262
+ throw err;
263
+ }
264
+ }
265
+ }
266
+ export async function reconcileOnStartup(store) {
267
+ const resumable = [];
268
+ // Expire orphaned approvals
269
+ try {
270
+ const { items } = await store.getChildren('/agents/approvals');
271
+ for (const approval of items) {
272
+ if (approval.$type !== 'ai.approval' || approval.status !== 'pending')
273
+ continue;
274
+ await store.set({ ...approval, status: 'denied', reason: 'expired: server restart', resolvedAt: Date.now() });
275
+ console.log(`[guardian] expired orphaned approval: ${approval.$path}`);
276
+ }
277
+ }
278
+ catch { /* no approvals dir */ }
279
+ // Reconcile agents — resume those with sessionId, reset the rest
280
+ try {
281
+ const { items } = await store.getChildren('/agents');
282
+ const resumablePaths = [];
283
+ for (const node of items) {
284
+ if (node.$type !== 'ai.agent')
285
+ continue;
286
+ if (node.status !== 'working' && node.status !== 'blocked')
287
+ continue;
288
+ // Check if agent has a session to resume
289
+ const config = getComponent(node, MetatronConfig);
290
+ const hasSession = config && typeof config.sessionId === 'string' && config.sessionId.length > 0;
291
+ const taskPath = typeof node.currentTask === 'string' ? node.currentTask : '';
292
+ if (hasSession && taskPath) {
293
+ // Agent can resume — keep working status, collect for re-launch
294
+ resumable.push({ agentPath: node.$path, taskPath });
295
+ resumablePaths.push(node.$path);
296
+ console.log(`[guardian] resumable agent: ${node.$path} → ${taskPath} (session ${config.sessionId.slice(0, 8)}...)`);
297
+ }
298
+ else {
299
+ // No session — reset to idle
300
+ await store.set({ ...node, status: 'idle', currentTask: '', taskRef: '' });
301
+ console.log(`[guardian] reset stuck agent: ${node.$path}`);
302
+ // Reset stuck metatron.tasks under this agent
303
+ try {
304
+ const { items: tasks } = await store.getChildren(`${node.$path}/tasks`);
305
+ for (const task of tasks) {
306
+ if (task.$type !== 'metatron.task' || task.status !== 'running')
307
+ continue;
308
+ await store.set({ ...task, status: 'error', result: 'interrupted: server restart' });
309
+ console.log(`[guardian] reset stuck agent task: ${task.$path}`);
310
+ }
311
+ }
312
+ catch { /* no tasks dir yet */ }
313
+ }
314
+ }
315
+ // Update pool — keep resumable agents in active, clear the rest
316
+ const poolNode = await store.get('/agents');
317
+ if (poolNode && poolNode.$type === 'ai.pool') {
318
+ await store.set({ ...poolNode, active: resumablePaths, queue: [] });
319
+ if (resumablePaths.length) {
320
+ console.log(`[guardian] pool active: [${resumablePaths.join(', ')}]`);
321
+ }
322
+ else {
323
+ console.log(`[guardian] cleared pool active/queue`);
324
+ }
325
+ }
326
+ }
327
+ catch { /* */ }
328
+ // Reset stuck task aiStatus — but skip tasks being resumed
329
+ const resumedTaskPaths = new Set(resumable.map(r => r.taskPath));
330
+ try {
331
+ const { items } = await store.getChildren('/board/data');
332
+ for (const task of items) {
333
+ if (task.$type !== 'board.task')
334
+ continue;
335
+ if (resumedTaskPaths.has(task.$path))
336
+ continue;
337
+ if (typeof task.aiStatus === 'string' && task.aiStatus) {
338
+ await store.set({ ...task, aiStatus: '' });
339
+ console.log(`[guardian] cleared aiStatus on: ${task.$path}`);
340
+ }
341
+ }
342
+ }
343
+ catch { /* no board */ }
344
+ return resumable;
345
+ }
346
+ // ── canUseTool callback for Agent SDK ──
347
+ export function createCanUseTool(role, agentPath, store) {
348
+ const allow = () => ({ behavior: 'allow' });
349
+ const deny = (message) => ({ behavior: 'deny', message });
350
+ // Cache resolved policy (per agent run)
351
+ let cachedPolicy = null;
352
+ return async (toolName, input) => {
353
+ // Lazy-resolve policy from tree on first call
354
+ if (!cachedPolicy) {
355
+ cachedPolicy = store
356
+ ? await resolvePolicy(store, agentPath)
357
+ : FALLBACK_POLICY;
358
+ }
359
+ const policy = cachedPolicy;
360
+ // Deny-list check first (bare tool name)
361
+ if (matchesAny(policy.deny, toolName)) {
362
+ return deny(`${role}: denied: ${toolName}`);
363
+ }
364
+ // Bash → split by pipes/operators, check each sub-command independently
365
+ if (toolName === 'Bash') {
366
+ const cmd = typeof input.command === 'string' ? input.command.trim() : '';
367
+ // C14: normalize backslash escapes before safety check — prevents bypass via `git\ reset\ --hard`
368
+ const normalized = cmd.replace(/\\(.)/g, '$1');
369
+ // Hardcoded safety net — check full command (both raw and normalized)
370
+ for (const pattern of DANGEROUS_BASH) {
371
+ if (pattern.test(cmd) || pattern.test(normalized))
372
+ return deny(`blocked: ${cmd.slice(0, 60)}`);
373
+ }
374
+ // Split by newlines first, then by pipes/operators
375
+ const lines = cmd.split(/\n/).map(l => l.trim()).filter(Boolean);
376
+ // Check each line against safety net (belt-and-suspenders with full-string check above)
377
+ for (const line of lines) {
378
+ const normLine = line.replace(/\\(.)/g, '$1');
379
+ for (const pattern of DANGEROUS_BASH) {
380
+ if (pattern.test(line) || pattern.test(normLine))
381
+ return deny(`blocked: ${line.slice(0, 60)}`);
382
+ }
383
+ }
384
+ // Split into sub-commands and check each
385
+ const parts = lines.length > 0 ? lines.flatMap(l => splitBashParts(l)) : [];
386
+ const effectiveNames = parts.map(p => `Bash:${p}`);
387
+ // Any sub-command denied → deny entire command
388
+ for (const eName of effectiveNames) {
389
+ if (matchesAny(policy.deny, eName)) {
390
+ return deny(`${role}: denied: ${eName}`);
391
+ }
392
+ }
393
+ // Escalate BEFORE allow: explicit escalate beats wildcard allow
394
+ const escalated = effectiveNames.filter(e => matchesAny(policy.escalate, e));
395
+ if (escalated.length > 0) {
396
+ if (store) {
397
+ const approved = await requestApproval(store, {
398
+ agentPath, role, tool: escalated[0], input: cmd.slice(0, 200),
399
+ reason: 'requires approval',
400
+ });
401
+ return approved ? allow() : deny('denied by human');
402
+ }
403
+ return deny(`${role}: escalated but no store: ${escalated[0]}`);
404
+ }
405
+ // All sub-commands must be allowed — if any isn't, escalate as unknown
406
+ const notAllowed = effectiveNames.filter(e => !matchesAny(policy.allow, e));
407
+ if (notAllowed.length === 0 && effectiveNames.length > 0) {
408
+ return allow();
409
+ }
410
+ // Unknown sub-commands → escalate
411
+ const unknownName = notAllowed[0] ?? `Bash:${cmd}`;
412
+ if (store) {
413
+ const approved = await requestApproval(store, {
414
+ agentPath, role, tool: unknownName, input: cmd.slice(0, 200),
415
+ reason: 'unknown tool',
416
+ });
417
+ return approved ? allow() : deny('denied by human');
418
+ }
419
+ return deny(`${role}: not allowed: ${unknownName}`);
420
+ }
421
+ // Non-Bash tools — deny → escalate → allow → unknown
422
+ // Escalate BEFORE allow: explicit "requires approval" beats wildcard allow.
423
+ if (matchesAny(policy.deny, toolName)) {
424
+ return deny(`${role}: denied: ${toolName}`);
425
+ }
426
+ if (matchesAny(policy.escalate, toolName)) {
427
+ if (store) {
428
+ const inputStr = JSON.stringify(input).slice(0, 500);
429
+ const approved = await requestApproval(store, {
430
+ agentPath, role, tool: toolName, input: inputStr,
431
+ reason: 'requires approval',
432
+ });
433
+ return approved ? allow() : deny('denied by human');
434
+ }
435
+ return deny(`${role}: escalated but no store: ${toolName}`);
436
+ }
437
+ if (matchesAny(policy.allow, toolName)) {
438
+ return allow();
439
+ }
440
+ // Unknown tool — escalate to human
441
+ if (store) {
442
+ const inputStr = JSON.stringify(input).slice(0, 500);
443
+ const approved = await requestApproval(store, {
444
+ agentPath, role, tool: toolName, input: inputStr,
445
+ reason: 'unknown tool',
446
+ });
447
+ return approved ? allow() : deny('denied by human');
448
+ }
449
+ return deny(`${role}: not allowed: ${toolName}`);
450
+ };
451
+ }
452
+ //# sourceMappingURL=guardian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian.js","sourceRoot":"","sources":["../../agent/guardian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../agent/seed.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ // Agent Office seed — /agents pool + agents + guardian policies
2
+ import { registerPrefab } from '@treenity/core/mod';
3
+ registerPrefab('agent', 'seed', [
4
+ // Pool node — orchestrator service lives here
5
+ { $path: 'agents', $type: 'ai.pool',
6
+ maxConcurrent: 2, active: [], queue: [] },
7
+ // Guardian — global base policy (applies to ALL agents)
8
+ // Read-only by default. Destructive ops denied. Writes require approval.
9
+ { $path: 'agents/guardian', $type: 'dir',
10
+ policy: {
11
+ $type: 'ai.policy',
12
+ allow: [
13
+ 'mcp__treenity__get_node', 'mcp__treenity__list_children',
14
+ 'mcp__treenity__catalog', 'mcp__treenity__describe_type',
15
+ 'mcp__treenity__search_types', 'mcp__treenity__compile_view',
16
+ ],
17
+ deny: [
18
+ 'mcp__treenity__remove_node',
19
+ 'Bash:git checkout *', 'Bash:git checkout -- *',
20
+ 'Bash:git reset --hard*', 'Bash:git push --force*', 'Bash:git clean*',
21
+ 'Bash:rm -rf *', 'Bash:rm -r *', 'Bash:cat *.env*',
22
+ ],
23
+ escalate: [
24
+ 'mcp__treenity__set_node', 'mcp__treenity__execute', 'mcp__treenity__deploy_prefab',
25
+ 'Bash:git add *', 'Bash:git commit *', 'Bash:git push *',
26
+ 'Bash:sed *', 'Bash:mv *', 'Bash:cp *',
27
+ ],
28
+ },
29
+ },
30
+ // Approvals queue
31
+ { $path: 'agents/approvals', $type: 'ai.approvals' },
32
+ // ── QA agent (ECS: ai.agent + metatron.config) ──
33
+ { $path: 'agents/qa', $type: 'ai.agent',
34
+ role: 'qa',
35
+ status: 'idle',
36
+ currentTask: '',
37
+ taskRef: '',
38
+ lastRunAt: 0,
39
+ totalTokens: 0,
40
+ // LLM runtime config — metatron.config component (D29)
41
+ config: {
42
+ $type: 'metatron.config',
43
+ model: 'claude-opus-4-6',
44
+ systemPrompt: `You are a QA agent for the Treenity project.
45
+ Your job: run tests, check for errors, verify code quality.
46
+
47
+ ## QA Checklist
48
+ 1. Run \`npm test\` and report results (use Bash tool)
49
+ 2. Check for TypeScript errors
50
+ 3. Report any failing tests with details
51
+ 4. Summarize: PASS (all green) or FAIL (with specifics)
52
+
53
+ Be concise. Facts only.`,
54
+ sessionId: '',
55
+ },
56
+ // Agent-level policy: only ALLOW overrides (deny/escalate inherited from global guardian)
57
+ policy: {
58
+ $type: 'ai.policy',
59
+ allow: ['Bash:npm *', 'Bash:ls *', 'Bash:cat *', 'Bash:git status*', 'Bash:git diff*', 'Bash:git log*'],
60
+ deny: [],
61
+ escalate: [],
62
+ },
63
+ },
64
+ { $path: 'agents/qa/tasks', $type: 'dir' },
65
+ // Autostart — orchestrator starts on server boot
66
+ { $path: '/sys/autostart/agents', $type: 'ref', $ref: '/agents' },
67
+ ]);
68
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../agent/seed.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;IAC9B,8CAA8C;IAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS;QACjC,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAE3C,wDAAwD;IACxD,yEAAyE;IACzE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK;QACtC,MAAM,EAAE;YACN,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE;gBACL,yBAAyB,EAAE,8BAA8B;gBACzD,wBAAwB,EAAE,8BAA8B;gBACxD,6BAA6B,EAAE,6BAA6B;aAC7D;YACD,IAAI,EAAE;gBACJ,4BAA4B;gBAC5B,qBAAqB,EAAE,wBAAwB;gBAC/C,wBAAwB,EAAE,wBAAwB,EAAE,iBAAiB;gBACrE,eAAe,EAAE,cAAc,EAAE,iBAAiB;aACnD;YACD,QAAQ,EAAE;gBACR,yBAAyB,EAAE,wBAAwB,EAAE,8BAA8B;gBACnF,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB;gBACxD,YAAY,EAAE,WAAW,EAAE,WAAW;aACvC;SACF;KACF;IAED,kBAAkB;IAClB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE;IAEpD,mDAAmD;IACnD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU;QACrC,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,uDAAuD;QACvD,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE;;;;;;;;;wBASI;YAClB,SAAS,EAAE,EAAE;SACd;QACD,0FAA0F;QAC1F,MAAM,EAAE;YACN,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,CAAC;YACvG,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE;SACb;KACF;IACD,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE;IAE1C,iDAAiD;IACjD,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;CACpD,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import './types';
2
+ import './guardian';
3
+ import './service';
4
+ import './seed';
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../agent/server.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,YAAY,CAAC;AACpB,OAAO,WAAW,CAAC;AACnB,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import './types';
2
+ import './guardian';
3
+ import './service';
4
+ import './seed';
5
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../agent/server.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,YAAY,CAAC;AACpB,OAAO,WAAW,CAAC;AACnB,OAAO,QAAQ,CAAC"}