@rcrsr/rill-agent 0.18.5 → 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 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/http';
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
@@ -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
@@ -1,3 +1,5 @@
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
  //# sourceMappingURL=index.js.map
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,2 @@
1
+ export declare function routerErrorToStatus(err: unknown): 404 | 500;
2
+ //# sourceMappingURL=router-error.d.ts.map
@@ -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,8 @@
1
+ export function routerErrorToStatus(err) {
2
+ const message = err instanceof Error ? err.message : String(err);
3
+ if (message.includes('not found')) {
4
+ return 404;
5
+ }
6
+ return 500;
7
+ }
8
+ //# sourceMappingURL=router-error.js.map
@@ -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,3 @@
1
+ import type { AgentRouter } from './types.js';
2
+ export declare function validateParams(params: Record<string, unknown>, agentName: string, router: AgentRouter): string | null;
3
+ //# sourceMappingURL=validate-params.d.ts.map
@@ -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.5",
3
+ "version": "0.18.6",
4
4
  "license": "MIT",
5
5
  "author": "Andre Bremer",
6
6
  "type": "module",
@@ -8,16 +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
- "dependencies": {
18
- "@hono/node-server": "^1.19.12",
19
- "hono": "^4.12.10"
20
- },
21
13
  "files": [
22
14
  "dist"
23
15
  ],
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/harness/http.ts"],"names":[],"mappings":"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"}