@zauso-ai/capstan-core 0.1.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/dist/server.js ADDED
@@ -0,0 +1,276 @@
1
+ import { Hono } from "hono";
2
+ import { cors } from "hono/cors";
3
+ import { toJSONSchema } from "zod";
4
+ import { createContext } from "./context.js";
5
+ import { enforcePolicies } from "./policy.js";
6
+ import { createApproval, getApproval, listApprovals, resolveApproval, } from "./approval.js";
7
+ /**
8
+ * Build a RouteMetadata entry, omitting keys whose value would be undefined
9
+ * (required by exactOptionalPropertyTypes).
10
+ */
11
+ function buildRouteMetadata(method, path, apiDef, inputSchema, outputSchema) {
12
+ const meta = { method, path };
13
+ if (apiDef.description !== undefined)
14
+ meta.description = apiDef.description;
15
+ if (apiDef.capability !== undefined)
16
+ meta.capability = apiDef.capability;
17
+ if (apiDef.resource !== undefined)
18
+ meta.resource = apiDef.resource;
19
+ if (apiDef.policy !== undefined)
20
+ meta.policy = apiDef.policy;
21
+ if (inputSchema !== undefined)
22
+ meta.inputSchema = inputSchema;
23
+ if (outputSchema !== undefined)
24
+ meta.outputSchema = outputSchema;
25
+ return meta;
26
+ }
27
+ /**
28
+ * Create a fully-wired Capstan application backed by a Hono server.
29
+ *
30
+ * The returned object contains:
31
+ * - `app` -- Hono instance ready to handle requests
32
+ * - `routeRegistry` -- array of route metadata for the agent manifest
33
+ * - `registerAPI()` -- helper to register an API definition as an HTTP route
34
+ */
35
+ export function createCapstanApp(config) {
36
+ const app = new Hono();
37
+ const routeRegistry = [];
38
+ /**
39
+ * Handler registry keyed by "METHOD /path" so that approved requests can
40
+ * re-execute the original handler without going through the HTTP stack.
41
+ */
42
+ const handlerRegistry = new Map();
43
+ // ------------------------------------------------------------------
44
+ // Global middleware
45
+ // ------------------------------------------------------------------
46
+ // CORS -- allow all origins by default (production apps override via config).
47
+ app.use("*", cors());
48
+ // Inject CapstanContext into every request so handlers can retrieve it.
49
+ app.use("*", async (c, next) => {
50
+ const ctx = createContext(c);
51
+ c.set("capstanCtx", ctx);
52
+ await next();
53
+ });
54
+ // ------------------------------------------------------------------
55
+ // registerAPI -- mount a route + track metadata
56
+ // ------------------------------------------------------------------
57
+ const registerAPI = (method, path, apiDef, policies) => {
58
+ // --- record metadata ------------------------------------------------
59
+ let inputSchema;
60
+ let outputSchema;
61
+ try {
62
+ if (apiDef.input) {
63
+ inputSchema = toJSONSchema(apiDef.input);
64
+ }
65
+ }
66
+ catch {
67
+ // Schema conversion is best-effort; silently ignore failures.
68
+ }
69
+ try {
70
+ if (apiDef.output) {
71
+ outputSchema = toJSONSchema(apiDef.output);
72
+ }
73
+ }
74
+ catch {
75
+ // Best-effort.
76
+ }
77
+ routeRegistry.push(buildRouteMetadata(method, path, apiDef, inputSchema, outputSchema));
78
+ // Store the handler so approved requests can re-execute it.
79
+ const routeKey = `${method} ${path}`;
80
+ handlerRegistry.set(routeKey, async (input, ctx) => {
81
+ return apiDef.handler({ input, ctx });
82
+ });
83
+ // --- mount on Hono --------------------------------------------------
84
+ const honoHandler = async (c) => {
85
+ const ctx = createContext(c);
86
+ // Policy enforcement
87
+ if (policies && policies.length > 0) {
88
+ let rawInput;
89
+ try {
90
+ rawInput =
91
+ method === "GET"
92
+ ? Object.fromEntries(new URL(c.req.url).searchParams)
93
+ : await c.req.json();
94
+ }
95
+ catch {
96
+ rawInput = undefined;
97
+ }
98
+ const policyResult = await enforcePolicies(policies, ctx, rawInput);
99
+ if (policyResult.effect === "deny") {
100
+ return c.json({ error: "Forbidden", reason: policyResult.reason ?? "Policy denied" }, 403);
101
+ }
102
+ if (policyResult.effect === "approve") {
103
+ const reason = policyResult.reason ?? "This action requires approval";
104
+ const approval = createApproval({
105
+ method,
106
+ path,
107
+ input: rawInput,
108
+ policy: policies.map((p) => p.key).join(", "),
109
+ reason,
110
+ });
111
+ return c.json({
112
+ status: "approval_required",
113
+ approvalId: approval.id,
114
+ reason,
115
+ pollUrl: `/capstan/approvals/${approval.id}`,
116
+ }, 202);
117
+ }
118
+ }
119
+ // Parse input
120
+ let input;
121
+ try {
122
+ if (method === "GET") {
123
+ input = Object.fromEntries(new URL(c.req.url).searchParams);
124
+ }
125
+ else {
126
+ const contentType = c.req.header("content-type") ?? "";
127
+ if (contentType.includes("application/json")) {
128
+ input = await c.req.json();
129
+ }
130
+ else {
131
+ input = {};
132
+ }
133
+ }
134
+ }
135
+ catch {
136
+ input = {};
137
+ }
138
+ // Run handler (which already includes input/output validation)
139
+ try {
140
+ const result = await apiDef.handler({ input, ctx });
141
+ return c.json(result);
142
+ }
143
+ catch (err) {
144
+ // Zod validation errors
145
+ if (err != null &&
146
+ typeof err === "object" &&
147
+ "issues" in err &&
148
+ Array.isArray(err.issues)) {
149
+ return c.json({
150
+ error: "Validation Error",
151
+ issues: err.issues,
152
+ }, 400);
153
+ }
154
+ // Generic errors
155
+ const message = err instanceof Error ? err.message : "Internal Server Error";
156
+ return c.json({ error: message }, 500);
157
+ }
158
+ };
159
+ // Register the handler on the correct HTTP method.
160
+ const lowerMethod = method.toLowerCase();
161
+ app[lowerMethod](path, honoHandler);
162
+ };
163
+ // ------------------------------------------------------------------
164
+ // Approval management endpoints
165
+ // ------------------------------------------------------------------
166
+ /** List all approvals, optionally filtered by ?status=pending|approved|denied */
167
+ app.get("/capstan/approvals", (c) => {
168
+ const statusParam = new URL(c.req.url).searchParams.get("status");
169
+ const items = listApprovals(statusParam ?? undefined);
170
+ return c.json({ approvals: items });
171
+ });
172
+ /** Get a single approval by ID */
173
+ app.get("/capstan/approvals/:id", (c) => {
174
+ const id = c.req.param("id");
175
+ const approval = getApproval(id);
176
+ if (!approval) {
177
+ return c.json({ error: "Approval not found" }, 404);
178
+ }
179
+ return c.json(approval);
180
+ });
181
+ /** Approve a pending approval — re-executes the original handler */
182
+ app.post("/capstan/approvals/:id/approve", async (c) => {
183
+ const id = c.req.param("id");
184
+ const existing = getApproval(id);
185
+ if (!existing) {
186
+ return c.json({ error: "Approval not found" }, 404);
187
+ }
188
+ if (existing.status !== "pending") {
189
+ return c.json({ error: "Approval already resolved", status: existing.status }, 409);
190
+ }
191
+ // Parse optional body for resolvedBy
192
+ let resolvedBy;
193
+ try {
194
+ const body = await c.req.json();
195
+ if (typeof body.resolvedBy === "string") {
196
+ resolvedBy = body.resolvedBy;
197
+ }
198
+ }
199
+ catch {
200
+ // No body or invalid JSON — that's fine.
201
+ }
202
+ const approval = resolveApproval(id, "approved", resolvedBy);
203
+ if (!approval) {
204
+ return c.json({ error: "Approval not found" }, 404);
205
+ }
206
+ // Re-execute the original handler with the stored input.
207
+ const routeKey = `${approval.method} ${approval.path}`;
208
+ const handler = handlerRegistry.get(routeKey);
209
+ if (!handler) {
210
+ return c.json({ error: "Handler not found for route", route: routeKey }, 500);
211
+ }
212
+ try {
213
+ // Build a synthetic context for the approver.
214
+ const ctx = createContext(c);
215
+ const result = await handler(approval.input, ctx);
216
+ approval.result = result;
217
+ return c.json({
218
+ status: "approved",
219
+ approvalId: approval.id,
220
+ result,
221
+ });
222
+ }
223
+ catch (err) {
224
+ const message = err instanceof Error ? err.message : "Handler execution failed";
225
+ return c.json({ error: message, approvalId: approval.id }, 500);
226
+ }
227
+ });
228
+ /** Deny a pending approval */
229
+ app.post("/capstan/approvals/:id/deny", async (c) => {
230
+ const id = c.req.param("id");
231
+ const existing = getApproval(id);
232
+ if (!existing) {
233
+ return c.json({ error: "Approval not found" }, 404);
234
+ }
235
+ if (existing.status !== "pending") {
236
+ return c.json({ error: "Approval already resolved", status: existing.status }, 409);
237
+ }
238
+ let resolvedBy;
239
+ let reason;
240
+ try {
241
+ const body = await c.req.json();
242
+ if (typeof body.resolvedBy === "string") {
243
+ resolvedBy = body.resolvedBy;
244
+ }
245
+ if (typeof body.reason === "string") {
246
+ reason = body.reason;
247
+ }
248
+ }
249
+ catch {
250
+ // No body or invalid JSON — that's fine.
251
+ }
252
+ const approval = resolveApproval(id, "denied", resolvedBy);
253
+ if (!approval) {
254
+ return c.json({ error: "Approval not found" }, 404);
255
+ }
256
+ return c.json({
257
+ status: "denied",
258
+ approvalId: approval.id,
259
+ ...(reason !== undefined ? { reason } : {}),
260
+ });
261
+ });
262
+ // ------------------------------------------------------------------
263
+ // Agent manifest endpoint
264
+ // ------------------------------------------------------------------
265
+ app.get("/.well-known/capstan.json", (c) => {
266
+ const manifest = {
267
+ name: config.app?.name ?? "capstan-app",
268
+ title: config.app?.title ?? config.app?.name ?? "Capstan App",
269
+ description: config.app?.description ?? "",
270
+ routes: routeRegistry,
271
+ };
272
+ return c.json(manifest);
273
+ });
274
+ return { app, routeRegistry, registerAPI };
275
+ }
276
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import type { Context as HonoContext } from "hono";
2
+ import type { z } from "zod";
3
+ /** Authentication context attached to every request. */
4
+ export interface CapstanAuthContext {
5
+ isAuthenticated: boolean;
6
+ type: "human" | "agent" | "anonymous";
7
+ userId?: string;
8
+ role?: string;
9
+ email?: string;
10
+ agentId?: string;
11
+ agentName?: string;
12
+ permissions?: string[];
13
+ }
14
+ /** Per-request context threaded through handlers, middleware, and policies. */
15
+ export interface CapstanContext {
16
+ auth: CapstanAuthContext;
17
+ request: Request;
18
+ env: Record<string, string | undefined>;
19
+ honoCtx: HonoContext;
20
+ }
21
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
22
+ /** The argument bag passed to an API handler. */
23
+ export interface APIHandlerInput<T = unknown> {
24
+ input: T;
25
+ ctx: CapstanContext;
26
+ }
27
+ /** Full definition object for a single API route. */
28
+ export interface APIDefinition<TInput = unknown, TOutput = unknown> {
29
+ input?: z.ZodType<TInput>;
30
+ output?: z.ZodType<TOutput>;
31
+ description?: string;
32
+ capability?: "read" | "write" | "external";
33
+ resource?: string;
34
+ policy?: string;
35
+ handler: (args: APIHandlerInput<TInput>) => Promise<TOutput>;
36
+ }
37
+ /** Definition object for middleware. */
38
+ export interface MiddlewareDefinition {
39
+ name?: string;
40
+ handler: (args: {
41
+ request: Request;
42
+ ctx: CapstanContext;
43
+ next: () => Promise<Response>;
44
+ }) => Promise<Response>;
45
+ }
46
+ export type PolicyEffect = "allow" | "deny" | "approve" | "redact";
47
+ /** Result of evaluating a single policy. */
48
+ export interface PolicyCheckResult {
49
+ effect: PolicyEffect;
50
+ reason?: string;
51
+ }
52
+ /** Definition object for a named permission policy. */
53
+ export interface PolicyDefinition {
54
+ key: string;
55
+ title: string;
56
+ effect: PolicyEffect;
57
+ check: (args: {
58
+ ctx: CapstanContext;
59
+ input?: unknown;
60
+ }) => Promise<PolicyCheckResult>;
61
+ }
62
+ /** App-level configuration for a Capstan application. */
63
+ export interface CapstanConfig {
64
+ app?: {
65
+ name?: string;
66
+ title?: string;
67
+ description?: string;
68
+ };
69
+ database?: {
70
+ provider?: "sqlite" | "postgres" | "mysql";
71
+ url?: string;
72
+ };
73
+ auth?: {
74
+ providers?: Array<{
75
+ type: string;
76
+ [key: string]: unknown;
77
+ }>;
78
+ session?: {
79
+ strategy?: "jwt" | "database";
80
+ secret?: string;
81
+ maxAge?: string;
82
+ };
83
+ };
84
+ agent?: {
85
+ manifest?: boolean;
86
+ mcp?: boolean;
87
+ openapi?: boolean;
88
+ rateLimit?: {
89
+ default?: {
90
+ requests: number;
91
+ window: string;
92
+ };
93
+ perAgent?: boolean;
94
+ };
95
+ };
96
+ server?: {
97
+ port?: number;
98
+ host?: string;
99
+ };
100
+ }
101
+ /** Route metadata for the agent manifest system. */
102
+ export interface RouteMetadata {
103
+ method: HttpMethod;
104
+ path: string;
105
+ description?: string;
106
+ capability?: "read" | "write" | "external";
107
+ resource?: string;
108
+ policy?: string;
109
+ inputSchema?: Record<string, unknown>;
110
+ outputSchema?: Record<string, unknown>;
111
+ }
112
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ export interface VerifyDiagnostic {
2
+ code: string;
3
+ severity: "error" | "warning" | "info";
4
+ message: string;
5
+ hint?: string;
6
+ file?: string;
7
+ line?: number;
8
+ column?: number;
9
+ fixCategory?: "type_error" | "schema_mismatch" | "missing_file" | "policy_violation" | "contract_drift" | "missing_export";
10
+ autoFixable?: boolean;
11
+ }
12
+ export interface VerifyStep {
13
+ name: string;
14
+ status: "passed" | "failed" | "skipped";
15
+ durationMs: number;
16
+ diagnostics: VerifyDiagnostic[];
17
+ }
18
+ export interface VerifyReport {
19
+ status: "passed" | "failed";
20
+ appRoot: string;
21
+ timestamp: string;
22
+ steps: VerifyStep[];
23
+ repairChecklist: Array<{
24
+ index: number;
25
+ step: string;
26
+ message: string;
27
+ file?: string;
28
+ line?: number;
29
+ hint?: string;
30
+ fixCategory?: string;
31
+ autoFixable?: boolean;
32
+ }>;
33
+ summary: {
34
+ totalSteps: number;
35
+ passedSteps: number;
36
+ failedSteps: number;
37
+ skippedSteps: number;
38
+ errorCount: number;
39
+ warningCount: number;
40
+ };
41
+ }
42
+ /**
43
+ * Verify a Capstan runtime application.
44
+ *
45
+ * Runs a cascade of checks: structure -> config -> routes -> models ->
46
+ * typecheck -> contracts -> manifest. If an early step fails, dependent
47
+ * steps are skipped. Returns a structured VerifyReport suitable for both
48
+ * human display and AI agent consumption.
49
+ */
50
+ export declare function verifyCapstanApp(appRoot: string): Promise<VerifyReport>;
51
+ /**
52
+ * Render a VerifyReport as human-readable text output.
53
+ *
54
+ * Uses simple ASCII indicators: check mark for pass, x for fail, dash for skip.
55
+ */
56
+ export declare function renderRuntimeVerifyText(report: VerifyReport): string;
57
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EACR,YAAY,GACZ,iBAAiB,GACjB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,KAAK,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC,CAAC;IACH,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAuyBD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuE7E;AAMD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4CpE"}