agentcorp-broker 0.1.0-alpha.1
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/CHANGELOG.md +52 -0
- package/CONTRIBUTING.md +20 -0
- package/LICENSE +201 -0
- package/README.md +250 -0
- package/SECURITY.md +23 -0
- package/dist/audit.d.ts +25 -0
- package/dist/audit.js +203 -0
- package/dist/audit.js.map +1 -0
- package/dist/broker.d.ts +103 -0
- package/dist/broker.js +805 -0
- package/dist/broker.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +712 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/console/console.css +794 -0
- package/dist/console/console.js +802 -0
- package/dist/console/index.html +309 -0
- package/dist/credentials.d.ts +16 -0
- package/dist/credentials.js +72 -0
- package/dist/credentials.js.map +1 -0
- package/dist/database.d.ts +119 -0
- package/dist/database.js +1356 -0
- package/dist/database.js.map +1 -0
- package/dist/diagnostics.d.ts +44 -0
- package/dist/diagnostics.js +357 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.js +215 -0
- package/dist/mcp.js.map +1 -0
- package/dist/migrations.d.ts +13 -0
- package/dist/migrations.js +266 -0
- package/dist/migrations.js.map +1 -0
- package/dist/policy.d.ts +22 -0
- package/dist/policy.js +33 -0
- package/dist/policy.js.map +1 -0
- package/dist/server.d.ts +49 -0
- package/dist/server.js +529 -0
- package/dist/server.js.map +1 -0
- package/dist/stdio-adapter.d.ts +230 -0
- package/dist/stdio-adapter.js +406 -0
- package/dist/stdio-adapter.js.map +1 -0
- package/dist/tui.d.ts +26 -0
- package/dist/tui.js +291 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +355 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +119 -0
- package/docs/README.md +37 -0
- package/docs/RELEASING.md +228 -0
- package/docs/ROADMAP.md +112 -0
- package/docs/cli-reference.md +133 -0
- package/docs/dogfooding-report.md +83 -0
- package/docs/getting-started.md +228 -0
- package/docs/guides/antigravity-setup.md +84 -0
- package/docs/guides/claude-cursor-setup.md +76 -0
- package/docs/guides/codex-setup.md +75 -0
- package/docs/guides/human-console.md +177 -0
- package/docs/mcp-tools-reference.md +235 -0
- package/docs/policy-guide.md +105 -0
- package/examples/org.toml +65 -0
- package/package.json +68 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
|
+
import * as z from "zod/v4";
|
|
3
|
+
import { AgentCorpError } from "./errors.js";
|
|
4
|
+
import { MessageTypeSchema, TaskStatusSchema } from "./types.js";
|
|
5
|
+
function result(value) {
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function failure(error) {
|
|
11
|
+
const known = error instanceof AgentCorpError;
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
return {
|
|
14
|
+
isError: true,
|
|
15
|
+
content: [{
|
|
16
|
+
type: "text",
|
|
17
|
+
text: JSON.stringify({ error: known ? error.code : "INTERNAL_ERROR", message }),
|
|
18
|
+
}],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function guarded(operation) {
|
|
22
|
+
try {
|
|
23
|
+
return result(operation());
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return failure(error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function createMcpServer(broker, callerRole, agentId) {
|
|
30
|
+
const role = broker.getRole(callerRole);
|
|
31
|
+
const maxPageSize = broker.database.maxPageSize;
|
|
32
|
+
const server = new McpServer({ name: "agentcorp", version: "0.1.0" });
|
|
33
|
+
server.registerTool("register_role", {
|
|
34
|
+
title: "Register this agent connection",
|
|
35
|
+
description: "Bind this role-scoped MCP connection to an agent instance. Capabilities may only be reduced, never escalated.",
|
|
36
|
+
inputSchema: z.object({
|
|
37
|
+
capabilities: z.array(z.string()).optional(),
|
|
38
|
+
}),
|
|
39
|
+
}, ({ capabilities }) => guarded(() => broker.registerRole(callerRole, agentId, capabilities ?? role.capabilities)));
|
|
40
|
+
server.registerTool("whoami", {
|
|
41
|
+
title: "Inspect the bound AgentCorp role",
|
|
42
|
+
description: "Return the immutable role identity and permissions for this MCP connection.",
|
|
43
|
+
inputSchema: z.object({}),
|
|
44
|
+
}, () => guarded(() => {
|
|
45
|
+
broker.touchPresence(callerRole);
|
|
46
|
+
return { role, agentId, company: broker.config.company.name };
|
|
47
|
+
}));
|
|
48
|
+
server.registerTool("create_task", {
|
|
49
|
+
title: "Create a coordinated task",
|
|
50
|
+
description: "Create a task, optionally assigning it to an allowed peer role.",
|
|
51
|
+
inputSchema: z.object({
|
|
52
|
+
title: z.string().min(1),
|
|
53
|
+
description: z.string().optional(),
|
|
54
|
+
assigned_to: z.string().optional(),
|
|
55
|
+
idempotency_key: z.string().optional(),
|
|
56
|
+
}),
|
|
57
|
+
}, (input) => guarded(() => broker.createTask(callerRole, {
|
|
58
|
+
title: input.title,
|
|
59
|
+
...(input.description === undefined ? {} : { description: input.description }),
|
|
60
|
+
...(input.assigned_to === undefined ? {} : { assignedTo: input.assigned_to }),
|
|
61
|
+
...(input.idempotency_key === undefined ? {} : { idempotencyKey: input.idempotency_key }),
|
|
62
|
+
})));
|
|
63
|
+
server.registerTool("list_tasks", {
|
|
64
|
+
title: "List visible tasks",
|
|
65
|
+
description: "List tasks in which the bound role participates.",
|
|
66
|
+
inputSchema: z.object({
|
|
67
|
+
limit: z.number().int().positive().max(maxPageSize).optional(),
|
|
68
|
+
cursor: z.string().optional(),
|
|
69
|
+
envelope: z.boolean().optional(),
|
|
70
|
+
}),
|
|
71
|
+
}, (input) => guarded(() => {
|
|
72
|
+
if (input?.envelope)
|
|
73
|
+
return broker.listTasksPaginated(callerRole, input);
|
|
74
|
+
return broker.listTasks(callerRole, input);
|
|
75
|
+
}));
|
|
76
|
+
server.registerTool("get_work_queue", {
|
|
77
|
+
title: "Get the role's prioritized work queue",
|
|
78
|
+
description: "Return unread messages, active tasks, and ordered next actions in one call. Use this at session start and after every handoff or status change.",
|
|
79
|
+
inputSchema: z.object({}),
|
|
80
|
+
}, () => guarded(() => broker.getWorkQueue(callerRole)));
|
|
81
|
+
server.registerTool("send_message", {
|
|
82
|
+
title: "Send a typed agent message",
|
|
83
|
+
description: "Submit a typed message through route validation and the approval policy engine.",
|
|
84
|
+
inputSchema: z.object({
|
|
85
|
+
to_role: z.string().min(1),
|
|
86
|
+
type: MessageTypeSchema,
|
|
87
|
+
payload: z.unknown(),
|
|
88
|
+
task_id: z.string().optional(),
|
|
89
|
+
references: z.array(z.string()).default([]),
|
|
90
|
+
risk_tags: z.array(z.string()).default([]),
|
|
91
|
+
in_reply_to: z.string().optional(),
|
|
92
|
+
idempotency_key: z.string().optional(),
|
|
93
|
+
}),
|
|
94
|
+
}, (input) => guarded(() => broker.sendMessage(callerRole, {
|
|
95
|
+
toRole: input.to_role,
|
|
96
|
+
type: input.type,
|
|
97
|
+
payload: input.payload,
|
|
98
|
+
references: input.references,
|
|
99
|
+
riskTags: input.risk_tags,
|
|
100
|
+
...(input.task_id === undefined ? {} : { taskId: input.task_id }),
|
|
101
|
+
...(input.in_reply_to === undefined ? {} : { inReplyTo: input.in_reply_to }),
|
|
102
|
+
...(input.idempotency_key === undefined ? {} : { idempotencyKey: input.idempotency_key }),
|
|
103
|
+
})));
|
|
104
|
+
server.registerTool("get_inbox", {
|
|
105
|
+
title: "Read delivered messages",
|
|
106
|
+
description: "Return only approved or delivered messages addressed to the bound role.",
|
|
107
|
+
inputSchema: z.object({
|
|
108
|
+
limit: z.number().int().positive().max(maxPageSize).optional(),
|
|
109
|
+
cursor: z.string().optional(),
|
|
110
|
+
envelope: z.boolean().optional(),
|
|
111
|
+
}),
|
|
112
|
+
}, (input) => guarded(() => {
|
|
113
|
+
if (input?.envelope)
|
|
114
|
+
return broker.getInboxPaginated(callerRole, input);
|
|
115
|
+
return broker.getInbox(callerRole, input);
|
|
116
|
+
}));
|
|
117
|
+
server.registerTool("acknowledge_message", {
|
|
118
|
+
title: "Acknowledge a message",
|
|
119
|
+
description: "Mark a delivered message as acknowledged by its recipient.",
|
|
120
|
+
inputSchema: z.object({ message_id: z.string().min(1) }),
|
|
121
|
+
}, ({ message_id }) => guarded(() => broker.acknowledgeMessage(callerRole, message_id)));
|
|
122
|
+
server.registerTool("accept_handoff", {
|
|
123
|
+
title: "Accept an approved task handoff",
|
|
124
|
+
description: "Idempotently acknowledge a delivered proposal and start its assigned task. If starting work is policy-gated, one task approval is requested and retries do not duplicate it.",
|
|
125
|
+
inputSchema: z.object({
|
|
126
|
+
message_id: z.string().min(1),
|
|
127
|
+
idempotency_key: z.string().optional(),
|
|
128
|
+
}),
|
|
129
|
+
}, ({ message_id, idempotency_key }) => guarded(() => broker.acceptHandoff(callerRole, message_id, idempotency_key)));
|
|
130
|
+
server.registerTool("get_thread", {
|
|
131
|
+
title: "Read a task thread",
|
|
132
|
+
description: "Return the task message history visible to the bound role.",
|
|
133
|
+
inputSchema: z.object({
|
|
134
|
+
task_id: z.string().min(1),
|
|
135
|
+
limit: z.number().int().positive().max(maxPageSize).optional(),
|
|
136
|
+
cursor: z.string().optional(),
|
|
137
|
+
envelope: z.boolean().optional(),
|
|
138
|
+
}),
|
|
139
|
+
}, (input) => guarded(() => {
|
|
140
|
+
if (input.envelope)
|
|
141
|
+
return broker.getThreadPaginated(callerRole, input.task_id, input);
|
|
142
|
+
return broker.getThread(callerRole, input.task_id, input);
|
|
143
|
+
}));
|
|
144
|
+
server.registerTool("create_artifact", {
|
|
145
|
+
title: "Create an access-controlled artifact",
|
|
146
|
+
description: "Store content or a content URI with role-scoped visibility.",
|
|
147
|
+
inputSchema: z.object({
|
|
148
|
+
type: z.string().min(1),
|
|
149
|
+
name: z.string().min(1),
|
|
150
|
+
content: z.string().optional(),
|
|
151
|
+
content_uri: z.string().optional(),
|
|
152
|
+
visible_to_roles: z.union([z.literal("all"), z.array(z.string())]).optional(),
|
|
153
|
+
related_task_id: z.string().optional(),
|
|
154
|
+
idempotency_key: z.string().optional(),
|
|
155
|
+
}),
|
|
156
|
+
}, (input) => guarded(() => broker.createArtifact(callerRole, {
|
|
157
|
+
type: input.type,
|
|
158
|
+
name: input.name,
|
|
159
|
+
...(input.content === undefined ? {} : { content: input.content }),
|
|
160
|
+
...(input.content_uri === undefined ? {} : { contentUri: input.content_uri }),
|
|
161
|
+
...(input.visible_to_roles === undefined ? {} : { visibleToRoles: input.visible_to_roles }),
|
|
162
|
+
...(input.related_task_id === undefined ? {} : { relatedTaskId: input.related_task_id }),
|
|
163
|
+
...(input.idempotency_key === undefined ? {} : { idempotencyKey: input.idempotency_key }),
|
|
164
|
+
})));
|
|
165
|
+
server.registerTool("list_artifacts", {
|
|
166
|
+
title: "List visible artifacts",
|
|
167
|
+
description: "List artifact metadata after applying the bound role's visibility rules.",
|
|
168
|
+
inputSchema: z.object({
|
|
169
|
+
task_id: z.string().optional(),
|
|
170
|
+
limit: z.number().int().positive().max(maxPageSize).optional(),
|
|
171
|
+
cursor: z.string().optional(),
|
|
172
|
+
envelope: z.boolean().optional(),
|
|
173
|
+
}),
|
|
174
|
+
}, (input) => guarded(() => {
|
|
175
|
+
if (input?.envelope)
|
|
176
|
+
return broker.listArtifactsPaginated(callerRole, input?.task_id, input);
|
|
177
|
+
return broker.listArtifacts(callerRole, input?.task_id, input);
|
|
178
|
+
}));
|
|
179
|
+
server.registerTool("get_artifact", {
|
|
180
|
+
title: "Read a visible artifact",
|
|
181
|
+
description: "Retrieve artifact content after a server-side role visibility check.",
|
|
182
|
+
inputSchema: z.object({ artifact_id: z.string().min(1) }),
|
|
183
|
+
}, ({ artifact_id }) => guarded(() => broker.getArtifact(callerRole, artifact_id)));
|
|
184
|
+
server.registerTool("update_task_status", {
|
|
185
|
+
title: "Request a task state transition",
|
|
186
|
+
description: "Validate a lifecycle transition and route it through the approval policy engine.",
|
|
187
|
+
inputSchema: z.object({
|
|
188
|
+
task_id: z.string().min(1),
|
|
189
|
+
new_status: TaskStatusSchema.optional(),
|
|
190
|
+
status: TaskStatusSchema.optional(),
|
|
191
|
+
risk_tags: z.array(z.string()).default([]),
|
|
192
|
+
idempotency_key: z.string().optional(),
|
|
193
|
+
}).refine((data) => Boolean(data.new_status || data.status), {
|
|
194
|
+
message: "Provide new_status or status",
|
|
195
|
+
}),
|
|
196
|
+
}, (input) => guarded(() => {
|
|
197
|
+
const targetStatus = (input.new_status ?? input.status);
|
|
198
|
+
return broker.updateTaskStatus(callerRole, input.task_id, targetStatus, input.risk_tags, input.idempotency_key);
|
|
199
|
+
}));
|
|
200
|
+
server.registerTool("get_operation", {
|
|
201
|
+
title: "Get operation by idempotency key",
|
|
202
|
+
description: "Lookup a previously executed idempotent operation result by its idempotency key.",
|
|
203
|
+
inputSchema: z.object({
|
|
204
|
+
idempotency_key: z.string().min(1),
|
|
205
|
+
}),
|
|
206
|
+
}, ({ idempotency_key }) => guarded(() => {
|
|
207
|
+
const record = broker.getOperation(callerRole, idempotency_key);
|
|
208
|
+
if (!record) {
|
|
209
|
+
return { found: false, message: `Operation for key '${idempotency_key}' not found.` };
|
|
210
|
+
}
|
|
211
|
+
return { found: true, operation: record };
|
|
212
|
+
}));
|
|
213
|
+
return server;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface Migration {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
up: (db: DatabaseSync) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const MIGRATIONS: Migration[];
|
|
8
|
+
export declare function ensureMigrationTable(db: DatabaseSync): void;
|
|
9
|
+
export declare function getCurrentSchemaVersion(db: DatabaseSync): number;
|
|
10
|
+
export declare function runMigrations(db: DatabaseSync): {
|
|
11
|
+
applied: number[];
|
|
12
|
+
currentVersion: number;
|
|
13
|
+
};
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { AgentCorpError } from "./errors.js";
|
|
2
|
+
export const MIGRATIONS = [
|
|
3
|
+
{
|
|
4
|
+
version: 1,
|
|
5
|
+
name: "initial_schema",
|
|
6
|
+
up: (db) => {
|
|
7
|
+
db.exec(`
|
|
8
|
+
CREATE TABLE IF NOT EXISTS role_bindings (
|
|
9
|
+
role_id TEXT PRIMARY KEY,
|
|
10
|
+
agent_id TEXT NOT NULL,
|
|
11
|
+
capabilities TEXT NOT NULL,
|
|
12
|
+
connected_at TEXT NOT NULL
|
|
13
|
+
) STRICT;
|
|
14
|
+
|
|
15
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
16
|
+
task_id TEXT PRIMARY KEY,
|
|
17
|
+
title TEXT NOT NULL,
|
|
18
|
+
description TEXT,
|
|
19
|
+
created_by TEXT NOT NULL,
|
|
20
|
+
assigned_to TEXT,
|
|
21
|
+
status TEXT NOT NULL,
|
|
22
|
+
created_at TEXT NOT NULL,
|
|
23
|
+
updated_at TEXT NOT NULL
|
|
24
|
+
) STRICT;
|
|
25
|
+
|
|
26
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
27
|
+
message_id TEXT PRIMARY KEY,
|
|
28
|
+
task_id TEXT REFERENCES tasks(task_id),
|
|
29
|
+
from_role TEXT NOT NULL,
|
|
30
|
+
to_role TEXT NOT NULL,
|
|
31
|
+
type TEXT NOT NULL,
|
|
32
|
+
payload TEXT NOT NULL,
|
|
33
|
+
references_json TEXT NOT NULL,
|
|
34
|
+
in_reply_to TEXT REFERENCES messages(message_id),
|
|
35
|
+
status TEXT NOT NULL,
|
|
36
|
+
risk_tags TEXT NOT NULL,
|
|
37
|
+
created_at TEXT NOT NULL,
|
|
38
|
+
resolved_at TEXT
|
|
39
|
+
) STRICT;
|
|
40
|
+
|
|
41
|
+
CREATE TABLE IF NOT EXISTS message_events (
|
|
42
|
+
event_id TEXT PRIMARY KEY,
|
|
43
|
+
message_id TEXT NOT NULL REFERENCES messages(message_id),
|
|
44
|
+
status TEXT NOT NULL,
|
|
45
|
+
actor TEXT NOT NULL,
|
|
46
|
+
note TEXT,
|
|
47
|
+
created_at TEXT NOT NULL
|
|
48
|
+
) STRICT;
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
51
|
+
artifact_id TEXT PRIMARY KEY,
|
|
52
|
+
type TEXT NOT NULL,
|
|
53
|
+
name TEXT NOT NULL,
|
|
54
|
+
produced_by TEXT NOT NULL,
|
|
55
|
+
content TEXT,
|
|
56
|
+
content_uri TEXT,
|
|
57
|
+
content_hash TEXT NOT NULL,
|
|
58
|
+
visible_to_roles TEXT NOT NULL,
|
|
59
|
+
related_task_id TEXT REFERENCES tasks(task_id),
|
|
60
|
+
created_at TEXT NOT NULL
|
|
61
|
+
) STRICT;
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS policies (
|
|
64
|
+
policy_id TEXT PRIMARY KEY,
|
|
65
|
+
subject TEXT NOT NULL,
|
|
66
|
+
priority INTEGER NOT NULL,
|
|
67
|
+
from_role TEXT,
|
|
68
|
+
to_role TEXT,
|
|
69
|
+
message_type TEXT,
|
|
70
|
+
risk_tags TEXT,
|
|
71
|
+
from_status TEXT,
|
|
72
|
+
to_status TEXT,
|
|
73
|
+
action TEXT NOT NULL,
|
|
74
|
+
delegate_role TEXT,
|
|
75
|
+
enabled INTEGER NOT NULL,
|
|
76
|
+
created_at TEXT NOT NULL,
|
|
77
|
+
updated_at TEXT NOT NULL
|
|
78
|
+
) STRICT;
|
|
79
|
+
|
|
80
|
+
CREATE TABLE IF NOT EXISTS approvals (
|
|
81
|
+
approval_id TEXT PRIMARY KEY,
|
|
82
|
+
subject TEXT NOT NULL,
|
|
83
|
+
subject_id TEXT NOT NULL,
|
|
84
|
+
requested_by TEXT NOT NULL,
|
|
85
|
+
status TEXT NOT NULL,
|
|
86
|
+
context TEXT NOT NULL,
|
|
87
|
+
created_at TEXT NOT NULL,
|
|
88
|
+
decided_at TEXT,
|
|
89
|
+
decision_note TEXT,
|
|
90
|
+
edited_payload TEXT
|
|
91
|
+
) STRICT;
|
|
92
|
+
|
|
93
|
+
CREATE TABLE IF NOT EXISTS task_transitions (
|
|
94
|
+
transition_id TEXT PRIMARY KEY,
|
|
95
|
+
task_id TEXT NOT NULL REFERENCES tasks(task_id),
|
|
96
|
+
from_status TEXT NOT NULL,
|
|
97
|
+
to_status TEXT NOT NULL,
|
|
98
|
+
requested_by TEXT NOT NULL,
|
|
99
|
+
status TEXT NOT NULL,
|
|
100
|
+
created_at TEXT NOT NULL,
|
|
101
|
+
resolved_at TEXT
|
|
102
|
+
) STRICT;
|
|
103
|
+
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_messages_inbox ON messages(to_role, status, created_at);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_messages_task ON messages(task_id, created_at);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_task ON artifacts(related_task_id, created_at);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status, created_at);
|
|
108
|
+
`);
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
version: 2,
|
|
113
|
+
name: "tighten_default_policies",
|
|
114
|
+
up: (db) => {
|
|
115
|
+
const legacy = db.prepare("SELECT * FROM policies WHERE policy_id = 'allow-read-only-messages' AND message_type IS NULL").get();
|
|
116
|
+
if (legacy) {
|
|
117
|
+
db.prepare("DELETE FROM policies WHERE policy_id = 'allow-read-only-messages' AND message_type IS NULL").run();
|
|
118
|
+
const now = new Date().toISOString();
|
|
119
|
+
const insert = db.prepare(`
|
|
120
|
+
INSERT OR IGNORE INTO policies (policy_id, subject, priority, message_type, risk_tags, action, enabled, created_at, updated_at)
|
|
121
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
122
|
+
`);
|
|
123
|
+
insert.run("gate-critical-proposals", "message", 200, "proposal", null, "require_human", 1, now, now);
|
|
124
|
+
insert.run("allow-read-only-status-updates", "message", 100, "status_update", JSON.stringify(["read_only"]), "auto_approve", 1, now, now);
|
|
125
|
+
insert.run("allow-read-only-reports", "message", 100, "report", JSON.stringify(["read_only"]), "auto_approve", 1, now, now);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
version: 3,
|
|
131
|
+
name: "add_pagination_indexes",
|
|
132
|
+
up: (db) => {
|
|
133
|
+
db.exec(`
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_updated_at ON tasks(updated_at, task_id);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks(created_at, task_id);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at, message_id);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at, artifact_id);
|
|
138
|
+
`);
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
version: 4,
|
|
143
|
+
name: "add_maintenance_log",
|
|
144
|
+
up: (db) => {
|
|
145
|
+
db.exec(`
|
|
146
|
+
CREATE TABLE IF NOT EXISTS maintenance_log (
|
|
147
|
+
id TEXT PRIMARY KEY,
|
|
148
|
+
action TEXT NOT NULL,
|
|
149
|
+
details_json TEXT NOT NULL,
|
|
150
|
+
created_at TEXT NOT NULL
|
|
151
|
+
) STRICT;
|
|
152
|
+
CREATE INDEX IF NOT EXISTS idx_maintenance_log_created_at ON maintenance_log(created_at, id);
|
|
153
|
+
`);
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
version: 5,
|
|
158
|
+
name: "add_submission_auto_approve_policy",
|
|
159
|
+
up: (db) => {
|
|
160
|
+
const now = new Date().toISOString();
|
|
161
|
+
db.prepare(`
|
|
162
|
+
INSERT OR IGNORE INTO policies (
|
|
163
|
+
policy_id, subject, priority, from_status, to_status, action, enabled, created_at, updated_at
|
|
164
|
+
) VALUES (
|
|
165
|
+
'auto-approve-review-submission', 'task', 150, 'in_progress', 'awaiting_review', 'auto_approve', 1, ?, ?
|
|
166
|
+
)
|
|
167
|
+
`).run(now, now);
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
version: 6,
|
|
172
|
+
name: "add_idempotency_and_presence",
|
|
173
|
+
up: (db) => {
|
|
174
|
+
db.exec(`
|
|
175
|
+
CREATE TABLE IF NOT EXISTS idempotency_keys (
|
|
176
|
+
key TEXT PRIMARY KEY,
|
|
177
|
+
role_id TEXT NOT NULL,
|
|
178
|
+
operation TEXT NOT NULL,
|
|
179
|
+
request_hash TEXT,
|
|
180
|
+
response_json TEXT NOT NULL,
|
|
181
|
+
created_at TEXT NOT NULL
|
|
182
|
+
) STRICT;
|
|
183
|
+
|
|
184
|
+
CREATE INDEX IF NOT EXISTS idx_idempotency_role ON idempotency_keys(role_id, created_at);
|
|
185
|
+
`);
|
|
186
|
+
const cols = db.prepare("PRAGMA table_info(role_bindings)").all();
|
|
187
|
+
const hasLastSeen = cols.some((col) => col.name === "last_seen_at");
|
|
188
|
+
if (!hasLastSeen) {
|
|
189
|
+
db.exec("ALTER TABLE role_bindings ADD COLUMN last_seen_at TEXT");
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
version: 7,
|
|
195
|
+
name: "fix_idempotency_composite_key",
|
|
196
|
+
up: (db) => {
|
|
197
|
+
db.exec(`
|
|
198
|
+
CREATE TABLE IF NOT EXISTS idempotency_keys_new (
|
|
199
|
+
role_id TEXT NOT NULL,
|
|
200
|
+
key TEXT NOT NULL,
|
|
201
|
+
operation TEXT NOT NULL,
|
|
202
|
+
request_hash TEXT,
|
|
203
|
+
response_json TEXT NOT NULL,
|
|
204
|
+
created_at TEXT NOT NULL,
|
|
205
|
+
PRIMARY KEY (role_id, key)
|
|
206
|
+
) STRICT;
|
|
207
|
+
|
|
208
|
+
INSERT OR IGNORE INTO idempotency_keys_new (role_id, key, operation, request_hash, response_json, created_at)
|
|
209
|
+
SELECT role_id, key, operation, request_hash, response_json, created_at FROM idempotency_keys;
|
|
210
|
+
|
|
211
|
+
DROP TABLE idempotency_keys;
|
|
212
|
+
|
|
213
|
+
ALTER TABLE idempotency_keys_new RENAME TO idempotency_keys;
|
|
214
|
+
|
|
215
|
+
CREATE INDEX IF NOT EXISTS idx_idempotency_role ON idempotency_keys(role_id, created_at);
|
|
216
|
+
`);
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
];
|
|
220
|
+
export function ensureMigrationTable(db) {
|
|
221
|
+
db.exec(`
|
|
222
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
223
|
+
version INTEGER PRIMARY KEY,
|
|
224
|
+
name TEXT NOT NULL DEFAULT 'legacy',
|
|
225
|
+
applied_at TEXT NOT NULL
|
|
226
|
+
) STRICT;
|
|
227
|
+
`);
|
|
228
|
+
// Handle legacy v0.1 databases where schema_migrations was created without the 'name' column
|
|
229
|
+
const cols = db.prepare("PRAGMA table_info(schema_migrations)").all();
|
|
230
|
+
const hasName = cols.some((col) => col.name === "name");
|
|
231
|
+
if (!hasName) {
|
|
232
|
+
db.exec("ALTER TABLE schema_migrations ADD COLUMN name TEXT NOT NULL DEFAULT 'legacy'");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export function getCurrentSchemaVersion(db) {
|
|
236
|
+
ensureMigrationTable(db);
|
|
237
|
+
const row = db.prepare("SELECT MAX(version) AS max_version FROM schema_migrations").get();
|
|
238
|
+
return row?.max_version ?? 0;
|
|
239
|
+
}
|
|
240
|
+
export function runMigrations(db) {
|
|
241
|
+
ensureMigrationTable(db);
|
|
242
|
+
const current = getCurrentSchemaVersion(db);
|
|
243
|
+
const maxAvailable = MIGRATIONS.length > 0 ? Math.max(...MIGRATIONS.map((m) => m.version)) : 0;
|
|
244
|
+
if (current > maxAvailable) {
|
|
245
|
+
throw new AgentCorpError("UNSUPPORTED_SCHEMA_VERSION", `Database schema version ${current} is higher than maximum supported version ${maxAvailable}`);
|
|
246
|
+
}
|
|
247
|
+
const applied = [];
|
|
248
|
+
for (const migration of MIGRATIONS) {
|
|
249
|
+
if (migration.version > current) {
|
|
250
|
+
db.exec("BEGIN IMMEDIATE");
|
|
251
|
+
try {
|
|
252
|
+
migration.up(db);
|
|
253
|
+
db.prepare("INSERT INTO schema_migrations (version, name, applied_at) VALUES (?, ?, ?)")
|
|
254
|
+
.run(migration.version, migration.name, new Date().toISOString());
|
|
255
|
+
db.exec("COMMIT");
|
|
256
|
+
applied.push(migration.version);
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
db.exec("ROLLBACK");
|
|
260
|
+
throw err;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return { applied, currentVersion: getCurrentSchemaVersion(db) };
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/policy.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MessageType, PolicyAction, PolicyRule, TaskStatus } from "./types.js";
|
|
2
|
+
export interface MessagePolicyContext {
|
|
3
|
+
subject: "message";
|
|
4
|
+
fromRole: string;
|
|
5
|
+
toRole: string;
|
|
6
|
+
messageType: MessageType;
|
|
7
|
+
riskTags: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface TaskPolicyContext {
|
|
10
|
+
subject: "task";
|
|
11
|
+
fromRole: string;
|
|
12
|
+
toRole?: string;
|
|
13
|
+
fromStatus: TaskStatus;
|
|
14
|
+
toStatus: TaskStatus;
|
|
15
|
+
riskTags: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface PolicyDecision {
|
|
18
|
+
action: PolicyAction;
|
|
19
|
+
matchedRuleId: string | null;
|
|
20
|
+
delegateRole?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function evaluatePolicy(rules: PolicyRule[], context: MessagePolicyContext | TaskPolicyContext): PolicyDecision;
|
package/dist/policy.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function evaluatePolicy(rules, context) {
|
|
2
|
+
for (const rule of rules) {
|
|
3
|
+
if (!rule.enabled || rule.subject !== context.subject)
|
|
4
|
+
continue;
|
|
5
|
+
if (rule.from_role && rule.from_role !== context.fromRole)
|
|
6
|
+
continue;
|
|
7
|
+
if (rule.to_role && rule.to_role !== context.toRole)
|
|
8
|
+
continue;
|
|
9
|
+
if (rule.risk_tags?.some((tag) => !context.riskTags.includes(tag)))
|
|
10
|
+
continue;
|
|
11
|
+
if (context.subject === "message") {
|
|
12
|
+
if (rule.message_type && rule.message_type !== context.messageType)
|
|
13
|
+
continue;
|
|
14
|
+
if (rule.from_status || rule.to_status)
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
if (rule.from_status && rule.from_status !== context.fromStatus)
|
|
19
|
+
continue;
|
|
20
|
+
if (rule.to_status && rule.to_status !== context.toStatus)
|
|
21
|
+
continue;
|
|
22
|
+
if (rule.message_type)
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
action: rule.action,
|
|
27
|
+
matchedRuleId: rule.id,
|
|
28
|
+
...(rule.delegate_role ? { delegateRole: rule.delegate_role } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return { action: "require_human", matchedRuleId: null };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,OAAiD;IAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;YAAE,SAAS;QAChE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,QAAQ;YAAE,SAAS;QACpE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM;YAAE,SAAS;QAC9D,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QAE7E,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,WAAW;gBAAE,SAAS;YAC7E,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS;gBAAE,SAAS;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,UAAU;gBAAE,SAAS;YAC1E,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,QAAQ;gBAAE,SAAS;YACpE,IAAI,IAAI,CAAC,YAAY;gBAAE,SAAS;QAClC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,EAAE;YACtB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC1D,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AgentCorpBroker } from "./broker.js";
|
|
2
|
+
import { type CredentialsFile } from "./credentials.js";
|
|
3
|
+
import { AgentCorpDatabase } from "./database.js";
|
|
4
|
+
import type { OrgConfig } from "./types.js";
|
|
5
|
+
export interface DaemonInfo {
|
|
6
|
+
pid: number;
|
|
7
|
+
port: number;
|
|
8
|
+
host: string;
|
|
9
|
+
url: string;
|
|
10
|
+
startedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_MAX_BODY_SIZE_BYTES: number;
|
|
13
|
+
export interface ServerOptions {
|
|
14
|
+
port?: number;
|
|
15
|
+
host?: string;
|
|
16
|
+
daemonFilePath?: string;
|
|
17
|
+
auditOnShutdown?: boolean;
|
|
18
|
+
maxBodySizeBytes?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function readDaemonInfo(filePath?: string): DaemonInfo | null;
|
|
21
|
+
export declare class AgentCorpServer {
|
|
22
|
+
readonly broker: AgentCorpBroker;
|
|
23
|
+
readonly database: AgentCorpDatabase;
|
|
24
|
+
readonly config: OrgConfig;
|
|
25
|
+
readonly credentials: CredentialsFile;
|
|
26
|
+
readonly daemonFilePath: string | null;
|
|
27
|
+
readonly maxBodySizeBytes: number;
|
|
28
|
+
private server;
|
|
29
|
+
private readonly roleHandlers;
|
|
30
|
+
private readonly sseClients;
|
|
31
|
+
private readonly eventListener;
|
|
32
|
+
private sseHeartbeatInterval;
|
|
33
|
+
private port;
|
|
34
|
+
private host;
|
|
35
|
+
private startedAt;
|
|
36
|
+
private auditOnShutdown;
|
|
37
|
+
constructor(broker: AgentCorpBroker, credentials?: CredentialsFile, options?: ServerOptions);
|
|
38
|
+
private broadcastSse;
|
|
39
|
+
getPort(): number;
|
|
40
|
+
getUrl(): string;
|
|
41
|
+
start(): Promise<DaemonInfo>;
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
private getRoleHandler;
|
|
44
|
+
private handleHttpRequest;
|
|
45
|
+
private handleAdminApi;
|
|
46
|
+
private extractToken;
|
|
47
|
+
private readJsonBody;
|
|
48
|
+
private sendJson;
|
|
49
|
+
}
|