@openvole/paw-sdk 3.0.0 → 3.1.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
@@ -142,6 +142,15 @@ declare function createIpcTransport(): {
142
142
  request(method: string, params?: unknown): Promise<unknown>;
143
143
  /** Subscribe to bus events from the core */
144
144
  subscribe(events: string[]): void;
145
+ /**
146
+ * Emit a bus event into the core.
147
+ *
148
+ * Core publishes only the `channel:*` namespace — events that carry no authority, so a
149
+ * sandboxed Paw cannot forge `task:completed` and drive core's own subscribers. Anything
150
+ * else is logged and dropped. Fire-and-forget: the core stamps the emitting Paw's name onto
151
+ * the payload, so provenance never comes from here.
152
+ */
153
+ emit(event: string, data?: unknown): void;
145
154
  /** Query core state (tools, paws, skills, tasks) */
146
155
  query(type: "tools" | "paws" | "skills" | "tasks"): Promise<unknown>;
147
156
  /** Register a handler for forwarded bus events */
package/dist/index.js CHANGED
@@ -65,6 +65,17 @@ function _createIpcTransport() {
65
65
  subscribe(events) {
66
66
  process.send({ jsonrpc: "2.0", method: "subscribe", params: { events } });
67
67
  },
68
+ /**
69
+ * Emit a bus event into the core.
70
+ *
71
+ * Core publishes only the `channel:*` namespace — events that carry no authority, so a
72
+ * sandboxed Paw cannot forge `task:completed` and drive core's own subscribers. Anything
73
+ * else is logged and dropped. Fire-and-forget: the core stamps the emitting Paw's name onto
74
+ * the payload, so provenance never comes from here.
75
+ */
76
+ emit(event, data) {
77
+ process.send({ jsonrpc: "2.0", method: "emit", params: { event, data } });
78
+ },
68
79
  /** Query core state (tools, paws, skills, tasks) */
69
80
  async query(type) {
70
81
  const id = crypto.randomUUID();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/define.ts","../src/index.ts"],"sourcesContent":["/** JSON-RPC 2.0 message */\ninterface IpcMessage {\n\tjsonrpc: '2.0'\n\tid?: string\n\tmethod?: string\n\tparams?: unknown\n\tresult?: unknown\n\terror?: { code: number; message: string; data?: unknown }\n}\n\ntype RequestHandler = (params: unknown) => Promise<unknown>\n\nlet ipcSingleton: ReturnType<typeof _createIpcTransport> | undefined\n\n/** Create an IPC transport for Node.js Paw subprocesses (singleton — reuses the same instance) */\nexport function createIpcTransport() {\n\tif (ipcSingleton) return ipcSingleton\n\tipcSingleton = _createIpcTransport()\n\treturn ipcSingleton\n}\n\nfunction _createIpcTransport() {\n\tconst handlers = new Map<string, RequestHandler>()\n\n\t// Increase max listeners — concurrent query/request calls each add a temporary listener\n\tprocess.setMaxListeners(Math.max(process.getMaxListeners(), 25))\n\n\t// Listen for incoming messages from the core\n\tprocess.on('message', async (msg: IpcMessage) => {\n\t\tif (!msg.method) return\n\n\t\tconst handler = handlers.get(msg.method)\n\t\tif (handler) {\n\t\t\ttry {\n\t\t\t\tconst result = await handler(msg.params)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tprocess.send!({ jsonrpc: '2.0', id: msg.id, result })\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tprocess.send!({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\terror: { code: -32603, message },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\treturn {\n\t\t/** Register a handler for a method called by the core */\n\t\tonRequest(method: string, handler: RequestHandler): void {\n\t\t\thandlers.set(method, handler)\n\t\t},\n\n\t\t/** Send a notification to the core (no response expected) */\n\t\tsend(method: string, params?: unknown): void {\n\t\t\tprocess.send!({ jsonrpc: '2.0', method, params })\n\t\t},\n\n\t\t/** Send a request to the core and wait for a response */\n\t\tasync request(method: string, params?: unknown): Promise<unknown> {\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = { jsonrpc: '2.0', id, method, params }\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Request \"${method}\" timed out`))\n\t\t\t\t}, 30_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\n\t\t/** Subscribe to bus events from the core */\n\t\tsubscribe(events: string[]): void {\n\t\t\tprocess.send!({ jsonrpc: '2.0', method: 'subscribe', params: { events } })\n\t\t},\n\n\t\t/** Query core state (tools, paws, skills, tasks) */\n\t\tasync query(type: 'tools' | 'paws' | 'skills' | 'tasks'): Promise<unknown> {\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = { jsonrpc: '2.0', id, method: 'query', params: { type } }\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Query \"${type}\" timed out`))\n\t\t\t\t}, 10_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\n\t\t/** Register a handler for forwarded bus events */\n\t\tonBusEvent(handler: (event: string, data: unknown) => void): void {\n\t\t\thandlers.set('bus_event', async (params) => {\n\t\t\t\tconst { event, data } = params as { event: string; data: unknown }\n\t\t\t\thandler(event, data)\n\t\t\t\treturn { ok: true }\n\t\t\t})\n\t\t},\n\n\t\t/** Create a task in the core's task queue (for channel Paws that receive inbound messages) */\n\t\tasync createTask(\n\t\t\tinput: string,\n\t\t\tmetadata?: Record<string, unknown> & { sessionId?: string },\n\t\t): Promise<{ taskId: string }> {\n\t\t\tconst { sessionId, ...rest } = metadata ?? {}\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = {\n\t\t\t\tjsonrpc: '2.0',\n\t\t\t\tid,\n\t\t\t\tmethod: 'create_task',\n\t\t\t\tparams: { input, source: 'paw', sessionId, metadata: rest },\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error('createTask timed out'))\n\t\t\t\t}, 10_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result as { taskId: string })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\t}\n}\n\n/** Create a stdio transport for non-Node Paw processes (LSP-style framing) */\nexport function createStdioTransport() {\n\tconst handlers = new Map<string, RequestHandler>()\n\tlet buffer = ''\n\n\tprocess.stdin.setEncoding('utf-8')\n\tprocess.stdin.on('data', (chunk: string) => {\n\t\tbuffer += chunk\n\t\tprocessBuffer()\n\t})\n\n\tasync function processBuffer(): Promise<void> {\n\t\twhile (buffer.length > 0) {\n\t\t\tconst headerEnd = buffer.indexOf('\\r\\n\\r\\n')\n\t\t\tif (headerEnd === -1) break\n\n\t\t\tconst header = buffer.substring(0, headerEnd)\n\t\t\tconst match = header.match(/Content-Length:\\s*(\\d+)/i)\n\t\t\tif (!match) {\n\t\t\t\tbuffer = buffer.substring(headerEnd + 4)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst contentLength = Number.parseInt(match[1], 10)\n\t\t\tconst bodyStart = headerEnd + 4\n\t\t\tif (buffer.length < bodyStart + contentLength) break\n\n\t\t\tconst body = buffer.substring(bodyStart, bodyStart + contentLength)\n\t\t\tbuffer = buffer.substring(bodyStart + contentLength)\n\n\t\t\ttry {\n\t\t\t\tconst msg = JSON.parse(body) as IpcMessage\n\t\t\t\tawait handleMessage(msg)\n\t\t\t} catch {\n\t\t\t\t// Skip malformed messages\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function handleMessage(msg: IpcMessage): Promise<void> {\n\t\tif (!msg.method) return\n\n\t\tconst handler = handlers.get(msg.method)\n\t\tif (handler) {\n\t\t\ttry {\n\t\t\t\tconst result = await handler(msg.params)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tsend({ jsonrpc: '2.0', id: msg.id, result })\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tsend({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\terror: { code: -32603, message },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction send(message: IpcMessage): void {\n\t\tconst json = JSON.stringify(message)\n\t\tconst header = `Content-Length: ${Buffer.byteLength(json)}\\r\\n\\r\\n`\n\t\tprocess.stdout.write(header + json)\n\t}\n\n\treturn {\n\t\tonRequest(method: string, handler: RequestHandler): void {\n\t\t\thandlers.set(method, handler)\n\t\t},\n\n\t\tsend(method: string, params?: unknown): void {\n\t\t\tsend({ jsonrpc: '2.0', method, params })\n\t\t},\n\t}\n}\n","import { createIpcTransport } from './transport.js'\nimport type { ActionResult, AgentContext, PawDefinition } from './types.js'\n\n/**\n * definePaw — the primary export for Paw developers.\n *\n * For in-process Paws, this simply returns the definition (loaded directly by core).\n * For subprocess Paws, this sets up the IPC transport and registers handlers.\n */\nexport function definePaw(definition: PawDefinition): PawDefinition {\n\t// If this module is being imported by the core (in-process), just return the definition\n\tif (definition.inProcess || !isSubprocess()) {\n\t\treturn definition\n\t}\n\n\t// Running as a subprocess — wire up IPC transport\n\tsetupSubprocessPaw(definition)\n\treturn definition\n}\n\n/** Check if we're running as a subprocess (have IPC channel) */\nfunction isSubprocess(): boolean {\n\treturn typeof process.send === 'function'\n}\n\n/** Set up IPC handlers for a subprocess Paw */\nfunction setupSubprocessPaw(definition: PawDefinition): void {\n\tconst transport = createIpcTransport()\n\n\t// Register with the core\n\ttransport.send('register', {\n\t\tname: definition.name,\n\t\tversion: definition.version,\n\t\tbrain: definition.brain ?? false,\n\t\ttools: (definition.tools ?? []).map((t) => ({\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t})),\n\t\thooks: {\n\t\t\tbootstrap: !!definition.hooks?.onBootstrap,\n\t\t\tperceive: !!definition.hooks?.onPerceive,\n\t\t\tobserve: !!definition.hooks?.onObserve,\n\t\t\tcompact: !!definition.hooks?.onCompact,\n\t\t\tschedule: (definition.hooks?.onSchedule ?? []).map((s) => s.cron),\n\t\t},\n\t})\n\n\t// Handle bootstrap — called once at task start\n\tif (definition.hooks?.onBootstrap) {\n\t\ttransport.onRequest('bootstrap', async (params) => {\n\t\t\treturn definition.hooks!.onBootstrap!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle perceive\n\tif (definition.hooks?.onPerceive) {\n\t\ttransport.onRequest('perceive', async (params) => {\n\t\t\treturn definition.hooks!.onPerceive!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle think (Brain Paw)\n\tif (definition.think) {\n\t\ttransport.onRequest('think', async (params) => {\n\t\t\treturn definition.think!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle tool execution\n\tif (definition.tools && definition.tools.length > 0) {\n\t\tconst toolMap = new Map(definition.tools.map((t) => [t.name, t]))\n\n\t\ttransport.onRequest('execute_tool', async (params) => {\n\t\t\tconst { toolName, params: toolParams } = params as {\n\t\t\t\ttoolName: string\n\t\t\t\tparams: unknown\n\t\t\t}\n\n\t\t\tconst tool = toolMap.get(toolName)\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool \"${toolName}\" not found in this Paw`)\n\t\t\t}\n\n\t\t\t// Validate parameters\n\t\t\tconst validated = tool.parameters.parse(toolParams)\n\t\t\treturn tool.execute(validated)\n\t\t})\n\t}\n\n\t// Handle observe\n\tif (definition.hooks?.onObserve) {\n\t\ttransport.onRequest('observe', async (params) => {\n\t\t\tawait definition.hooks!.onObserve!(params as ActionResult)\n\t\t\treturn { ok: true }\n\t\t})\n\t}\n\n\t// Handle compact — called when context exceeds threshold\n\tif (definition.hooks?.onCompact) {\n\t\ttransport.onRequest('compact', async (params) => {\n\t\t\treturn definition.hooks!.onCompact!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle shutdown\n\ttransport.onRequest('shutdown', async () => {\n\t\tif (definition.onUnload) {\n\t\t\tawait definition.onUnload()\n\t\t}\n\t\tprocess.exit(0)\n\t})\n\n\t// Run onLoad\n\tif (definition.onLoad) {\n\t\tdefinition.onLoad({}).catch((err) => {\n\t\t\tconsole.error(`[${definition.name}] onLoad failed:`, err)\n\t\t\tprocess.exit(1)\n\t\t})\n\t}\n}\n","export { definePaw } from './define.js'\nexport { createIpcTransport, createStdioTransport } from './transport.js'\nexport { z } from 'zod'\nexport type {\n\tPawDefinition,\n\tToolDefinition,\n\tAgentContext,\n\tAgentMessage,\n\tAgentPlan,\n\tPlannedAction,\n\tActionResult,\n\tActiveSkill,\n\tToolSummary,\n\tBootstrapHook,\n\tPerceiveHook,\n\tObserveHook,\n\tCompactHook,\n\tScheduleHook,\n\tVoleIO,\n\tPawCategory,\n} from './types.js'\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/define.ts","../src/index.ts"],"sourcesContent":["/** JSON-RPC 2.0 message */\ninterface IpcMessage {\n\tjsonrpc: '2.0'\n\tid?: string\n\tmethod?: string\n\tparams?: unknown\n\tresult?: unknown\n\terror?: { code: number; message: string; data?: unknown }\n}\n\ntype RequestHandler = (params: unknown) => Promise<unknown>\n\nlet ipcSingleton: ReturnType<typeof _createIpcTransport> | undefined\n\n/** Create an IPC transport for Node.js Paw subprocesses (singleton — reuses the same instance) */\nexport function createIpcTransport() {\n\tif (ipcSingleton) return ipcSingleton\n\tipcSingleton = _createIpcTransport()\n\treturn ipcSingleton\n}\n\nfunction _createIpcTransport() {\n\tconst handlers = new Map<string, RequestHandler>()\n\n\t// Increase max listeners — concurrent query/request calls each add a temporary listener\n\tprocess.setMaxListeners(Math.max(process.getMaxListeners(), 25))\n\n\t// Listen for incoming messages from the core\n\tprocess.on('message', async (msg: IpcMessage) => {\n\t\tif (!msg.method) return\n\n\t\tconst handler = handlers.get(msg.method)\n\t\tif (handler) {\n\t\t\ttry {\n\t\t\t\tconst result = await handler(msg.params)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tprocess.send!({ jsonrpc: '2.0', id: msg.id, result })\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tprocess.send!({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\terror: { code: -32603, message },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\treturn {\n\t\t/** Register a handler for a method called by the core */\n\t\tonRequest(method: string, handler: RequestHandler): void {\n\t\t\thandlers.set(method, handler)\n\t\t},\n\n\t\t/** Send a notification to the core (no response expected) */\n\t\tsend(method: string, params?: unknown): void {\n\t\t\tprocess.send!({ jsonrpc: '2.0', method, params })\n\t\t},\n\n\t\t/** Send a request to the core and wait for a response */\n\t\tasync request(method: string, params?: unknown): Promise<unknown> {\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = { jsonrpc: '2.0', id, method, params }\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Request \"${method}\" timed out`))\n\t\t\t\t}, 30_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\n\t\t/** Subscribe to bus events from the core */\n\t\tsubscribe(events: string[]): void {\n\t\t\tprocess.send!({ jsonrpc: '2.0', method: 'subscribe', params: { events } })\n\t\t},\n\n\t\t/**\n\t\t * Emit a bus event into the core.\n\t\t *\n\t\t * Core publishes only the `channel:*` namespace — events that carry no authority, so a\n\t\t * sandboxed Paw cannot forge `task:completed` and drive core's own subscribers. Anything\n\t\t * else is logged and dropped. Fire-and-forget: the core stamps the emitting Paw's name onto\n\t\t * the payload, so provenance never comes from here.\n\t\t */\n\t\temit(event: string, data?: unknown): void {\n\t\t\tprocess.send!({ jsonrpc: '2.0', method: 'emit', params: { event, data } })\n\t\t},\n\n\t\t/** Query core state (tools, paws, skills, tasks) */\n\t\tasync query(type: 'tools' | 'paws' | 'skills' | 'tasks'): Promise<unknown> {\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = { jsonrpc: '2.0', id, method: 'query', params: { type } }\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Query \"${type}\" timed out`))\n\t\t\t\t}, 10_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\n\t\t/** Register a handler for forwarded bus events */\n\t\tonBusEvent(handler: (event: string, data: unknown) => void): void {\n\t\t\thandlers.set('bus_event', async (params) => {\n\t\t\t\tconst { event, data } = params as { event: string; data: unknown }\n\t\t\t\thandler(event, data)\n\t\t\t\treturn { ok: true }\n\t\t\t})\n\t\t},\n\n\t\t/** Create a task in the core's task queue (for channel Paws that receive inbound messages) */\n\t\tasync createTask(\n\t\t\tinput: string,\n\t\t\tmetadata?: Record<string, unknown> & { sessionId?: string },\n\t\t): Promise<{ taskId: string }> {\n\t\t\tconst { sessionId, ...rest } = metadata ?? {}\n\t\t\tconst id = crypto.randomUUID()\n\t\t\tconst message: IpcMessage = {\n\t\t\t\tjsonrpc: '2.0',\n\t\t\t\tid,\n\t\t\t\tmethod: 'create_task',\n\t\t\t\tparams: { input, source: 'paw', sessionId, metadata: rest },\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\treject(new Error('createTask timed out'))\n\t\t\t\t}, 10_000)\n\n\t\t\t\tconst listener = (msg: IpcMessage) => {\n\t\t\t\t\tif (msg.id === id) {\n\t\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t\t\tprocess.off('message', listener)\n\t\t\t\t\t\tif (msg.error) {\n\t\t\t\t\t\t\treject(new Error(msg.error.message))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(msg.result as { taskId: string })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocess.on('message', listener)\n\t\t\t\tprocess.send!(message)\n\t\t\t})\n\t\t},\n\t}\n}\n\n/** Create a stdio transport for non-Node Paw processes (LSP-style framing) */\nexport function createStdioTransport() {\n\tconst handlers = new Map<string, RequestHandler>()\n\tlet buffer = ''\n\n\tprocess.stdin.setEncoding('utf-8')\n\tprocess.stdin.on('data', (chunk: string) => {\n\t\tbuffer += chunk\n\t\tprocessBuffer()\n\t})\n\n\tasync function processBuffer(): Promise<void> {\n\t\twhile (buffer.length > 0) {\n\t\t\tconst headerEnd = buffer.indexOf('\\r\\n\\r\\n')\n\t\t\tif (headerEnd === -1) break\n\n\t\t\tconst header = buffer.substring(0, headerEnd)\n\t\t\tconst match = header.match(/Content-Length:\\s*(\\d+)/i)\n\t\t\tif (!match) {\n\t\t\t\tbuffer = buffer.substring(headerEnd + 4)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst contentLength = Number.parseInt(match[1], 10)\n\t\t\tconst bodyStart = headerEnd + 4\n\t\t\tif (buffer.length < bodyStart + contentLength) break\n\n\t\t\tconst body = buffer.substring(bodyStart, bodyStart + contentLength)\n\t\t\tbuffer = buffer.substring(bodyStart + contentLength)\n\n\t\t\ttry {\n\t\t\t\tconst msg = JSON.parse(body) as IpcMessage\n\t\t\t\tawait handleMessage(msg)\n\t\t\t} catch {\n\t\t\t\t// Skip malformed messages\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function handleMessage(msg: IpcMessage): Promise<void> {\n\t\tif (!msg.method) return\n\n\t\tconst handler = handlers.get(msg.method)\n\t\tif (handler) {\n\t\t\ttry {\n\t\t\t\tconst result = await handler(msg.params)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tsend({ jsonrpc: '2.0', id: msg.id, result })\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tif (msg.id) {\n\t\t\t\t\tsend({\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\terror: { code: -32603, message },\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction send(message: IpcMessage): void {\n\t\tconst json = JSON.stringify(message)\n\t\tconst header = `Content-Length: ${Buffer.byteLength(json)}\\r\\n\\r\\n`\n\t\tprocess.stdout.write(header + json)\n\t}\n\n\treturn {\n\t\tonRequest(method: string, handler: RequestHandler): void {\n\t\t\thandlers.set(method, handler)\n\t\t},\n\n\t\tsend(method: string, params?: unknown): void {\n\t\t\tsend({ jsonrpc: '2.0', method, params })\n\t\t},\n\t}\n}\n","import { createIpcTransport } from './transport.js'\nimport type { ActionResult, AgentContext, PawDefinition } from './types.js'\n\n/**\n * definePaw — the primary export for Paw developers.\n *\n * For in-process Paws, this simply returns the definition (loaded directly by core).\n * For subprocess Paws, this sets up the IPC transport and registers handlers.\n */\nexport function definePaw(definition: PawDefinition): PawDefinition {\n\t// If this module is being imported by the core (in-process), just return the definition\n\tif (definition.inProcess || !isSubprocess()) {\n\t\treturn definition\n\t}\n\n\t// Running as a subprocess — wire up IPC transport\n\tsetupSubprocessPaw(definition)\n\treturn definition\n}\n\n/** Check if we're running as a subprocess (have IPC channel) */\nfunction isSubprocess(): boolean {\n\treturn typeof process.send === 'function'\n}\n\n/** Set up IPC handlers for a subprocess Paw */\nfunction setupSubprocessPaw(definition: PawDefinition): void {\n\tconst transport = createIpcTransport()\n\n\t// Register with the core\n\ttransport.send('register', {\n\t\tname: definition.name,\n\t\tversion: definition.version,\n\t\tbrain: definition.brain ?? false,\n\t\ttools: (definition.tools ?? []).map((t) => ({\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t})),\n\t\thooks: {\n\t\t\tbootstrap: !!definition.hooks?.onBootstrap,\n\t\t\tperceive: !!definition.hooks?.onPerceive,\n\t\t\tobserve: !!definition.hooks?.onObserve,\n\t\t\tcompact: !!definition.hooks?.onCompact,\n\t\t\tschedule: (definition.hooks?.onSchedule ?? []).map((s) => s.cron),\n\t\t},\n\t})\n\n\t// Handle bootstrap — called once at task start\n\tif (definition.hooks?.onBootstrap) {\n\t\ttransport.onRequest('bootstrap', async (params) => {\n\t\t\treturn definition.hooks!.onBootstrap!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle perceive\n\tif (definition.hooks?.onPerceive) {\n\t\ttransport.onRequest('perceive', async (params) => {\n\t\t\treturn definition.hooks!.onPerceive!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle think (Brain Paw)\n\tif (definition.think) {\n\t\ttransport.onRequest('think', async (params) => {\n\t\t\treturn definition.think!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle tool execution\n\tif (definition.tools && definition.tools.length > 0) {\n\t\tconst toolMap = new Map(definition.tools.map((t) => [t.name, t]))\n\n\t\ttransport.onRequest('execute_tool', async (params) => {\n\t\t\tconst { toolName, params: toolParams } = params as {\n\t\t\t\ttoolName: string\n\t\t\t\tparams: unknown\n\t\t\t}\n\n\t\t\tconst tool = toolMap.get(toolName)\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool \"${toolName}\" not found in this Paw`)\n\t\t\t}\n\n\t\t\t// Validate parameters\n\t\t\tconst validated = tool.parameters.parse(toolParams)\n\t\t\treturn tool.execute(validated)\n\t\t})\n\t}\n\n\t// Handle observe\n\tif (definition.hooks?.onObserve) {\n\t\ttransport.onRequest('observe', async (params) => {\n\t\t\tawait definition.hooks!.onObserve!(params as ActionResult)\n\t\t\treturn { ok: true }\n\t\t})\n\t}\n\n\t// Handle compact — called when context exceeds threshold\n\tif (definition.hooks?.onCompact) {\n\t\ttransport.onRequest('compact', async (params) => {\n\t\t\treturn definition.hooks!.onCompact!(params as AgentContext)\n\t\t})\n\t}\n\n\t// Handle shutdown\n\ttransport.onRequest('shutdown', async () => {\n\t\tif (definition.onUnload) {\n\t\t\tawait definition.onUnload()\n\t\t}\n\t\tprocess.exit(0)\n\t})\n\n\t// Run onLoad\n\tif (definition.onLoad) {\n\t\tdefinition.onLoad({}).catch((err) => {\n\t\t\tconsole.error(`[${definition.name}] onLoad failed:`, err)\n\t\t\tprocess.exit(1)\n\t\t})\n\t}\n}\n","export { definePaw } from './define.js'\nexport { createIpcTransport, createStdioTransport } from './transport.js'\nexport { z } from 'zod'\nexport type {\n\tPawDefinition,\n\tToolDefinition,\n\tAgentContext,\n\tAgentMessage,\n\tAgentPlan,\n\tPlannedAction,\n\tActionResult,\n\tActiveSkill,\n\tToolSummary,\n\tBootstrapHook,\n\tPerceiveHook,\n\tObserveHook,\n\tCompactHook,\n\tScheduleHook,\n\tVoleIO,\n\tPawCategory,\n} from './types.js'\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openvole/paw-sdk",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "SDK for building OpenVole Paws — tool providers for the agent loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,7 +28,7 @@
28
28
  "README.md"
29
29
  ],
30
30
  "license": "MIT",
31
- "homepage": "https://openvole.github.io/openvole/",
31
+ "homepage": "https://openvole.com/openvole/",
32
32
  "repository": {
33
33
  "type": "git",
34
34
  "url": "https://github.com/openvole/openvole",