@openape/apes 1.9.0 → 1.11.0

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/index.d.ts CHANGED
@@ -348,4 +348,92 @@ declare class CliExit extends Error {
348
348
  constructor(exitCode?: number);
349
349
  }
350
350
 
351
- export { type AdapterMeta, type ApesConfig, ApiError, type AuthData, type BuiltGrantRequest, CliError, CliExit, type GrantRequestOptions, type LoadedAdapter, type RegistryEntry, type RegistryIndex, type ResolvedCapability, type ResolvedCommand, type ShapesAdapter, type ShapesOperation, apiFetch, appendAuditLog, buildExactCommandGrantRequest, buildStructuredCliGrantRequest, clearAuth, createShapesGrant, discoverEndpoints, extractOption, extractShellCommandString, extractWrappedCommand, fetchGrantToken, fetchRegistry, findAdapter, findConflictingAdapters, findExistingGrant, getAuthToken, getIdpUrl, getInstalledDigest, getRequesterIdentity, installAdapter, isInstalled, loadAdapter, loadAuth, loadConfig, loadOrInstallAdapter, parseDuration, parseShellCommand, removeAdapter, resolveAdapterPath, resolveCapabilityRequest, resolveCommand, saveAuth, saveConfig, searchAdapters, tryLoadAdapter, verifyAndExecute, waitForGrantStatus };
351
+ interface ToolDefinition {
352
+ name: string;
353
+ description: string;
354
+ parameters: Record<string, unknown>;
355
+ execute: (args: unknown) => Promise<unknown>;
356
+ }
357
+ declare const TOOLS: Record<string, ToolDefinition>;
358
+ /**
359
+ * Resolve a task spec's tool name list to ToolDefinitions. Throws on
360
+ * unknown names — callers must surface that as a run-failure with a
361
+ * clear "unknown tool: foo" final_message so the owner can see what
362
+ * went wrong in the SP UI.
363
+ */
364
+ declare function taskTools(names: string[]): ToolDefinition[];
365
+
366
+ interface ChatMessage {
367
+ role: 'system' | 'user' | 'assistant' | 'tool';
368
+ content: string | null;
369
+ tool_calls?: Array<{
370
+ id: string;
371
+ type: 'function';
372
+ function: {
373
+ name: string;
374
+ arguments: string;
375
+ };
376
+ }>;
377
+ tool_call_id?: string;
378
+ name?: string;
379
+ }
380
+ interface RuntimeConfig {
381
+ apiBase: string;
382
+ apiKey: string;
383
+ model: string;
384
+ }
385
+ interface TraceEntry {
386
+ step: number;
387
+ type: 'assistant' | 'tool_call' | 'tool_result' | 'tool_error';
388
+ preview: string;
389
+ tool?: string;
390
+ }
391
+ interface RunResult {
392
+ status: 'ok' | 'error';
393
+ finalMessage: string | null;
394
+ stepCount: number;
395
+ trace: TraceEntry[];
396
+ }
397
+ interface RunStreamHandlers {
398
+ onTextDelta?: (delta: string) => void;
399
+ onToolCall?: (call: {
400
+ name: string;
401
+ args: unknown;
402
+ }) => void;
403
+ onToolResult?: (result: {
404
+ name: string;
405
+ result: unknown;
406
+ }) => void;
407
+ onToolError?: (err: {
408
+ name: string;
409
+ error: string;
410
+ }) => void;
411
+ onDone?: (result: RunResult) => void;
412
+ }
413
+ interface RunOptions {
414
+ config: RuntimeConfig;
415
+ systemPrompt: string;
416
+ userMessage: string;
417
+ tools: ToolDefinition[];
418
+ maxSteps: number;
419
+ history?: ChatMessage[];
420
+ handlers?: RunStreamHandlers;
421
+ fetchImpl?: typeof fetch;
422
+ }
423
+ declare function runLoop(opts: RunOptions): Promise<RunResult>;
424
+ interface RpcSession {
425
+ messages: ChatMessage[];
426
+ systemPrompt: string;
427
+ tools: ToolDefinition[];
428
+ maxSteps: number;
429
+ lastTouched: number;
430
+ }
431
+ declare class RpcSessionMap {
432
+ private sessions;
433
+ get(id: string): RpcSession | undefined;
434
+ put(id: string, s: RpcSession): void;
435
+ evictStale(): void;
436
+ size(): number;
437
+ }
438
+
439
+ export { type AdapterMeta, type ApesConfig, ApiError, type AuthData, type BuiltGrantRequest, type ChatMessage, CliError, CliExit, type GrantRequestOptions, type LoadedAdapter, type RegistryEntry, type RegistryIndex, type ResolvedCapability, type ResolvedCommand, RpcSessionMap, type RunOptions, type RunResult, type RunStreamHandlers, type RuntimeConfig, type ShapesAdapter, type ShapesOperation, TOOLS, type ToolDefinition, type TraceEntry, apiFetch, appendAuditLog, buildExactCommandGrantRequest, buildStructuredCliGrantRequest, clearAuth, createShapesGrant, discoverEndpoints, extractOption, extractShellCommandString, extractWrappedCommand, fetchGrantToken, fetchRegistry, findAdapter, findConflictingAdapters, findExistingGrant, getAuthToken, getIdpUrl, getInstalledDigest, getRequesterIdentity, installAdapter, isInstalled, loadAdapter, loadAuth, loadConfig, loadOrInstallAdapter, parseDuration, parseShellCommand, removeAdapter, resolveAdapterPath, resolveCapabilityRequest, resolveCommand, runLoop, saveAuth, saveConfig, searchAdapters, taskTools, tryLoadAdapter, verifyAndExecute, waitForGrantStatus };
package/dist/index.js CHANGED
@@ -2,8 +2,12 @@
2
2
  import {
3
3
  CliError,
4
4
  CliExit,
5
- parseDuration
6
- } from "./chunk-ZSJU7IXE.js";
5
+ RpcSessionMap,
6
+ TOOLS,
7
+ parseDuration,
8
+ runLoop,
9
+ taskTools
10
+ } from "./chunk-TDSCDH5P.js";
7
11
  import {
8
12
  appendAuditLog,
9
13
  buildExactCommandGrantRequest,
@@ -52,6 +56,8 @@ export {
52
56
  ApiError,
53
57
  CliError,
54
58
  CliExit,
59
+ RpcSessionMap,
60
+ TOOLS,
55
61
  apiFetch,
56
62
  appendAuditLog,
57
63
  buildExactCommandGrantRequest,
@@ -83,9 +89,11 @@ export {
83
89
  resolveAdapterPath,
84
90
  resolveCapabilityRequest,
85
91
  resolveCommand,
92
+ runLoop,
86
93
  saveAuth,
87
94
  saveConfig,
88
95
  searchAdapters,
96
+ taskTools,
89
97
  tryLoadAdapter,
90
98
  verifyAndExecute,
91
99
  waitForGrantStatus
@@ -304,7 +304,7 @@ function registerAdapterTools(server) {
304
304
  async function startMcpServer(transport, port) {
305
305
  const server = new McpServer({
306
306
  name: "apes",
307
- version: true ? "1.9.0" : "0.1.0"
307
+ version: true ? "1.11.0" : "0.1.0"
308
308
  });
309
309
  registerStaticTools(server);
310
310
  registerAdapterTools(server);
@@ -332,4 +332,4 @@ async function startMcpServer(transport, port) {
332
332
  export {
333
333
  startMcpServer
334
334
  };
335
- //# sourceMappingURL=server-6WQYPDVO.js.map
335
+ //# sourceMappingURL=server-F3ALNNYS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/mcp/server.ts","../src/commands/mcp/tools.ts","../src/commands/mcp/adapter-tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\nimport { createServer } from 'node:http'\nimport consola from 'consola'\nimport { registerAdapterTools, registerStaticTools } from './tools'\n\ndeclare const __VERSION__: string\n\nexport async function startMcpServer(transport: 'stdio' | 'sse', port: number) {\n const server = new McpServer({\n name: 'apes',\n version: typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.1.0',\n })\n\n // Register static tools\n registerStaticTools(server)\n\n // Register adapter-derived tools\n registerAdapterTools(server)\n\n if (transport === 'stdio') {\n const stdioTransport = new StdioServerTransport()\n await server.connect(stdioTransport)\n }\n else if (transport === 'sse') {\n const httpServer = createServer(async (req, res) => {\n if (req.url === '/sse' && req.method === 'GET') {\n const sseTransport = new SSEServerTransport('/messages', res)\n await server.connect(sseTransport)\n }\n else if (req.url === '/messages' && req.method === 'POST') {\n // SSE message handling is done by the transport\n res.writeHead(200)\n res.end()\n }\n else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n httpServer.listen(port, () => {\n consola.info(`MCP SSE server listening on http://localhost:${port}/sse`)\n })\n }\n}\n","import { hostname } from 'node:os'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport {\n createShapesGrant,\n fetchGrantToken,\n loadAdapter,\n resolveCommand,\n verifyAndExecute,\n} from '../../shapes/index.js'\nimport { z } from 'zod'\nimport { getAuthToken, getIdpUrl, getRequesterIdentity } from '../../config'\nimport { apiFetch, getGrantsEndpoint } from '../../http'\nimport { loadAdapterTools } from './adapter-tools'\n\nexport function registerStaticTools(server: McpServer) {\n server.registerTool('apes.grants.list', {\n description: 'List grants',\n inputSchema: {\n status: z.string().optional().describe('Filter by status: pending, approved, denied, revoked, used'),\n limit: z.string().optional().describe('Max results'),\n },\n }, async ({ status, limit }) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const params = new URLSearchParams()\n if (status)\n params.set('status', status)\n if (limit)\n params.set('limit', limit)\n const query = params.toString() ? `?${params.toString()}` : ''\n const response = await apiFetch(`${grantsUrl}${query}`)\n return { content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }] }\n })\n\n server.registerTool('apes.grants.request', {\n description: 'Request a grant for a command',\n inputSchema: {\n command: z.string().describe('Command to request permission for'),\n audience: z.string().describe('Service identifier (e.g. escapes, proxy, shapes)'),\n approval: z.string().optional().describe('once, timed, or always'),\n reason: z.string().optional().describe('Reason for the request'),\n },\n }, async ({ command, audience, approval, reason }) => {\n const idp = getIdpUrl()\n const requester = getRequesterIdentity()\n if (!idp || !requester)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const cmdParts = command.split(' ')\n const grant = await apiFetch<{ id: string, status: string }>(grantsUrl, {\n method: 'POST',\n body: {\n requester,\n target_host: hostname(),\n audience,\n grant_type: approval || 'once',\n command: cmdParts,\n reason: reason || command,\n },\n })\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve via URL or `apes grants approve <id>`, then retry with grant_id.',\n }, null, 2),\n }],\n }\n })\n\n server.registerTool('apes.config.get', {\n description: 'Get apes configuration value',\n inputSchema: {\n key: z.string().describe('Config key: idp, email'),\n },\n }, ({ key }) => {\n if (key === 'idp') {\n const idp = getIdpUrl()\n return { content: [{ type: 'text' as const, text: idp || 'Not configured' }] }\n }\n if (key === 'email') {\n const email = getRequesterIdentity()\n return { content: [{ type: 'text' as const, text: email || 'Not logged in' }] }\n }\n return { content: [{ type: 'text' as const, text: `Unknown key: ${key}` }] }\n })\n\n server.registerTool('apes.explain', {\n description: 'Show what permissions a command would need',\n inputSchema: {\n command: z.array(z.string()).describe('Command as array of strings (e.g. [\"gh\", \"repo\", \"list\"])'),\n adapter: z.string().optional().describe('Explicit adapter TOML path'),\n },\n }, async ({ command, adapter }) => {\n try {\n const loaded = loadAdapter(command[0]!, adapter)\n const resolved = await resolveCommand(loaded, command)\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n adapter: resolved.adapter.cli.id,\n operation: resolved.detail.operation_id,\n display: resolved.detail.display,\n permission: resolved.permission,\n resource_chain: resolved.detail.resource_chain,\n exact_command: resolved.detail.constraints?.exact_command ?? false,\n adapter_digest: resolved.digest,\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n\n server.registerTool('apes.adapter.list', {\n description: 'List installed CLI adapters',\n }, () => {\n const tools = loadAdapterTools()\n const adapters = [...new Set(tools.map(t => t.adapterId))]\n return {\n content: [{\n type: 'text' as const,\n text: adapters.length > 0\n ? `Installed adapters: ${adapters.join(', ')}`\n : 'No adapters installed.',\n }],\n }\n })\n\n server.registerTool('apes.fetch', {\n description: 'Make an authenticated HTTP request',\n inputSchema: {\n method: z.string().describe('HTTP method (GET, POST, PUT, DELETE)'),\n url: z.string().describe('URL to fetch'),\n body: z.string().optional().describe('Request body (JSON string)'),\n },\n }, async ({ method, url, body }) => {\n const token = getAuthToken()\n if (!token)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }], isError: true }\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: body || undefined,\n })\n const text = await response.text()\n try {\n return { content: [{ type: 'text' as const, text: JSON.stringify(JSON.parse(text), null, 2) }] }\n }\n catch {\n return { content: [{ type: 'text' as const, text }] }\n }\n })\n}\n\nexport function registerAdapterTools(server: McpServer) {\n const adapterTools = loadAdapterTools()\n\n for (const tool of adapterTools) {\n // Build Zod schema from adapter operation\n const schemaShape: Record<string, z.ZodType> = {\n grant_id: z.string().optional().describe('Grant ID from a previous pending_approval response'),\n }\n\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n const props = (tool.inputSchema as { properties?: Record<string, { description?: string }> }).properties\n if (props) {\n for (const [key, val] of Object.entries(props)) {\n schemaShape[key] = z.string().optional().describe(val.description || key)\n }\n }\n }\n\n server.registerTool(tool.name, {\n description: tool.description,\n inputSchema: schemaShape,\n }, async (args) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }], isError: true }\n\n try {\n const loaded = loadAdapter(tool.adapterId)\n const op = loaded.adapter.operations.find(o => o.id === tool.operationId)\n if (!op)\n return { content: [{ type: 'text' as const, text: `Operation ${tool.operationId} not found` }], isError: true }\n\n const argv = [loaded.adapter.cli.executable, ...op.command]\n if (op.positionals) {\n for (const pos of op.positionals) {\n if (args[pos])\n argv.push(String(args[pos]))\n }\n }\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n if (args[name])\n argv.push(opt, String(args[name]))\n }\n }\n\n const resolved = await resolveCommand(loaded, argv)\n\n if (args.grant_id) {\n const token = await fetchGrantToken(idp, String(args.grant_id))\n await verifyAndExecute(token, resolved)\n return { content: [{ type: 'text' as const, text: 'Command executed successfully.' }] }\n }\n\n const grant = await createShapesGrant(resolved, { idp, approval: 'once' })\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve, then call this tool again with grant_id.',\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n }\n}\n","import { readdirSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { loadAdapter } from '../../shapes/index.js'\nimport type { ShapesOperation } from '../../shapes/index.js'\n\nexport interface AdapterToolDef {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n adapterId: string\n operationId: string\n}\n\nfunction operationToInputSchema(op: ShapesOperation): Record<string, unknown> {\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n\n if (op.positionals) {\n for (const pos of op.positionals) {\n properties[pos] = { type: 'string', description: `Positional argument: ${pos}` }\n required.push(pos)\n }\n }\n\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n properties[name] = { type: 'string', description: `Required option: ${opt}` }\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n }\n}\n\nfunction scanAdapterDir(dir: string): string[] {\n try {\n return readdirSync(dir)\n .filter(f => f.endsWith('.toml'))\n .map(f => f.replace('.toml', ''))\n }\n catch {\n return []\n }\n}\n\nexport function loadAdapterTools(): AdapterToolDef[] {\n const tools: AdapterToolDef[] = []\n const seen = new Set<string>()\n\n const adapterDirs = [\n join(process.cwd(), '.openape', 'shapes', 'adapters'),\n join(homedir(), '.openape', 'shapes', 'adapters'),\n '/etc/openape/shapes/adapters',\n ]\n\n for (const dir of adapterDirs) {\n for (const id of scanAdapterDir(dir)) {\n if (seen.has(id))\n continue\n seen.add(id)\n\n try {\n const loaded = loadAdapter(id)\n for (const op of loaded.adapter.operations) {\n tools.push({\n name: `apes.run.${id}.${op.id}`,\n description: op.display || `${id}: ${op.id}`,\n inputSchema: operationToInputSchema(op),\n adapterId: id,\n operationId: op.id,\n })\n }\n }\n catch {\n // Skip adapters that fail to load\n }\n }\n }\n\n return tools\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/mcp/server.ts","../src/commands/mcp/tools.ts","../src/commands/mcp/adapter-tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\nimport { createServer } from 'node:http'\nimport consola from 'consola'\nimport { registerAdapterTools, registerStaticTools } from './tools'\n\ndeclare const __VERSION__: string\n\nexport async function startMcpServer(transport: 'stdio' | 'sse', port: number) {\n const server = new McpServer({\n name: 'apes',\n version: typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.1.0',\n })\n\n // Register static tools\n registerStaticTools(server)\n\n // Register adapter-derived tools\n registerAdapterTools(server)\n\n if (transport === 'stdio') {\n const stdioTransport = new StdioServerTransport()\n await server.connect(stdioTransport)\n }\n else if (transport === 'sse') {\n const httpServer = createServer(async (req, res) => {\n if (req.url === '/sse' && req.method === 'GET') {\n const sseTransport = new SSEServerTransport('/messages', res)\n await server.connect(sseTransport)\n }\n else if (req.url === '/messages' && req.method === 'POST') {\n // SSE message handling is done by the transport\n res.writeHead(200)\n res.end()\n }\n else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n httpServer.listen(port, () => {\n consola.info(`MCP SSE server listening on http://localhost:${port}/sse`)\n })\n }\n}\n","import { hostname } from 'node:os'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport {\n createShapesGrant,\n fetchGrantToken,\n loadAdapter,\n resolveCommand,\n verifyAndExecute,\n} from '../../shapes/index.js'\nimport { z } from 'zod'\nimport { getAuthToken, getIdpUrl, getRequesterIdentity } from '../../config'\nimport { apiFetch, getGrantsEndpoint } from '../../http'\nimport { loadAdapterTools } from './adapter-tools'\n\nexport function registerStaticTools(server: McpServer) {\n server.registerTool('apes.grants.list', {\n description: 'List grants',\n inputSchema: {\n status: z.string().optional().describe('Filter by status: pending, approved, denied, revoked, used'),\n limit: z.string().optional().describe('Max results'),\n },\n }, async ({ status, limit }) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const params = new URLSearchParams()\n if (status)\n params.set('status', status)\n if (limit)\n params.set('limit', limit)\n const query = params.toString() ? `?${params.toString()}` : ''\n const response = await apiFetch(`${grantsUrl}${query}`)\n return { content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }] }\n })\n\n server.registerTool('apes.grants.request', {\n description: 'Request a grant for a command',\n inputSchema: {\n command: z.string().describe('Command to request permission for'),\n audience: z.string().describe('Service identifier (e.g. escapes, proxy, shapes)'),\n approval: z.string().optional().describe('once, timed, or always'),\n reason: z.string().optional().describe('Reason for the request'),\n },\n }, async ({ command, audience, approval, reason }) => {\n const idp = getIdpUrl()\n const requester = getRequesterIdentity()\n if (!idp || !requester)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }] }\n\n const grantsUrl = await getGrantsEndpoint(idp)\n const cmdParts = command.split(' ')\n const grant = await apiFetch<{ id: string, status: string }>(grantsUrl, {\n method: 'POST',\n body: {\n requester,\n target_host: hostname(),\n audience,\n grant_type: approval || 'once',\n command: cmdParts,\n reason: reason || command,\n },\n })\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve via URL or `apes grants approve <id>`, then retry with grant_id.',\n }, null, 2),\n }],\n }\n })\n\n server.registerTool('apes.config.get', {\n description: 'Get apes configuration value',\n inputSchema: {\n key: z.string().describe('Config key: idp, email'),\n },\n }, ({ key }) => {\n if (key === 'idp') {\n const idp = getIdpUrl()\n return { content: [{ type: 'text' as const, text: idp || 'Not configured' }] }\n }\n if (key === 'email') {\n const email = getRequesterIdentity()\n return { content: [{ type: 'text' as const, text: email || 'Not logged in' }] }\n }\n return { content: [{ type: 'text' as const, text: `Unknown key: ${key}` }] }\n })\n\n server.registerTool('apes.explain', {\n description: 'Show what permissions a command would need',\n inputSchema: {\n command: z.array(z.string()).describe('Command as array of strings (e.g. [\"gh\", \"repo\", \"list\"])'),\n adapter: z.string().optional().describe('Explicit adapter TOML path'),\n },\n }, async ({ command, adapter }) => {\n try {\n const loaded = loadAdapter(command[0]!, adapter)\n const resolved = await resolveCommand(loaded, command)\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n adapter: resolved.adapter.cli.id,\n operation: resolved.detail.operation_id,\n display: resolved.detail.display,\n permission: resolved.permission,\n resource_chain: resolved.detail.resource_chain,\n exact_command: resolved.detail.constraints?.exact_command ?? false,\n adapter_digest: resolved.digest,\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n\n server.registerTool('apes.adapter.list', {\n description: 'List installed CLI adapters',\n }, () => {\n const tools = loadAdapterTools()\n const adapters = [...new Set(tools.map(t => t.adapterId))]\n return {\n content: [{\n type: 'text' as const,\n text: adapters.length > 0\n ? `Installed adapters: ${adapters.join(', ')}`\n : 'No adapters installed.',\n }],\n }\n })\n\n server.registerTool('apes.fetch', {\n description: 'Make an authenticated HTTP request',\n inputSchema: {\n method: z.string().describe('HTTP method (GET, POST, PUT, DELETE)'),\n url: z.string().describe('URL to fetch'),\n body: z.string().optional().describe('Request body (JSON string)'),\n },\n }, async ({ method, url, body }) => {\n const token = getAuthToken()\n if (!token)\n return { content: [{ type: 'text' as const, text: 'Not authenticated. Run `apes login` first.' }], isError: true }\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: body || undefined,\n })\n const text = await response.text()\n try {\n return { content: [{ type: 'text' as const, text: JSON.stringify(JSON.parse(text), null, 2) }] }\n }\n catch {\n return { content: [{ type: 'text' as const, text }] }\n }\n })\n}\n\nexport function registerAdapterTools(server: McpServer) {\n const adapterTools = loadAdapterTools()\n\n for (const tool of adapterTools) {\n // Build Zod schema from adapter operation\n const schemaShape: Record<string, z.ZodType> = {\n grant_id: z.string().optional().describe('Grant ID from a previous pending_approval response'),\n }\n\n if (tool.inputSchema && typeof tool.inputSchema === 'object') {\n const props = (tool.inputSchema as { properties?: Record<string, { description?: string }> }).properties\n if (props) {\n for (const [key, val] of Object.entries(props)) {\n schemaShape[key] = z.string().optional().describe(val.description || key)\n }\n }\n }\n\n server.registerTool(tool.name, {\n description: tool.description,\n inputSchema: schemaShape,\n }, async (args) => {\n const idp = getIdpUrl()\n if (!idp)\n return { content: [{ type: 'text' as const, text: 'Not configured. Run `apes login` first.' }], isError: true }\n\n try {\n const loaded = loadAdapter(tool.adapterId)\n const op = loaded.adapter.operations.find(o => o.id === tool.operationId)\n if (!op)\n return { content: [{ type: 'text' as const, text: `Operation ${tool.operationId} not found` }], isError: true }\n\n const argv = [loaded.adapter.cli.executable, ...op.command]\n if (op.positionals) {\n for (const pos of op.positionals) {\n if (args[pos])\n argv.push(String(args[pos]))\n }\n }\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n if (args[name])\n argv.push(opt, String(args[name]))\n }\n }\n\n const resolved = await resolveCommand(loaded, argv)\n\n if (args.grant_id) {\n const token = await fetchGrantToken(idp, String(args.grant_id))\n await verifyAndExecute(token, resolved)\n return { content: [{ type: 'text' as const, text: 'Command executed successfully.' }] }\n }\n\n const grant = await createShapesGrant(resolved, { idp, approval: 'once' })\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n status: 'pending_approval',\n grant_id: grant.id,\n approve_url: `${idp}/grant-approval?grant_id=${grant.id}`,\n message: 'Grant needs approval. Approve, then call this tool again with grant_id.',\n }, null, 2),\n }],\n }\n }\n catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true }\n }\n })\n }\n}\n","import { readdirSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { loadAdapter } from '../../shapes/index.js'\nimport type { ShapesOperation } from '../../shapes/index.js'\n\nexport interface AdapterToolDef {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n adapterId: string\n operationId: string\n}\n\nfunction operationToInputSchema(op: ShapesOperation): Record<string, unknown> {\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n\n if (op.positionals) {\n for (const pos of op.positionals) {\n properties[pos] = { type: 'string', description: `Positional argument: ${pos}` }\n required.push(pos)\n }\n }\n\n if (op.required_options) {\n for (const opt of op.required_options) {\n const name = opt.replace(/^--/, '')\n properties[name] = { type: 'string', description: `Required option: ${opt}` }\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n }\n}\n\nfunction scanAdapterDir(dir: string): string[] {\n try {\n return readdirSync(dir)\n .filter(f => f.endsWith('.toml'))\n .map(f => f.replace('.toml', ''))\n }\n catch {\n return []\n }\n}\n\nexport function loadAdapterTools(): AdapterToolDef[] {\n const tools: AdapterToolDef[] = []\n const seen = new Set<string>()\n\n const adapterDirs = [\n join(process.cwd(), '.openape', 'shapes', 'adapters'),\n join(homedir(), '.openape', 'shapes', 'adapters'),\n '/etc/openape/shapes/adapters',\n ]\n\n for (const dir of adapterDirs) {\n for (const id of scanAdapterDir(dir)) {\n if (seen.has(id))\n continue\n seen.add(id)\n\n try {\n const loaded = loadAdapter(id)\n for (const op of loaded.adapter.operations) {\n tools.push({\n name: `apes.run.${id}.${op.id}`,\n description: op.display || `${id}: ${op.id}`,\n inputSchema: operationToInputSchema(op),\n adapterId: id,\n operationId: op.id,\n })\n }\n }\n catch {\n // Skip adapters that fail to load\n }\n }\n }\n\n return tools\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openape/apes",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "turbo": {
5
5
  "tags": [
6
6
  "publishable"
@@ -1,45 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/errors.ts
4
- var CliError = class extends Error {
5
- constructor(message, exitCode = 1) {
6
- super(message);
7
- this.exitCode = exitCode;
8
- this.name = "CliError";
9
- }
10
- };
11
- var CliExit = class extends Error {
12
- constructor(exitCode = 0) {
13
- super("");
14
- this.exitCode = exitCode;
15
- this.name = "CliExit";
16
- }
17
- };
18
-
19
- // src/duration.ts
20
- function parseDuration(value) {
21
- const match = value.match(/^(\d+)\s*([smhd])$/);
22
- if (!match) {
23
- throw new Error(`Invalid duration format: "${value}". Use e.g. 30m, 1h, 7d`);
24
- }
25
- const amount = Number.parseInt(match[1], 10);
26
- switch (match[2]) {
27
- case "s":
28
- return amount;
29
- case "m":
30
- return amount * 60;
31
- case "h":
32
- return amount * 3600;
33
- case "d":
34
- return amount * 86400;
35
- default:
36
- throw new Error(`Unknown duration unit: ${match[2]}`);
37
- }
38
- }
39
-
40
- export {
41
- CliError,
42
- CliExit,
43
- parseDuration
44
- };
45
- //# sourceMappingURL=chunk-ZSJU7IXE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/duration.ts"],"sourcesContent":["export class CliError extends Error {\n constructor(message: string, public exitCode: number = 1) {\n super(message)\n this.name = 'CliError'\n }\n}\n\nexport class CliExit extends Error {\n constructor(public exitCode: number = 0) {\n super('')\n this.name = 'CliExit'\n }\n}\n","/**\n * Parse a human-readable duration string into seconds.\n * Supported formats: 30s, 5m, 1h, 7d\n */\nexport function parseDuration(value: string): number {\n const match = value.match(/^(\\d+)\\s*([smhd])$/)\n if (!match) {\n throw new Error(`Invalid duration format: \"${value}\". Use e.g. 30m, 1h, 7d`)\n }\n const amount = Number.parseInt(match[1]!, 10)\n switch (match[2]) {\n case 's': return amount\n case 'm': return amount * 60\n case 'h': return amount * 3600\n case 'd': return amount * 86400\n default: throw new Error(`Unknown duration unit: ${match[2]}`)\n }\n}\n"],"mappings":";;;AAAO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAwB,WAAmB,GAAG;AACxD,UAAM,OAAO;AADqB;AAElC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,UAAN,cAAsB,MAAM;AAAA,EACjC,YAAmB,WAAmB,GAAG;AACvC,UAAM,EAAE;AADS;AAEjB,SAAK,OAAO;AAAA,EACd;AACF;;;ACRO,SAAS,cAAc,OAAuB;AACnD,QAAM,QAAQ,MAAM,MAAM,oBAAoB;AAC9C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,6BAA6B,KAAK,yBAAyB;AAAA,EAC7E;AACA,QAAM,SAAS,OAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AAC5C,UAAQ,MAAM,CAAC,GAAG;AAAA,IAChB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO,SAAS;AAAA,IAC1B,KAAK;AAAK,aAAO,SAAS;AAAA,IAC1B,KAAK;AAAK,aAAO,SAAS;AAAA,IAC1B;AAAS,YAAM,IAAI,MAAM,0BAA0B,MAAM,CAAC,CAAC,EAAE;AAAA,EAC/D;AACF;","names":[]}