ferrycat 0.0.0-stage → 0.3.2
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 +209 -2
- package/README_zh.md +212 -0
- package/bin/ferrycat-cli.js +36 -0
- package/bin/ferrycat.js +36 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1015 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine.d.ts +107 -0
- package/dist/engine.js +849 -0
- package/dist/engine.js.map +1 -0
- package/dist/fingerprint.d.ts +31 -0
- package/dist/fingerprint.js +205 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +305 -0
- package/dist/index.js.map +1 -0
- package/dist/schema-validator.d.ts +5 -0
- package/dist/schema-validator.js +49 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/schemas.d.ts +274 -0
- package/dist/schemas.js +338 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/glama.json +6 -0
- package/package.json +58 -4
- package/server.json +21 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FileFingerprint, FilePointerInput } from './types.js';
|
|
2
|
+
export declare class SecurityPolicyError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function assertSafePointerPath(workspaceRoot: string, rawPath: string): string;
|
|
6
|
+
export declare function computeFullFileSha256(buffer: Buffer): string;
|
|
7
|
+
export declare function computeFingerprints(workspaceRoot: string, pointers: FilePointerInput[], nowMs?: number): {
|
|
8
|
+
fingerprints: FileFingerprint[];
|
|
9
|
+
recentlyModified: boolean;
|
|
10
|
+
};
|
|
11
|
+
export interface FingerprintVerificationResult {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
reason?: 'FILE_MISSING' | 'SIZE_MISMATCH' | 'CONTENT_CHANGED' | 'SECURITY_REJECTED';
|
|
14
|
+
detail?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PointerDriftItem {
|
|
17
|
+
path: string;
|
|
18
|
+
reason: 'FILE_MISSING' | 'SIZE_MISMATCH' | 'CONTENT_CHANGED' | 'SECURITY_REJECTED';
|
|
19
|
+
detail: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function verifyAllPointers(workspaceRoot: string, fingerprints: FileFingerprint[]): {
|
|
22
|
+
valid: boolean;
|
|
23
|
+
firstFailure?: FingerprintVerificationResult;
|
|
24
|
+
dirtyFiles: PointerDriftItem[];
|
|
25
|
+
};
|
|
26
|
+
export declare function verifySingleRun(workspaceRoot: string, fingerprints: FileFingerprint[]): FingerprintVerificationResult;
|
|
27
|
+
/**
|
|
28
|
+
* Verifies all file fingerprints. If a content/size mismatch is detected on the first read,
|
|
29
|
+
* waits `retryDelayMs` (default 150ms) and re-checks once to rule out transient IDE buffer flushes.
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyFingerprintsWithRetry(workspaceRoot: string, fingerprints: FileFingerprint[], retryDelayMs?: number): FingerprintVerificationResult;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const SENSITIVE_PATTERNS = [
|
|
5
|
+
/(^|[\\/])\.env(\..+)?$/i,
|
|
6
|
+
/\.(pem|key|p12|pfx)$/i,
|
|
7
|
+
/(^|[\\/])id_(rsa|dsa|ecdsa|ed25519)(\.pub)?$/i,
|
|
8
|
+
/credentials/i,
|
|
9
|
+
/secret/i,
|
|
10
|
+
/(^|[\\/])\.(npmrc|pypirc|netrc)$/i,
|
|
11
|
+
/(^|[\\/])\.git[\\/]config$/i,
|
|
12
|
+
];
|
|
13
|
+
export class SecurityPolicyError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'SecurityPolicyError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function assertSafePointerPath(workspaceRoot, rawPath) {
|
|
20
|
+
const normalizedRaw = rawPath.replace(/\\/g, '/');
|
|
21
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
22
|
+
if (pattern.test(normalizedRaw) || pattern.test(path.basename(normalizedRaw))) {
|
|
23
|
+
throw new SecurityPolicyError(`Pointer rejected by security blacklist: "${rawPath}" matches sensitive file pattern.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const resolvedRoot = path.resolve(workspaceRoot);
|
|
27
|
+
const resolvedTarget = path.resolve(resolvedRoot, rawPath);
|
|
28
|
+
const relative = path.relative(resolvedRoot, resolvedTarget);
|
|
29
|
+
if (relative.startsWith('..') || path.isAbsolute(relative)) {
|
|
30
|
+
throw new SecurityPolicyError(`Pointer rejected: "${rawPath}" escapes workspace_root "${workspaceRoot}".`);
|
|
31
|
+
}
|
|
32
|
+
// Symlink physical resolution and real path boundary guard
|
|
33
|
+
if (fs.existsSync(resolvedTarget)) {
|
|
34
|
+
try {
|
|
35
|
+
const realTarget = fs.realpathSync(resolvedTarget);
|
|
36
|
+
const realRoot = fs.existsSync(resolvedRoot) ? fs.realpathSync(resolvedRoot) : resolvedRoot;
|
|
37
|
+
const realRelative = path.relative(realRoot, realTarget);
|
|
38
|
+
if (realRelative.startsWith('..') || path.isAbsolute(realRelative)) {
|
|
39
|
+
throw new SecurityPolicyError(`Pointer rejected: "${rawPath}" resolves to symlink target "${realTarget}" outside workspace_root "${workspaceRoot}".`);
|
|
40
|
+
}
|
|
41
|
+
// Re-verify real target against sensitive blacklist to prevent symlink masking (e.g. foo.ts -> .env)
|
|
42
|
+
const normalizedReal = realTarget.replace(/\\/g, '/');
|
|
43
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
44
|
+
if (pattern.test(normalizedReal) || pattern.test(path.basename(normalizedReal))) {
|
|
45
|
+
throw new SecurityPolicyError(`Pointer rejected by security blacklist: symlink target "${realTarget}" matches sensitive file pattern.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return realTarget;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof SecurityPolicyError) {
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
throw new SecurityPolicyError(`Pointer rejected: failed to physically resolve path "${rawPath}" safely (${err.message}).`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return resolvedTarget;
|
|
58
|
+
}
|
|
59
|
+
export function computeFullFileSha256(buffer) {
|
|
60
|
+
return crypto.createHash('sha256').update(buffer).digest('hex');
|
|
61
|
+
}
|
|
62
|
+
function extractFirstAndLastLine(content, maxLen = 48) {
|
|
63
|
+
const lines = content.split(/\r?\n/);
|
|
64
|
+
const nonEmpty = lines.filter((l) => l.trim().length > 0);
|
|
65
|
+
if (nonEmpty.length === 0) {
|
|
66
|
+
return { first_line: '', last_line: '', total_lines: lines.length };
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
first_line: nonEmpty[0].slice(0, maxLen),
|
|
70
|
+
last_line: nonEmpty[nonEmpty.length - 1].slice(0, maxLen),
|
|
71
|
+
total_lines: lines.length,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function computeFingerprints(workspaceRoot, pointers, nowMs = Date.now()) {
|
|
75
|
+
if (!fs.existsSync(workspaceRoot)) {
|
|
76
|
+
throw new Error(`workspace_root does not exist: "${workspaceRoot}"`);
|
|
77
|
+
}
|
|
78
|
+
let recentlyModified = false;
|
|
79
|
+
const fingerprints = [];
|
|
80
|
+
for (const ptr of pointers) {
|
|
81
|
+
const absPath = assertSafePointerPath(workspaceRoot, ptr.path);
|
|
82
|
+
if (!fs.existsSync(absPath)) {
|
|
83
|
+
throw new Error(`Pointer target file does not exist: "${ptr.path}" (resolved: "${absPath}")`);
|
|
84
|
+
}
|
|
85
|
+
const stat = fs.statSync(absPath);
|
|
86
|
+
if (!stat.isFile()) {
|
|
87
|
+
throw new Error(`Pointer target is not a regular file: "${ptr.path}"`);
|
|
88
|
+
}
|
|
89
|
+
const buffer = fs.readFileSync(absPath);
|
|
90
|
+
const sha256 = computeFullFileSha256(buffer);
|
|
91
|
+
const text = buffer.toString('utf8');
|
|
92
|
+
const { first_line, last_line, total_lines } = extractFirstAndLastLine(text);
|
|
93
|
+
if (ptr.line_range) {
|
|
94
|
+
const [startLine, endLine] = ptr.line_range;
|
|
95
|
+
if (startLine > endLine) {
|
|
96
|
+
throw new Error(`Invalid line_range [${startLine}, ${endLine}] for "${ptr.path}": startLine must be <= endLine.`);
|
|
97
|
+
}
|
|
98
|
+
if (startLine > total_lines) {
|
|
99
|
+
throw new Error(`Invalid line_range [${startLine}, ${endLine}] for "${ptr.path}": file only has ${total_lines} lines.`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (nowMs - stat.mtimeMs < 3000) {
|
|
103
|
+
recentlyModified = true;
|
|
104
|
+
}
|
|
105
|
+
fingerprints.push({
|
|
106
|
+
path: ptr.path,
|
|
107
|
+
size: stat.size,
|
|
108
|
+
mtime_ms: Math.floor(stat.mtimeMs),
|
|
109
|
+
sha256,
|
|
110
|
+
first_line,
|
|
111
|
+
last_line,
|
|
112
|
+
...(ptr.line_range ? { line_range: ptr.line_range } : {}),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return { fingerprints, recentlyModified };
|
|
116
|
+
}
|
|
117
|
+
export function verifyAllPointers(workspaceRoot, fingerprints) {
|
|
118
|
+
const dirtyFiles = [];
|
|
119
|
+
for (const fp of fingerprints) {
|
|
120
|
+
const res = verifySingleRun(workspaceRoot, [fp]);
|
|
121
|
+
if (!res.valid && res.reason) {
|
|
122
|
+
dirtyFiles.push({
|
|
123
|
+
path: fp.path,
|
|
124
|
+
reason: res.reason,
|
|
125
|
+
detail: res.detail ?? res.reason,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (dirtyFiles.length > 0) {
|
|
130
|
+
return {
|
|
131
|
+
valid: false,
|
|
132
|
+
firstFailure: {
|
|
133
|
+
valid: false,
|
|
134
|
+
reason: dirtyFiles[0].reason,
|
|
135
|
+
detail: dirtyFiles[0].detail,
|
|
136
|
+
},
|
|
137
|
+
dirtyFiles,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return { valid: true, dirtyFiles: [] };
|
|
141
|
+
}
|
|
142
|
+
export function verifySingleRun(workspaceRoot, fingerprints) {
|
|
143
|
+
for (const fp of fingerprints) {
|
|
144
|
+
let absPath;
|
|
145
|
+
try {
|
|
146
|
+
// Worker-side defense-in-depth: re-verify security blacklist & workspace containment
|
|
147
|
+
absPath = assertSafePointerPath(workspaceRoot, fp.path);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return {
|
|
151
|
+
valid: false,
|
|
152
|
+
reason: 'SECURITY_REJECTED',
|
|
153
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Step 1: Existence check
|
|
157
|
+
if (!fs.existsSync(absPath)) {
|
|
158
|
+
return {
|
|
159
|
+
valid: false,
|
|
160
|
+
reason: 'FILE_MISSING',
|
|
161
|
+
detail: `File missing on worker disk: "${fp.path}"`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const stat = fs.statSync(absPath);
|
|
165
|
+
// Step 2: Fast byte-size check
|
|
166
|
+
if (stat.size !== fp.size) {
|
|
167
|
+
return {
|
|
168
|
+
valid: false,
|
|
169
|
+
reason: 'SIZE_MISMATCH',
|
|
170
|
+
detail: `File size changed for "${fp.path}": expected ${fp.size} bytes, got ${stat.size} bytes`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Step 3: Full-file SHA-256 verification (never rely on mtime_ms to reject, and always hash full file)
|
|
174
|
+
const buffer = fs.readFileSync(absPath);
|
|
175
|
+
const currentSha256 = computeFullFileSha256(buffer);
|
|
176
|
+
if (currentSha256 !== fp.sha256) {
|
|
177
|
+
return {
|
|
178
|
+
valid: false,
|
|
179
|
+
reason: 'CONTENT_CHANGED',
|
|
180
|
+
detail: `File content SHA-256 mismatch for "${fp.path}": expected ${fp.sha256.slice(0, 16)}..., got ${currentSha256.slice(0, 16)}...`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { valid: true };
|
|
185
|
+
}
|
|
186
|
+
function sleepSync(ms) {
|
|
187
|
+
if (ms <= 0)
|
|
188
|
+
return;
|
|
189
|
+
const sab = new SharedArrayBuffer(4);
|
|
190
|
+
const int32 = new Int32Array(sab);
|
|
191
|
+
Atomics.wait(int32, 0, 0, ms);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Verifies all file fingerprints. If a content/size mismatch is detected on the first read,
|
|
195
|
+
* waits `retryDelayMs` (default 150ms) and re-checks once to rule out transient IDE buffer flushes.
|
|
196
|
+
*/
|
|
197
|
+
export function verifyFingerprintsWithRetry(workspaceRoot, fingerprints, retryDelayMs = 150) {
|
|
198
|
+
const firstCheck = verifySingleRun(workspaceRoot, fingerprints);
|
|
199
|
+
if (firstCheck.valid || firstCheck.reason === 'SECURITY_REJECTED') {
|
|
200
|
+
return firstCheck;
|
|
201
|
+
}
|
|
202
|
+
sleepSync(retryDelayMs);
|
|
203
|
+
return verifySingleRun(workspaceRoot, fingerprints);
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
import { FerryCatEngine } from './engine.js';
|
|
7
|
+
import { DispatchContractShape, ExtendTtlShape, FailContractShape, FulfillContractShape, InspectMeshStateShape, PollNextTaskShape, ReleaseContractShape, VerifyContractShape, } from './schemas.js';
|
|
8
|
+
function loadPackageVersion() {
|
|
9
|
+
try {
|
|
10
|
+
const pkgPath = fileURLToPath(new URL('../package.json', import.meta.url));
|
|
11
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
12
|
+
return pkg.version ?? '0.3.2';
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return '0.3.2';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const PKG_VERSION = loadPackageVersion();
|
|
19
|
+
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
|
20
|
+
console.log(PKG_VERSION);
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
if (process.argv.includes('--help') ||
|
|
24
|
+
process.argv.includes('-h') ||
|
|
25
|
+
process.argv[2] === 'help') {
|
|
26
|
+
console.log(`FerryCat MCP Stdio Server v${PKG_VERSION}
|
|
27
|
+
Contract-driven cross-host AI agent handoff & review bus over MCP and SQLite WAL.
|
|
28
|
+
|
|
29
|
+
Usage:
|
|
30
|
+
ferrycat Start MCP stdio server (for IDE/Host integration)
|
|
31
|
+
ferrycat --help | -h Show this help message
|
|
32
|
+
ferrycat --version | -v Print version
|
|
33
|
+
|
|
34
|
+
Environment Variables:
|
|
35
|
+
AGENT_NAME Default agent identity for this host (e.g., "antigravity", "workbuddy")
|
|
36
|
+
FERRYCAT_DB_PATH Custom SQLite database path (default: ~/.ferrycat/mesh.db)
|
|
37
|
+
|
|
38
|
+
Exposed MCP Tools (8):
|
|
39
|
+
dispatch_contract Dispatch a contract locking full-file SHA-256 pointers
|
|
40
|
+
poll_next_task Atomically claim oldest SUBMITTED contract & verify pointers
|
|
41
|
+
verify_contract Read-only pre-flight check of on-disk pointer files (ADR-0004)
|
|
42
|
+
fulfill_contract Submit results (with TOCTOU soft-failure buffering & Ajv schema validation)
|
|
43
|
+
release_contract Return CLAIMED contract to queue tail (max 3 releases)
|
|
44
|
+
extend_ttl Heartbeat renewal of execution window (max 5 extensions)
|
|
45
|
+
fail_contract Mark CLAIMED contract as terminal FAILED with reason
|
|
46
|
+
inspect_mesh_state Read-only query of contracts by status, ID, or target_agent
|
|
47
|
+
|
|
48
|
+
For CLI command usage (dispatch/poll/fulfill/verify/release/extend/fail/inspect/worker), run:
|
|
49
|
+
ferrycat-cli --help`);
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
const engine = new FerryCatEngine();
|
|
53
|
+
const server = new McpServer({
|
|
54
|
+
name: 'ferrycat',
|
|
55
|
+
version: PKG_VERSION,
|
|
56
|
+
});
|
|
57
|
+
// Tool 1: dispatch_contract
|
|
58
|
+
server.tool('dispatch_contract', `Dispatch a task or code review contract to another local AI agent host via the shared SQLite WAL mesh.
|
|
59
|
+
|
|
60
|
+
### Purpose
|
|
61
|
+
Registers a new contract in SUBMITTED status with full-file SHA-256 fingerprint snapshots of all target files, establishing an immutable baseline for cross-host verification.
|
|
62
|
+
|
|
63
|
+
### Usage Guidelines
|
|
64
|
+
- When to use: Use when requesting code reviews, architecture audits, implementation, or test generation from a target agent (e.g., target_agent="workbuddy" or "antigravity").
|
|
65
|
+
- When NOT to use:
|
|
66
|
+
- Do NOT use to claim or execute tasks (use poll_next_task).
|
|
67
|
+
- Do NOT use to check task status or inspect outputs (use inspect_mesh_state).
|
|
68
|
+
- Do NOT use if the target host does not share the same local filesystem access to workspace_root.
|
|
69
|
+
- Prerequisites: workspace_root must be a valid directory accessible by both hosts. Pointer files must exist on disk and be saved. Sensitive files (.env, keys, credentials, .git/config) and path escapes are strictly blocked.
|
|
70
|
+
|
|
71
|
+
### Behavior & Side Effects
|
|
72
|
+
- Mutates database: Synchronously inserts a single row into contracts with status='SUBMITTED' in SQLite WAL (~/.ferrycat/mesh.db).
|
|
73
|
+
- SHA-256 Snapshot: Computes 64-char hex SHA-256, byte size, and first/last lines for each pointer. Emits a warning if any file was modified within the last 3 seconds (indicating unsaved IDE buffers).
|
|
74
|
+
- Lifecycle & Expiry: Starts the queue_ttl_sec countdown (default: 1800s / 30m). If the target agent never claims it before queue_ttl_sec elapses, the contract lazily transitions to TIMED_OUT.
|
|
75
|
+
- Once claimed, execution is governed by exec_ttl_sec (tiered default: 1800s for review/audit, 300s for implementation/test).
|
|
76
|
+
|
|
77
|
+
### Return Value
|
|
78
|
+
Returns { contract_id: string, status: 'SUBMITTED', created_at: number, files: Array<{ path, size, mtime_ms, sha256, first_line, last_line, line_range? }>, warning?: string }. Note: requester_agent / target_agent / task_type / title / TTLs are NOT echoed back — read them via inspect_mesh_state if needed.`, DispatchContractShape, async (args) => {
|
|
79
|
+
try {
|
|
80
|
+
const result = engine.dispatchContract(args);
|
|
81
|
+
return {
|
|
82
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
+
return {
|
|
88
|
+
isError: true,
|
|
89
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: false, error: message }, null, 2) }],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Tool 2: poll_next_task
|
|
94
|
+
server.tool('poll_next_task', `Atomically claim the oldest pending SUBMITTED contract assigned to this agent and verify local file fingerprints.
|
|
95
|
+
|
|
96
|
+
### Purpose
|
|
97
|
+
Retrieves and claims next available contract work for the current agent, transitioning it from SUBMITTED to CLAIMED.
|
|
98
|
+
|
|
99
|
+
### Usage Guidelines
|
|
100
|
+
- When to use: Call periodically or when notified to discover and atomically take ownership of pending tasks assigned to your agent_id.
|
|
101
|
+
- When NOT to use:
|
|
102
|
+
- Do NOT use to non-destructively inspect queue depth or monitor status without claiming (use inspect_mesh_state).
|
|
103
|
+
- Do NOT use to create contracts (use dispatch_contract).
|
|
104
|
+
- IMPORTANT (ADR-0004): Pointers are an immutable baseline snapshot ("what I read"). Never edit pointer files directly on disk while holding a review contract; deliver any proposed code fixes via structured_output.fixes in fulfill_contract.
|
|
105
|
+
|
|
106
|
+
### Behavior & Side Effects
|
|
107
|
+
- Mutates database: Atomically claims the oldest SUBMITTED contract for agent_id using optimistic concurrency (UPDATE ... WHERE status='SUBMITTED', checked by changes===1). Starts the exec_ttl_sec window.
|
|
108
|
+
- Lazy TTL sweep: Automatically sweeps and marks expired contracts as TIMED_OUT using lock-free read-before-write probing.
|
|
109
|
+
- Fingerprint verification: Verifies Existence -> Byte Size -> SHA-256 for all pointers. If on-disk files were altered or missing, marks the contract POINTER_STALE and transparently advances to claim the next valid candidate in the queue.
|
|
110
|
+
|
|
111
|
+
### Return Value
|
|
112
|
+
- When work is claimed: { ok: true, has_task: true, status: 'CLAIMED', contract: { contract_id, requester_agent, target_agent, task_type, title, context_summary, workspace_root, pointers, contract_schema, claimed_at, exec_ttl_sec } }.
|
|
113
|
+
- When queue is empty: { ok: true, has_task: false, message: 'No pending contracts for agent "<agent_id>"' }.`, PollNextTaskShape, async (args) => {
|
|
114
|
+
try {
|
|
115
|
+
const result = engine.pollNextTask(args);
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
122
|
+
return {
|
|
123
|
+
isError: true,
|
|
124
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: false, error: message }, null, 2) }],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Tool 3: fulfill_contract
|
|
129
|
+
server.tool('fulfill_contract', `Submit execution or review deliverables for a CLAIMED contract, with TOCTOU soft-failure buffering and Ajv JSON Schema validation.
|
|
130
|
+
|
|
131
|
+
### Purpose
|
|
132
|
+
Delivers the final output of a task, verifies that the code baseline was not mutated during execution, validates structured payloads, and transitions the contract to terminal COMPLETED.
|
|
133
|
+
|
|
134
|
+
### Usage Guidelines
|
|
135
|
+
- When to use: Use after completing task work to deliver result_summary, optional structured_output, and optional artifacts_pointers.
|
|
136
|
+
- When NOT to use:
|
|
137
|
+
- Do NOT use if you cannot complete the task (use release_contract to re-queue, or fail_contract to record failure).
|
|
138
|
+
- Do NOT use if you modified pointer files directly on disk. If modified accidentally, run "git stash" or restore the files, run verify_contract, and pass proposed fixes inside structured_output.fixes.
|
|
139
|
+
|
|
140
|
+
### Behavior & Side Effects
|
|
141
|
+
- Authorization: Caller agent_id must match target_agent of the claimed contract.
|
|
142
|
+
- TOCTOU Guard & Soft-Failure Buffer (ADR-0004) — exactly ONE recoverable rejection:
|
|
143
|
+
- 1st blocked fulfill: returns status='RETRY_NEEDED', keeps the contract CLAIMED, renews the execution window (claimed_at=now), and lists dirty_files with restore instructions.
|
|
144
|
+
- 2nd blocked fulfill: transitions to terminal status='POINTER_STALE', preserving your summary and payload in salvaged_result_json so the work is not lost.
|
|
145
|
+
- Only ONE rejection is recoverable: restore/stash the files BEFORE retrying, and call verify_contract first so a stray second attempt cannot burn the buffer.
|
|
146
|
+
- Schema Validation: If contract_schema was defined, validates structured_output via cached Ajv validator. Failures 1 & 2 return RETRY_NEEDED with flattened error paths and renew the execution window; 3rd failure transitions to terminal VALIDATION_FAILED.
|
|
147
|
+
- On Success: Transitions to terminal status='COMPLETED', recording result_summary, structured_output, artifacts_pointers, and verified SHA-256 snapshot.
|
|
148
|
+
|
|
149
|
+
### Return Value
|
|
150
|
+
Returns { ok: boolean, contract_id: string, status: 'COMPLETED' | 'RETRY_NEEDED' | 'POINTER_STALE' | 'VALIDATION_FAILED', retry_count: number, max_retries: number, toctou_strike?: number, max_toctou_strikes?: number, dirty_files?: Array<{ path, reason, detail }>, validation_errors?: string[], message: string }.`, FulfillContractShape, async (args) => {
|
|
151
|
+
try {
|
|
152
|
+
const result = engine.fulfillContract(args);
|
|
153
|
+
return {
|
|
154
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
+
return {
|
|
160
|
+
isError: true,
|
|
161
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: false, error: message }, null, 2) }],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// Tool 4: inspect_mesh_state
|
|
166
|
+
server.tool('inspect_mesh_state', `Strictly read-only query of contracts, execution progress, outputs, diagnostic counters, and failure causes.
|
|
167
|
+
|
|
168
|
+
### Purpose
|
|
169
|
+
Provides comprehensive observability into the multi-agent mesh state without acquiring database locks or mutating rows.
|
|
170
|
+
|
|
171
|
+
### Usage Guidelines
|
|
172
|
+
- When to use:
|
|
173
|
+
- Check whether a contract you dispatched has been claimed or completed.
|
|
174
|
+
- Inspect result summaries, structured outputs, or salvaged results of completed/stale contracts.
|
|
175
|
+
- Monitor queue depth or pending contracts for a specific agent via target_agent filter.
|
|
176
|
+
- When NOT to use:
|
|
177
|
+
- Do NOT use to claim tasks (use poll_next_task).
|
|
178
|
+
- Do NOT use to dispatch tasks (use dispatch_contract).
|
|
179
|
+
- Do NOT use to verify on-disk file pointer hygiene (use verify_contract).
|
|
180
|
+
|
|
181
|
+
### Behavior & Side Effects
|
|
182
|
+
- Zero side effects: Pure read-only SELECT query against SQLite WAL. Never alters rows or triggers sweeps.
|
|
183
|
+
- Dynamically calculates is_logically_expired: true when a contract has exceeded its queue or execution TTL based on the current timestamp, even before the next lazy sweep runs.
|
|
184
|
+
|
|
185
|
+
### Return Value
|
|
186
|
+
Returns { total_returned: number, contracts: Array<{ contract_id, requester_agent, target_agent, task_type, title, status, is_logically_expired, created_at, claimed_at, completed_at, retry_count, extend_count, release_count, toctou_strike, result_summary, structured_output, artifacts_pointers, error_reason, salvaged_result, verified_sha256 }> }.`, InspectMeshStateShape, async (args) => {
|
|
187
|
+
try {
|
|
188
|
+
const result = engine.inspectMeshState(args);
|
|
189
|
+
return {
|
|
190
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
195
|
+
return {
|
|
196
|
+
isError: true,
|
|
197
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: false, error: message }, null, 2) }],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
function toToolResult(run) {
|
|
202
|
+
try {
|
|
203
|
+
const result = run();
|
|
204
|
+
return {
|
|
205
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
210
|
+
return {
|
|
211
|
+
isError: true,
|
|
212
|
+
content: [
|
|
213
|
+
{ type: 'text', text: JSON.stringify({ ok: false, error: message }, null, 2) },
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Tool 5: release_contract
|
|
219
|
+
server.tool('release_contract', `Hand a CLAIMED contract back to the queue tail as SUBMITTED with a fresh queue window.
|
|
220
|
+
|
|
221
|
+
### Purpose
|
|
222
|
+
Allows an agent holding a claimed task to safely release ownership back to the queue without failing or aborting the task.
|
|
223
|
+
|
|
224
|
+
### Usage Guidelines
|
|
225
|
+
- When to use: Use when your agent claimed a task by mistake, encounters missing local dependencies/tools, or needs to switch git branches before processing.
|
|
226
|
+
- When NOT to use:
|
|
227
|
+
- Do NOT use if the task permanently failed or cannot ever be completed (use fail_contract).
|
|
228
|
+
- Do NOT use if you simply need more time to finish active execution (use extend_ttl).
|
|
229
|
+
- Prerequisites: Caller must be the current holder (agent_id matches target_agent) and contract status must be CLAIMED.
|
|
230
|
+
|
|
231
|
+
### Behavior & Side Effects
|
|
232
|
+
- Mutates database: Resets claimed_at=NULL, updates queued_at=nowMs, resets extend_count=0 (renewal quota is per holder), and increments release_count.
|
|
233
|
+
- Preserves retry_count: The schema validation circuit-breaker quota is contract-level; releasing a contract cannot launder previously consumed retry attempts.
|
|
234
|
+
- Audit history: Appends reason to error_reason history ("RELEASED_BY_HOLDER: <reason> | prev: ...").
|
|
235
|
+
- Limits: Maximum 3 releases per contract. Refused once the contract reaches its absolute lifetime ceiling (nowMs >= created_at + 4 * queue_ttl_sec).
|
|
236
|
+
|
|
237
|
+
### Return Value
|
|
238
|
+
Returns { ok: boolean, contract_id: string, status: 'SUBMITTED' | 'CLAIMED' | 'TIMED_OUT', release_count: number, max_releases: number, message: string }.`, ReleaseContractShape, async (args) => toToolResult(() => engine.releaseContract(args)));
|
|
239
|
+
// Tool 6: extend_ttl
|
|
240
|
+
server.tool('extend_ttl', `Heartbeat renewal for long-running execution: restarts the active execution window of a CLAIMED contract.
|
|
241
|
+
|
|
242
|
+
### Purpose
|
|
243
|
+
Prevents execution timeout during deep reasoning, extensive test execution, or complex multi-step refactoring by resetting the execution clock.
|
|
244
|
+
|
|
245
|
+
### Usage Guidelines
|
|
246
|
+
- When to use: Call periodically during long-running tasks before the active exec_ttl_sec countdown expires.
|
|
247
|
+
- When NOT to use:
|
|
248
|
+
- Do NOT use after the window has already expired (expired contracts transition to TIMED_OUT).
|
|
249
|
+
- Do NOT use to deliver task completion (use fulfill_contract).
|
|
250
|
+
- Do NOT use if abandoning the task (use release_contract or fail_contract).
|
|
251
|
+
- Prerequisites: Caller must be the current holder and contract must be currently CLAIMED.
|
|
252
|
+
|
|
253
|
+
### Behavior & Side Effects
|
|
254
|
+
- Mutates database: Resets claimed_at=nowMs (restarting the full exec_ttl_sec window from the current moment) and increments extend_count.
|
|
255
|
+
- Quotas & Boundaries: Maximum 5 renewals per holder. Bounded by the contract's absolute lifetime ceiling (created_at + 4 * queue_ttl_sec); rejected if proposedExpiresAt > lifetimeDeadline.
|
|
256
|
+
|
|
257
|
+
### Return Value
|
|
258
|
+
Returns { ok: boolean, contract_id: string, status: 'CLAIMED' | 'TIMED_OUT', claimed_at?: number, expires_at?: number, extend_count: number, max_extends: number, message: string }.`, ExtendTtlShape, async (args) => toToolResult(() => engine.extendTtl(args)));
|
|
259
|
+
// Tool 7: fail_contract
|
|
260
|
+
server.tool('fail_contract', `Explicitly mark a CLAIMED contract as terminal FAILED with a mandatory failure reason.
|
|
261
|
+
|
|
262
|
+
### Purpose
|
|
263
|
+
Immediately terminates a claimed task that cannot be completed, recording actionable diagnostic reasons and freeing the requester from waiting for the execution TTL to expire.
|
|
264
|
+
|
|
265
|
+
### Usage Guidelines
|
|
266
|
+
- When to use: Use when a task encounters an unrecoverable failure (e.g. fatal syntax error, broken test suite, missing required environment).
|
|
267
|
+
- When NOT to use:
|
|
268
|
+
- Do NOT use if the task succeeded (use fulfill_contract).
|
|
269
|
+
- Do NOT use if the task is recoverable by another agent or retryable (use release_contract).
|
|
270
|
+
- Prerequisites: Caller must be the current holder and reason must be non-empty.
|
|
271
|
+
|
|
272
|
+
### Behavior & Side Effects
|
|
273
|
+
- Mutates database: Sets status='FAILED', error_reason='WORKER_FAILED: <reason>', and completed_at=nowMs.
|
|
274
|
+
- Late report handling: If the execution window already expired before fail_contract was called, the status becomes TIMED_OUT while faithfully preserving the worker's reason for the requester.
|
|
275
|
+
|
|
276
|
+
### Return Value
|
|
277
|
+
Returns { ok: boolean, contract_id: string, status: 'FAILED' | 'TIMED_OUT', message: string }.`, FailContractShape, async (args) => toToolResult(() => engine.failContract(args)));
|
|
278
|
+
// Tool 8: verify_contract
|
|
279
|
+
server.tool('verify_contract', `Read-only pre-flight consistency check (ADR-0004): audits on-disk pointer files against the baseline SHA-256 snapshot.
|
|
280
|
+
|
|
281
|
+
### Purpose
|
|
282
|
+
Enables agents or automated scripts to verify that on-disk files match the contract's dispatched baseline before calling fulfill_contract, preventing accidental TOCTOU strikes.
|
|
283
|
+
|
|
284
|
+
### Usage Guidelines
|
|
285
|
+
- When to use: Call before fulfill_contract while holding a CLAIMED contract to confirm file cleanliness, or when investigating why a fulfill call was blocked.
|
|
286
|
+
- When NOT to use:
|
|
287
|
+
- Do NOT use to deliver results (use fulfill_contract).
|
|
288
|
+
- Do NOT use to renew time (use extend_ttl).
|
|
289
|
+
- ADR-0004 Rule: Pointers are an immutable review baseline. If verify_contract reports dirty files, restore or stash them (e.g., git stash or git checkout -- <file>) and deliver proposed changes inside structured_output.fixes.
|
|
290
|
+
|
|
291
|
+
### Behavior & Side Effects
|
|
292
|
+
- Zero side effects: Pure read-only operation. Never updates the database, never alters contract status, and never consumes a TOCTOU strike.
|
|
293
|
+
- Complete pointer check: Verifies all pointer files on disk and returns every drifted file (reason: SIZE_MISMATCH, CONTENT_CHANGED, or FILE_MISSING).
|
|
294
|
+
|
|
295
|
+
### Return Value
|
|
296
|
+
Returns { ok: true, valid: boolean, fulfillable: boolean, contract_id: string, status: ContractStatus, target_agent: string, toctou_strike: number, max_toctou_strikes: number, dirty_files: Array<{ path, reason, detail }>, message: string }. NOTE: valid only means every pointer still matches its dispatched baseline. fulfillable additionally requires the contract to be CLAIMED. A contract that already went terminal (FAILED / POINTER_STALE / COMPLETED) can report valid=true while fulfillable=false, so branch on fulfillable rather than valid before calling fulfill_contract.`, VerifyContractShape, async (args) => toToolResult(() => engine.verifyContract(args)));
|
|
297
|
+
async function main() {
|
|
298
|
+
const transport = new StdioServerTransport();
|
|
299
|
+
await server.connect(transport);
|
|
300
|
+
}
|
|
301
|
+
main().catch((err) => {
|
|
302
|
+
process.stderr.write(`[FerryCat Fatal] ${err instanceof Error ? err.message : String(err)}\n`);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
});
|
|
305
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|