{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,2BAA2B;AAC3B,eAAO,MAAM,kBAAkB,iDAA+C,CAAC;AAE/E,mCAAmC;AACnC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;EAKpC,CAAC;AAEH,6BAA6B;AAC7B,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AAEH,mCAAmC;AACnC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM9B,CAAC;AAEH,8BAA8B;AAC9B,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDhC,CAAC;AAEH,mCAAmC;AACnC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,gCAAgC;AAChC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa3B,CAAC;AAEH,wCAAwC;AACxC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB9B,CAAC;AAEH,mBAAmB;AACnB,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;AAE1C,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,aAqB3B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,aAAa,EAAE,aAyE3B,CAAC","sourcesContent":["/**\n * Piagnet Configuration Schema\n *\n * Defines the configuration structure for Piagnet gateway,\n * agents, channels, and access control policies.\n */\n\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\n/** Get default public directory */\nconst getDefaultPublicDir = (): string => {\n\tconst __filename = fileURLToPath(import.meta.url);\n\tconst __dirname = path.dirname(__filename);\n\t// From dist/config/schema.js -> dist/public\n\treturn path.resolve(__dirname, \"..\", \"public\");\n};\n\n/** Channel scope schema */\nexport const channelScopeSchema = z.enum([\"dm\", \"group\", \"thread\", \"channel\"]);\n\n/** Access control policy schema */\nexport const accessControlPolicySchema = z.object({\n\tdmPolicy: z.enum([\"pairing\", \"allowlist\", \"open\"]).default(\"pairing\"),\n\tdmAllowlist: z.array(z.string()).optional(),\n\tgroupPolicy: z.enum([\"mention\", \"allowlist\", \"open\"]).default(\"mention\"),\n\tgroupAllowlist: z.array(z.string()).optional(),\n});\n\n/** Channel binding schema */\nexport const channelBindingSchema = z.object({\n\tagentId: z.string(),\n\tchannel: z.string(),\n\tbindType: z.enum([\"peer\", \"guild\", \"team\", \"account\", \"channel\", \"default\"]),\n\tbindValue: z.string(),\n\taccess: accessControlPolicySchema,\n});\n\n/** Channel configuration schema */\nexport const channelConfigSchema = z.object({\n\ttype: z.string(),\n\tname: z.string(),\n\tenabled: z.boolean().default(true),\n\tconfig: z.record(z.unknown()).default({}),\n\taccess: accessControlPolicySchema,\n});\n\n/** Agent definition schema */\nexport const agentDefinitionSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tdescription: z.string().optional(),\n\tmodel: z.object({\n\t\tprovider: z.string(),\n\t\tmodel: z.string(),\n\t}),\n\tsystemPrompt: z.string().optional(),\n\tskills: z.array(z.string()).default([]),\n\ttools: z\n\t\t.object({\n\t\t\tallow: z.array(z.string()).optional(),\n\t\t\tdeny: z.array(z.string()).optional(),\n\t\t})\n\t\t.optional(),\n\tsandbox: z\n\t\t.object({\n\t\t\tenabled: z.boolean().default(false),\n\t\t\tworkspace: z.string().optional(),\n\t\t})\n\t\t.optional(),\n\tsession: z\n\t\t.object({\n\t\t\thistoryLimit: z.number().default(100),\n\t\t\tdmHistoryLimit: z.number().optional(),\n\t\t\tidleMinutes: z.number().default(60),\n\t\t\tdailyResetHour: z.number().default(4),\n\t\t\tcompression: z.enum([\"summary\", \"none\"]).default(\"summary\"),\n\t\t\tqueuing: z.enum([\"sequential\", \"concurrent\", \"collect\", \"steer\", \"followup\"]).default(\"sequential\"),\n\t\t})\n\t\t.default({\n\t\t\thistoryLimit: 100,\n\t\t\tidleMinutes: 60,\n\t\t\tdailyResetHour: 4,\n\t\t\tcompression: \"summary\",\n\t\t\tqueuing: \"sequential\",\n\t\t}),\n\tbootstrap: z\n\t\t.object({\n\t\t\tfiles: z.array(z.string()).default([\"AGENTS.md\", \"SOUL.md\", \"USER.md\", \"IDENTITY.md\", \"TOOLS.md\"]),\n\t\t\tmaxChars: z.number().default(20000),\n\t\t})\n\t\t.default({}),\n\tmemory: z\n\t\t.object({\n\t\t\tenabled: z.boolean().default(true),\n\t\t\tfiles: z.array(z.string()).default([\"MEMORY.md\"]),\n\t\t})\n\t\t.default({}),\n});\n\n/** Gateway configuration schema */\nexport const gatewayConfigSchema = z.object({\n\tport: z.number().default(18789),\n\twsPath: z.string().default(\"/ws\"),\n\tpublicDir: z.string().default(getDefaultPublicDir()),\n\tsessionDir: z.string().default(\"~/.piagnet/sessions\"),\n\tdebug: z.boolean().default(false),\n\tcorsOrigins: z.array(z.string()).default([\"*\"]),\n});\n\n/** Node configuration schema */\nexport const nodeConfigSchema = z.object({\n\tenabled: z.boolean().default(false),\n\tdiscovery: z\n\t\t.object({\n\t\t\tmdns: z.boolean().default(true),\n\t\t\ttailnet: z.boolean().default(false),\n\t\t})\n\t\t.default({}),\n\ttailnet: z\n\t\t.object({\n\t\t\tauthKey: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\n\n/** Full Piagnet configuration schema */\nexport const piagnetConfigSchema = z.object({\n\tversion: z.string().default(\"1.0\"),\n\tgateway: gatewayConfigSchema.default({}),\n\tnode: nodeConfigSchema.default({}),\n\tagents: z.array(agentDefinitionSchema).default([]),\n\tchannels: z.array(channelConfigSchema).default([]),\n\tbindings: z.array(channelBindingSchema).default([]),\n\tdefaults: z\n\t\t.object({\n\t\t\tagent: z.string().optional(),\n\t\t\tmodel: z\n\t\t\t\t.object({\n\t\t\t\t\tprovider: z.string(),\n\t\t\t\t\tmodel: z.string(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t})\n\t\t.default({}),\n});\n\n/** Type exports */\nexport type ChannelScope = z.infer<typeof channelScopeSchema>;\nexport type AccessControlPolicy = z.infer<typeof accessControlPolicySchema>;\nexport type ChannelBinding = z.infer<typeof channelBindingSchema>;\nexport type ChannelConfig = z.infer<typeof channelConfigSchema>;\nexport type AgentDefinition = z.infer<typeof agentDefinitionSchema>;\nexport type GatewayConfig = z.infer<typeof gatewayConfigSchema>;\nexport type NodeConfig = z.infer<typeof nodeConfigSchema>;\nexport type PiagnetConfig = z.infer<typeof piagnetConfigSchema>;\nexport type PiagentConfig = PiagnetConfig; // Backward compatibility\n\n/** Default configuration */\nexport const defaultConfig: PiagnetConfig = {\n\tversion: \"1.0\",\n\tgateway: {\n\t\tport: 18789,\n\t\twsPath: \"/ws\",\n\t\tpublicDir: getDefaultPublicDir(),\n\t\tsessionDir: \"~/.piagnet/sessions\",\n\t\tdebug: false,\n\t\tcorsOrigins: [\"*\"],\n\t},\n\tnode: {\n\t\tenabled: false,\n\t\tdiscovery: {\n\t\t\tmdns: true,\n\t\t\ttailnet: false,\n\t\t},\n\t},\n\tagents: [],\n\tchannels: [],\n\tbindings: [],\n\tdefaults: {},\n};\n\n/** Example configuration for documentation */\nexport const exampleConfig: PiagnetConfig = {\n\tversion: \"1.0\",\n\tgateway: {\n\t\tport: 18789,\n\t\twsPath: \"/ws\",\n\t\tpublicDir: \"./public\",\n\t\tsessionDir: \"~/.piagnet/sessions\",\n\t\tdebug: false,\n\t\tcorsOrigins: [\"http://localhost:3000\"],\n\t},\n\tnode: {\n\t\tenabled: false,\n\t\tdiscovery: {\n\t\t\tmdns: true,\n\t\t\ttailnet: false,\n\t\t},\n\t},\n\tagents: [\n\t\t{\n\t\t\tid: \"assistant\",\n\t\t\tname: \"AI Assistant\",\n\t\t\tdescription: \"General purpose AI assistant\",\n\t\t\tmodel: {\n\t\t\t\tprovider: \"anthropic\",\n\t\t\t\tmodel: \"claude-3-5-sonnet-20241022\",\n\t\t\t},\n\t\t\tskills: [\"coding\", \"analysis\"],\n\t\t\tsession: {\n\t\t\t\thistoryLimit: 100,\n\t\t\t\tidleMinutes: 60,\n\t\t\t\tdailyResetHour: 4,\n\t\t\t\tcompression: \"summary\",\n\t\t\t\tqueuing: \"sequential\",\n\t\t\t},\n\t\t\tbootstrap: {\n\t\t\t\tfiles: [\"AGENTS.md\", \"SOUL.md\", \"USER.md\", \"IDENTITY.md\", \"TOOLS.md\"],\n\t\t\t\tmaxChars: 20000,\n\t\t\t},\n\t\t\tmemory: {\n\t\t\t\tenabled: true,\n\t\t\t\tfiles: [\"MEMORY.md\"],\n\t\t\t},\n\t\t},\n\t],\n\tchannels: [\n\t\t{\n\t\t\ttype: \"telegram\",\n\t\t\tname: \"Telegram Bot\",\n\t\t\tenabled: true,\n\t\t\tconfig: {\n\t\t\t\tbotToken: \"${TELEGRAM_BOT_TOKEN}\",\n\t\t\t},\n\t\t\taccess: {\n\t\t\t\tdmPolicy: \"pairing\",\n\t\t\t\tgroupPolicy: \"mention\",\n\t\t\t},\n\t\t},\n\t],\n\tbindings: [\n\t\t{\n\t\t\tagentId: \"assistant\",\n\t\t\tchannel: \"telegram\",\n\t\t\tbindType: \"default\",\n\t\t\tbindValue: \"*\",\n\t\t\taccess: {\n\t\t\t\tdmPolicy: \"pairing\",\n\t\t\t\tgroupPolicy: \"mention\",\n\t\t\t},\n\t\t},\n\t],\n\tdefaults: {\n\t\tagent: \"assistant\",\n\t},\n};\n"]}