@rcrsr/rill-agent 0.18.4 → 0.18.6
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/README.md +7 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/router-error.d.ts +2 -0
- package/dist/router-error.d.ts.map +1 -0
- package/dist/router-error.js +8 -0
- package/dist/router-error.js.map +1 -0
- package/dist/validate-params.d.ts +3 -0
- package/dist/validate-params.d.ts.map +1 -0
- package/dist/validate-params.js +30 -0
- package/dist/validate-params.js.map +1 -0
- package/package.json +9 -17
- package/dist/harness/http.d.ts +0 -17
- package/dist/harness/http.d.ts.map +0 -1
- package/dist/harness/http.js +0 -149
- package/dist/harness/http.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,11 +8,17 @@ Core agent runtime for the [rill](https://github.com/rcrsr/rill) language. Loads
|
|
|
8
8
|
npm install @rcrsr/rill-agent
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
For the HTTP harness, install the separate package:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @rcrsr/rill-agent-http
|
|
15
|
+
```
|
|
16
|
+
|
|
11
17
|
## Quick Start
|
|
12
18
|
|
|
13
19
|
```typescript
|
|
14
20
|
import { loadManifest, createRouter } from '@rcrsr/rill-agent';
|
|
15
|
-
import { httpHarness } from '@rcrsr/rill-agent
|
|
21
|
+
import { httpHarness } from '@rcrsr/rill-agent-http';
|
|
16
22
|
|
|
17
23
|
const manifest = await loadManifest('./build');
|
|
18
24
|
const router = await createRouter(manifest, {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { loadManifest } from './manifest.js';
|
|
2
2
|
export { createRouter } from './router.js';
|
|
3
|
+
export { validateParams } from './validate-params.js';
|
|
4
|
+
export { routerErrorToStatus } from './router-error.js';
|
|
3
5
|
export type { AgentHandler, AgentManifest, AgentRouter, HandlerDescription, InitContext, RunRequest, RunContext, RunResponse, } from './types.js';
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-error.d.ts","sourceRoot":"","sources":["../src/router-error.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,GAAG,GAAG,CAM3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-error.js","sourceRoot":"","sources":["../src/router-error.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-params.d.ts","sourceRoot":"","sources":["../src/validate-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,GAAG,IAAI,CA2Bf"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function validateParams(params, agentName, router) {
|
|
2
|
+
const desc = router.describe(agentName);
|
|
3
|
+
if (desc === null)
|
|
4
|
+
return null;
|
|
5
|
+
for (const param of desc.params) {
|
|
6
|
+
const value = params[param.name];
|
|
7
|
+
if (param.required && (value === undefined || value === null)) {
|
|
8
|
+
return `Missing required parameter: ${param.name}`;
|
|
9
|
+
}
|
|
10
|
+
if (value !== undefined && value !== null && param.type !== 'any') {
|
|
11
|
+
const actual = typeof value;
|
|
12
|
+
const expected = param.type === 'dict' ? 'object' : param.type;
|
|
13
|
+
if (expected === 'list') {
|
|
14
|
+
if (!Array.isArray(value)) {
|
|
15
|
+
return `Parameter "${param.name}" must be a list, got ${actual}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (expected === 'object') {
|
|
19
|
+
if (actual !== 'object' || value === null || Array.isArray(value)) {
|
|
20
|
+
return `Parameter "${param.name}" must be a dict, got ${Array.isArray(value) ? 'list' : actual}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (actual !== expected) {
|
|
24
|
+
return `Parameter "${param.name}" must be ${param.type}, got ${actual}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=validate-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-params.js","sourceRoot":"","sources":["../src/validate-params.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAC5B,MAA+B,EAC/B,SAAiB,EACjB,MAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YAC9D,OAAO,+BAA+B,KAAK,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/D,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,cAAc,KAAK,CAAC,IAAI,yBAAyB,MAAM,EAAE,CAAC;gBACnE,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,OAAO,cAAc,KAAK,CAAC,IAAI,yBAAyB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACnG,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,cAAc,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rcrsr/rill-agent",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Andre Bremer",
|
|
6
6
|
"type": "module",
|
|
@@ -8,23 +8,8 @@
|
|
|
8
8
|
".": {
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
10
|
"default": "./dist/index.js"
|
|
11
|
-
},
|
|
12
|
-
"./http": {
|
|
13
|
-
"types": "./dist/harness/http.d.ts",
|
|
14
|
-
"default": "./dist/harness/http.js"
|
|
15
11
|
}
|
|
16
12
|
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc --build",
|
|
19
|
-
"test": "vitest run",
|
|
20
|
-
"typecheck": "tsc --noEmit",
|
|
21
|
-
"lint": "eslint --config ../../../eslint.config.js src/",
|
|
22
|
-
"check": "pnpm run build && pnpm run test && pnpm run lint"
|
|
23
|
-
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@hono/node-server": "^1.19.12",
|
|
26
|
-
"hono": "^4.12.10"
|
|
27
|
-
},
|
|
28
13
|
"files": [
|
|
29
14
|
"dist"
|
|
30
15
|
],
|
|
@@ -35,5 +20,12 @@
|
|
|
35
20
|
"type": "git",
|
|
36
21
|
"url": "git+https://github.com/rcrsr/rill-agent.git",
|
|
37
22
|
"directory": "packages/agent/core"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc --build",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"lint": "eslint --config ../../../eslint.config.js src/",
|
|
29
|
+
"check": "pnpm run build && pnpm run test && pnpm run lint"
|
|
38
30
|
}
|
|
39
|
-
}
|
|
31
|
+
}
|
package/dist/harness/http.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Hono } from 'hono';
|
|
2
|
-
import type { AgentRouter } from '../types.js';
|
|
3
|
-
export interface HttpHarness {
|
|
4
|
-
listen(port?: number): Promise<void>;
|
|
5
|
-
close(): Promise<void>;
|
|
6
|
-
readonly app: Hono;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Create an HTTP harness wrapping an AgentRouter.
|
|
10
|
-
*
|
|
11
|
-
* Routes:
|
|
12
|
-
* POST /agents/:name/run — execute a named agent
|
|
13
|
-
* POST /run — execute the default agent
|
|
14
|
-
* GET /agents — list agents with descriptions
|
|
15
|
-
*/
|
|
16
|
-
export declare function httpHarness(router: AgentRouter): HttpHarness;
|
|
17
|
-
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/harness/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,aAAa,CAAC;AAM3D,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB;AA2CD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAqH5D"}
|
package/dist/harness/http.js
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { Hono } from 'hono';
|
|
2
|
-
import { serve } from '@hono/node-server';
|
|
3
|
-
// ============================================================
|
|
4
|
-
// PARAM VALIDATION
|
|
5
|
-
// ============================================================
|
|
6
|
-
function validateParams(params, agentName, router) {
|
|
7
|
-
const desc = router.describe(agentName);
|
|
8
|
-
if (desc === null)
|
|
9
|
-
return null;
|
|
10
|
-
for (const param of desc.params) {
|
|
11
|
-
const value = params[param.name];
|
|
12
|
-
if (param.required && (value === undefined || value === null)) {
|
|
13
|
-
return `Missing required parameter: ${param.name}`;
|
|
14
|
-
}
|
|
15
|
-
if (value !== undefined && value !== null && param.type !== 'any') {
|
|
16
|
-
const actual = typeof value;
|
|
17
|
-
const expected = param.type === 'dict' ? 'object' : param.type;
|
|
18
|
-
if (expected === 'list') {
|
|
19
|
-
if (!Array.isArray(value)) {
|
|
20
|
-
return `Parameter "${param.name}" must be a list, got ${actual}`;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
else if (expected === 'object') {
|
|
24
|
-
if (actual !== 'object' || value === null || Array.isArray(value)) {
|
|
25
|
-
return `Parameter "${param.name}" must be a dict, got ${Array.isArray(value) ? 'list' : actual}`;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
else if (actual !== expected) {
|
|
29
|
-
return `Parameter "${param.name}" must be ${param.type}, got ${actual}`;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
// ============================================================
|
|
36
|
-
// HTTP HARNESS
|
|
37
|
-
// ============================================================
|
|
38
|
-
/**
|
|
39
|
-
* Create an HTTP harness wrapping an AgentRouter.
|
|
40
|
-
*
|
|
41
|
-
* Routes:
|
|
42
|
-
* POST /agents/:name/run — execute a named agent
|
|
43
|
-
* POST /run — execute the default agent
|
|
44
|
-
* GET /agents — list agents with descriptions
|
|
45
|
-
*/
|
|
46
|
-
export function httpHarness(router) {
|
|
47
|
-
const app = new Hono();
|
|
48
|
-
let server;
|
|
49
|
-
// List agents
|
|
50
|
-
app.get('/agents', (c) => {
|
|
51
|
-
const names = router.agents();
|
|
52
|
-
const agents = names.map((name) => ({
|
|
53
|
-
name,
|
|
54
|
-
description: router.describe(name),
|
|
55
|
-
default: name === router.defaultAgent(),
|
|
56
|
-
}));
|
|
57
|
-
return c.json({ agents });
|
|
58
|
-
});
|
|
59
|
-
// Run named agent
|
|
60
|
-
app.post('/agents/:name/run', async (c) => {
|
|
61
|
-
const name = c.req.param('name');
|
|
62
|
-
let body;
|
|
63
|
-
try {
|
|
64
|
-
const parsed = await c.req.json();
|
|
65
|
-
if (parsed === null ||
|
|
66
|
-
typeof parsed !== 'object' ||
|
|
67
|
-
Array.isArray(parsed)) {
|
|
68
|
-
return c.json({ error: 'Request body must be a JSON object' }, 400);
|
|
69
|
-
}
|
|
70
|
-
body = parsed;
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return c.json({ error: 'Invalid JSON in request body' }, 400);
|
|
74
|
-
}
|
|
75
|
-
const params = body['params'] ?? {};
|
|
76
|
-
const validationError = validateParams(params, name, router);
|
|
77
|
-
if (validationError !== null) {
|
|
78
|
-
return c.json({ error: validationError }, 400);
|
|
79
|
-
}
|
|
80
|
-
const request = {
|
|
81
|
-
params,
|
|
82
|
-
...(typeof body['timeout'] === 'number'
|
|
83
|
-
? { timeout: body['timeout'] }
|
|
84
|
-
: {}),
|
|
85
|
-
};
|
|
86
|
-
try {
|
|
87
|
-
const response = await router.run(name, request);
|
|
88
|
-
return c.json(response);
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
92
|
-
if (message.includes('not found')) {
|
|
93
|
-
return c.json({ error: message }, 404);
|
|
94
|
-
}
|
|
95
|
-
return c.json({ error: message }, 500);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
// Run default agent
|
|
99
|
-
app.post('/run', async (c) => {
|
|
100
|
-
let body;
|
|
101
|
-
try {
|
|
102
|
-
const parsed = await c.req.json();
|
|
103
|
-
if (parsed === null ||
|
|
104
|
-
typeof parsed !== 'object' ||
|
|
105
|
-
Array.isArray(parsed)) {
|
|
106
|
-
return c.json({ error: 'Request body must be a JSON object' }, 400);
|
|
107
|
-
}
|
|
108
|
-
body = parsed;
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return c.json({ error: 'Invalid JSON in request body' }, 400);
|
|
112
|
-
}
|
|
113
|
-
const params = body['params'] ?? {};
|
|
114
|
-
const defaultName = router.defaultAgent();
|
|
115
|
-
const validationError = validateParams(params, defaultName, router);
|
|
116
|
-
if (validationError !== null) {
|
|
117
|
-
return c.json({ error: validationError }, 400);
|
|
118
|
-
}
|
|
119
|
-
const request = {
|
|
120
|
-
params,
|
|
121
|
-
...(typeof body['timeout'] === 'number'
|
|
122
|
-
? { timeout: body['timeout'] }
|
|
123
|
-
: {}),
|
|
124
|
-
};
|
|
125
|
-
try {
|
|
126
|
-
const response = await router.run('', request);
|
|
127
|
-
return c.json(response);
|
|
128
|
-
}
|
|
129
|
-
catch (err) {
|
|
130
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
131
|
-
return c.json({ error: message }, 500);
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
async function listen(port = 3000) {
|
|
135
|
-
return new Promise((resolve) => {
|
|
136
|
-
server = serve({ fetch: app.fetch, port }, () => {
|
|
137
|
-
resolve();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
async function close() {
|
|
142
|
-
if (server !== undefined) {
|
|
143
|
-
server.close();
|
|
144
|
-
server = undefined;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return { listen, close, app };
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=http.js.map
|
package/dist/harness/http.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/harness/http.ts"],"names":[],"mappings":"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"}
|