@agimon-ai/foundation-port-registry 0.2.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/LICENSE ADDED
@@ -0,0 +1,52 @@
1
+ Business Source License 1.1
2
+
3
+ Parameters
4
+
5
+ Licensor: AgiFlow
6
+ Licensed Work: @agimon-ai/public-packages
7
+ The Licensed Work is (c) 2026 AgiFlow.
8
+ Additional Use Grant: None
9
+ Change Date: 2030-03-06
10
+ Change License: Apache License, Version 2.0
11
+
12
+ Terms
13
+
14
+ The Licensor hereby grants you the right to copy, modify, create derivative
15
+ works, redistribute, and make non-production use of the Licensed Work. The
16
+ Licensor may make an Additional Use Grant, above, permitting limited
17
+ production use.
18
+
19
+ Effective on the Change Date, or the fourth anniversary of the first publicly
20
+ available distribution of a specific version of the Licensed Work under this
21
+ License, whichever comes first, the Licensor hereby grants you rights under
22
+ the terms of the Change License, and the rights granted in the paragraph
23
+ above terminate.
24
+
25
+ If your use of the Licensed Work does not comply with the requirements
26
+ currently in effect as described in this License, you must purchase a
27
+ commercial license from the Licensor, its affiliated entities, or authorized
28
+ resellers, or you must refrain from using the Licensed Work.
29
+
30
+ All copies of the original and modified Licensed Work, and derivative works
31
+ of the Licensed Work, are subject to this License. This License applies
32
+ separately for each version of the Licensed Work and the Change Date may vary
33
+ for each version of the Licensed Work released by Licensor.
34
+
35
+ You must conspicuously display this License on each original or modified copy
36
+ of the Licensed Work. If you receive the Licensed Work in original or
37
+ modified form from a third party, the terms and conditions set forth in this
38
+ License apply to your use of that work.
39
+
40
+ Any use of the Licensed Work in violation of this License will automatically
41
+ terminate your rights under this License for the current and all other
42
+ versions of the Licensed Work.
43
+
44
+ This License does not grant you any right in any trademark or logo of
45
+ Licensor or its affiliates (provided that you may use a trademark or logo of
46
+ Licensor as expressly required by this License).
47
+
48
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
49
+ AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
50
+ EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
51
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
52
+ TITLE.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:crypto`),l=require(`node:fs/promises`);l=s(l);let u=require(`node:net`);u=s(u);let d=require(`node:os`);d=s(d);let f=require(`node:path`);f=s(f);let p=require(`zod`);const m=1,h=p.z.enum([`service`,`tool`]),g=p.z.record(p.z.string(),p.z.unknown()),_=p.z.object({repositoryPath:p.z.string().trim().min(1,`repositoryPath is required`),serviceName:p.z.string().trim().min(1,`serviceName is required`),serviceType:h,environment:p.z.string().trim().min(1).optional(),pid:p.z.number().int().min(1).optional(),port:p.z.number().int().min(1).max(65535),host:p.z.string().trim().min(1).default(`127.0.0.1`),metadata:g.optional(),createdAt:p.z.string().trim().min(1),updatedAt:p.z.string().trim().min(1)}),v=p.z.object({version:p.z.literal(1),updatedAt:p.z.string().trim().min(1),entries:p.z.array(_)}),y=p.z.object({min:p.z.number().int().min(1).max(65535),max:p.z.number().int().min(1).max(65535)}).refine(e=>e.min<=e.max,{message:`Port range min must be less than or equal to max`,path:[`min`]}),b=p.z.object({repositoryPath:p.z.string().trim().min(1),serviceName:p.z.string().trim().min(1),serviceType:h.default(`service`),environment:p.z.string().trim().min(1).optional(),pid:p.z.number().int().min(1).optional(),portRange:y.optional(),preferredPort:p.z.number().int().min(1).max(65535).optional(),host:p.z.string().trim().min(1).optional(),metadata:g.optional(),force:p.z.boolean().optional()}),x=p.z.object({repositoryPath:p.z.string().trim().min(1),serviceName:p.z.string().trim().min(1),serviceType:h.optional(),pid:p.z.number().int().min(1).optional(),environment:p.z.string().trim().min(1).optional(),force:p.z.boolean().optional()}),S=p.z.object({repositoryPath:p.z.string().trim().min(1),serviceName:p.z.string().trim().min(1),serviceType:h.optional(),environment:p.z.string().trim().min(1).optional()}),C=p.z.object({repositoryPath:p.z.string().trim().min(1),serviceName:p.z.string().trim().min(1),serviceType:h.optional(),environment:p.z.string().trim().min(1).optional(),portRange:y.optional(),preferredPort:p.z.number().int().min(1).max(65535).optional(),host:p.z.string().trim().min(1).default(`127.0.0.1`)}),w=p.z.object({success:p.z.boolean(),port:p.z.number().int().min(1).max(65535).optional(),record:_.optional(),error:p.z.string().optional()}),T=p.z.object({repositoryPath:p.z.string().trim().min(1).optional(),serviceType:h.optional(),serviceName:p.z.string().trim().min(1).optional(),environment:p.z.string().trim().min(1).optional()});var E=class extends Error{code;constructor(e,t,n){super(e,n),this.name=`PortRegistryError`,this.code=t}};const D=f.default.join(d.default.homedir(),`.port-registry`,`ports.json`),O=`${D}.lock`,k=75,A=80,j={min:3e3,max:4999},M=`127.0.0.1`,N=e=>f.default.resolve(e),P=e=>`${e}.${(0,c.randomBytes)(6).toString(`hex`)}.tmp`,F=(e,t)=>e>=t.min&&e<=t.max;var I=class e{registryPath;lockPath;constructor(t=D,n){this.registryPath=e.resolveRegistryPath(t),this.lockPath=n??`${this.registryPath}.lock`}static resolveRegistryPath(e){if(!e)return D;let t=f.default.isAbsolute(e)?e:f.default.join(process.cwd(),e);return f.default.extname(t)===`.json`?t:f.default.join(t,`ports.json`)}async getPort(e){let t=S.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=await this.pruneMissingRepositories(e),r=this.findEntry(n,{repositoryPath:N(t.repositoryPath),serviceName:t.serviceName,serviceType:t.serviceType??`service`,environment:t.environment});return r?this.createSuccessResponse(r.port,r):this.createFailureResponse(`No allocation found for ${t.serviceName} in requested scope`)})}async findAvailablePort(e){let t=C.parse(e);return this.withLock(async()=>{let e=t.portRange??j,n=await this.loadState(),r=await this.pruneMissingRepositories(n),i=this.getReservedPorts(r,{repositoryPath:N(t.repositoryPath),serviceName:t.serviceName,serviceType:t.serviceType??`service`,environment:t.environment}),a=await this.findAvailablePortInternal(e,t.preferredPort,i,t.host);return a===null?this.createFailureResponse(`No available port found in range ${e.min}-${e.max}`):this.createSuccessResponse(a)})}async reservePort(e){let t=b.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=N(t.repositoryPath),r=t.serviceType??`service`,i=t.environment??process.env.NODE_ENV??`development`,a=t.host??M,o=t.portRange??j,s=t.force??!1,c=await this.pruneMissingRepositories(e),l=this.findEntry(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i});if(l&&!s){if(F(l.port,o)&&await this.isPortAvailable(l.port,a))return l.updatedAt=new Date().toISOString(),await this.saveState(c),this.createSuccessResponse(l.port,l);this.removeMatchingEntries(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i})}l&&s&&this.removeMatchingEntries(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i});let u=this.getReservedPorts(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i}),d=t.preferredPort,f=await this.findAvailablePortInternal(o,d,u,a);if(f===null)return this.createFailureResponse(`No available port found in range ${o.min}-${o.max}`);let p=new Date().toISOString(),m={repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i,pid:t.pid,port:f,host:a,metadata:t.metadata,createdAt:p,updatedAt:p};return c.entries.push(m),await this.saveState(c),this.createSuccessResponse(f,m)})}async releasePort(e){let t=x.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=N(t.repositoryPath),r=t.serviceType??`service`,i=t.environment??process.env.NODE_ENV??`development`,a=e.entries.length,o=!1;return e.entries=e.entries.filter(e=>{if(e.repositoryPath===n&&e.serviceName===t.serviceName&&e.serviceType===r&&(!t.environment||e.environment===i)){let n=typeof t.pid==`number`;return!t.force&&n&&e.pid!==t.pid?!0:(o=!0,!1)}return!0}),!o||e.entries.length===a?this.createFailureResponse(`No matching registry entry for ${t.serviceName}`):(await this.saveState(e),this.createSuccessResponse())})}async listAllocations(e={}){return this.withLock(async()=>{let t=await this.loadState();return[...(await this.pruneMissingRepositories(t)).entries].filter(t=>!(e.repositoryPath&&t.repositoryPath!==N(e.repositoryPath)||e.serviceType&&t.serviceType!==e.serviceType||e.serviceName&&t.serviceName!==e.serviceName||e.environment&&t.environment!==e.environment))})}async withLock(e){let t=`${process.pid}-${(0,c.randomBytes)(6).toString(`hex`)}`;await this.acquireLock(t);try{return await e()}finally{await this.releaseLock(t)}}async loadState(){await l.default.mkdir(f.default.dirname(this.registryPath),{recursive:!0});try{let e=await l.default.readFile(this.registryPath,`utf-8`),t=JSON.parse(e);return v.parse(t)}catch(e){let t=e;if(t.code===`ENOENT`)return{version:1,updatedAt:new Date().toISOString(),entries:[]};if(t instanceof SyntaxError){let e=`${this.registryPath}.corrupt.${Date.now()}`;await l.default.rename(this.registryPath,e).catch(()=>void 0)}throw new E(`Failed to read registry file: ${e instanceof Error?e.message:String(e)}`,`REGISTRY_READ_FAILED`,{cause:e})}}async saveState(e){await l.default.mkdir(f.default.dirname(this.registryPath),{recursive:!0});let t={...e,updatedAt:new Date().toISOString(),entries:[...e.entries]},n=P(this.registryPath);await l.default.writeFile(n,JSON.stringify(t,null,2),`utf-8`),await l.default.rename(n,this.registryPath)}async pruneMissingRepositories(e){let t=!1,n=(await Promise.all(e.entries.map(async e=>({entry:e,exists:await this.pathExists(e.repositoryPath)})))).filter(e=>e.exists).map(e=>e.entry);return n.length!==e.entries.length&&(t=!0,e.entries=n),t&&await this.saveState(e),e}async acquireLock(e){await l.default.mkdir(f.default.dirname(this.lockPath),{recursive:!0});for(let t=0;t<80;t+=1)try{let t={pid:process.pid,token:e,createdAt:new Date().toISOString()};await l.default.writeFile(this.lockPath,JSON.stringify(t),{flag:`wx`});return}catch(e){if(e.code!==`EEXIST`)throw new E(`Failed to acquire registry lock: ${e instanceof Error?e.message:String(e)}`,`REGISTRY_LOCK_FAILED`,{cause:e});if(await this.isStaleLock()){await l.default.unlink(this.lockPath).catch(()=>void 0),--t;continue}await this.delay(75)}throw new E(`Unable to acquire registry lock (timeout)`,`REGISTRY_LOCK_FAILED`)}async releaseLock(e){try{let t=await l.default.readFile(this.lockPath,`utf-8`);JSON.parse(t).token===e&&await l.default.unlink(this.lockPath)}catch{}}async isStaleLock(){try{let e=await l.default.readFile(this.lockPath,`utf-8`),t=JSON.parse(e);return t.pid&&this.isProcessRunning(t.pid)?(Date.now()-new Date(t.createdAt).getTime(),!1):!0}catch{return!0}}isProcessRunning(e){try{return process.kill(e,0),!0}catch{return!1}}async pathExists(e){try{return await l.default.access(e),!0}catch{return!1}}findEntry(e,t){return e.entries.find(e=>e.repositoryPath===t.repositoryPath&&e.serviceName===t.serviceName&&e.serviceType===t.serviceType&&(t.environment?e.environment===t.environment:!0))}removeMatchingEntries(e,t){e.entries=e.entries.filter(e=>!(e.repositoryPath===t.repositoryPath&&e.serviceName===t.serviceName&&e.serviceType===t.serviceType&&(!t.environment||e.environment===t.environment)))}getReservedPorts(e,t){let n=new Set;for(let r of e.entries)t.environment&&r.environment!==t.environment||r.serviceType===t.serviceType&&n.add(r.port);return n}async findAvailablePortInternal(e,t,n,r){let i=[];t!==void 0&&F(t,e)&&i.push(t);for(let t=e.min;t<=e.max;t+=1)i.includes(t)||i.push(t);for(let e of i)if(!n.has(e)&&await this.isPortAvailable(e,r))return e;return null}async isPortAvailable(e,t){d.default.platform()===`win32`&&(t=`127.0.0.1`);let n=Array.from(new Set([t,`127.0.0.1`,`0.0.0.0`,void 0,`::1`].filter(e=>e!==null)));for(let t of n)if(!await this.isPortAvailableOnHost(e,t))return!1;return!0}async isPortAvailableOnHost(e,t){return new Promise(n=>{let r=u.default.createServer();r.once(`error`,()=>{n(!1)}),r.once(`listening`,()=>{r.close(()=>n(!0))}),t?r.listen(e,t):r.listen(e)})}createSuccessResponse(e,t){let n={success:!0};return e!==void 0&&(n.port=e),t!==void 0&&(n.record=t),w.parse(n)}createFailureResponse(e){return w.parse({success:!1,error:e})}async delay(e){await new Promise(t=>setTimeout(t,e))}};exports.DEFAULT_HOST=M,exports.DEFAULT_PORT_RANGE=j,exports.DEFAULT_REGISTRY_LOCK_PATH=O,exports.DEFAULT_REGISTRY_PATH=D,exports.FindAvailablePortRequestSchema=C,exports.GetPortRequestSchema=S,exports.LOCK_MAX_RETRIES=80,exports.LOCK_RETRY_DELAY_MS=75,exports.PortAllocationRangeSchema=y,exports.PortAllocationResponseSchema=w,exports.PortRegistryError=E,exports.PortRegistryRecordSchema=_,exports.PortRegistryService=I,exports.PortRegistryStateSchema=v,exports.PortUsageListFiltersSchema=T,exports.REGISTRY_VERSION=1,exports.ReleasePortRequestSchema=x,exports.ReservePortRequestSchema=b,exports.ServiceCategorySchema=h,exports.ServiceMetadataSchema=g,exports.isPortInRange=F,exports.makeTempPath=P,exports.normalizeRepositoryPath=N;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["z","path","os","path","record: PortRegistryRecord","fs","payload: PortRegistryState","lockState: LockState","os","net","payload: PortAllocationResponse"],"sources":["../src/types/index.ts","../src/utils/index.ts","../src/services/PortRegistryService.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const REGISTRY_VERSION = 1 as const;\n\nexport const ServiceCategorySchema = z.enum(['service', 'tool']);\n\nexport const ServiceMetadataSchema = z.record(z.string(), z.unknown());\n\nexport const PortRegistryRecordSchema = z.object({\n repositoryPath: z.string().trim().min(1, 'repositoryPath is required'),\n serviceName: z.string().trim().min(1, 'serviceName is required'),\n serviceType: ServiceCategorySchema,\n environment: z.string().trim().min(1).optional(),\n pid: z.number().int().min(1).optional(),\n port: z.number().int().min(1).max(65535),\n host: z.string().trim().min(1).default('127.0.0.1'),\n metadata: ServiceMetadataSchema.optional(),\n createdAt: z.string().trim().min(1),\n updatedAt: z.string().trim().min(1),\n});\n\nexport const PortRegistryStateSchema = z.object({\n version: z.literal(REGISTRY_VERSION),\n updatedAt: z.string().trim().min(1),\n entries: z.array(PortRegistryRecordSchema),\n});\n\nexport const PortAllocationRangeSchema = z\n .object({\n min: z.number().int().min(1).max(65535),\n max: z.number().int().min(1).max(65535),\n })\n .refine((range) => range.min <= range.max, {\n message: 'Port range min must be less than or equal to max',\n path: ['min'],\n });\n\nexport const ReservePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.default('service'),\n environment: z.string().trim().min(1).optional(),\n pid: z.number().int().min(1).optional(),\n portRange: PortAllocationRangeSchema.optional(),\n preferredPort: z.number().int().min(1).max(65535).optional(),\n host: z.string().trim().min(1).optional(),\n metadata: ServiceMetadataSchema.optional(),\n force: z.boolean().optional(),\n});\n\nexport const ReleasePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n pid: z.number().int().min(1).optional(),\n environment: z.string().trim().min(1).optional(),\n force: z.boolean().optional(),\n});\n\nexport const GetPortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n environment: z.string().trim().min(1).optional(),\n});\n\nexport const FindAvailablePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n environment: z.string().trim().min(1).optional(),\n portRange: PortAllocationRangeSchema.optional(),\n preferredPort: z.number().int().min(1).max(65535).optional(),\n host: z.string().trim().min(1).default('127.0.0.1'),\n});\n\nexport const PortAllocationResponseSchema = z.object({\n success: z.boolean(),\n port: z.number().int().min(1).max(65535).optional(),\n record: PortRegistryRecordSchema.optional(),\n error: z.string().optional(),\n});\n\nexport const PortUsageListFiltersSchema = z.object({\n repositoryPath: z.string().trim().min(1).optional(),\n serviceType: ServiceCategorySchema.optional(),\n serviceName: z.string().trim().min(1).optional(),\n environment: z.string().trim().min(1).optional(),\n});\n\nexport type ServiceCategory = z.infer<typeof ServiceCategorySchema>;\nexport type ServiceMetadata = z.infer<typeof ServiceMetadataSchema>;\nexport type PortRegistryRecord = z.infer<typeof PortRegistryRecordSchema>;\nexport type PortRegistryState = z.infer<typeof PortRegistryStateSchema>;\nexport type PortAllocationRange = z.infer<typeof PortAllocationRangeSchema>;\nexport type ReservePortRequest = z.infer<typeof ReservePortRequestSchema>;\nexport type ReleasePortRequest = z.infer<typeof ReleasePortRequestSchema>;\nexport type GetPortRequest = z.infer<typeof GetPortRequestSchema>;\nexport type FindAvailablePortRequest = z.infer<typeof FindAvailablePortRequestSchema>;\nexport type PortAllocationResponse = z.infer<typeof PortAllocationResponseSchema>;\nexport type PortUsageListFilters = z.infer<typeof PortUsageListFiltersSchema>;\n\nexport type PortRegistryErrorCode =\n | 'INVALID_REQUEST'\n | 'REGISTRY_READ_FAILED'\n | 'REGISTRY_WRITE_FAILED'\n | 'REGISTRY_LOCK_FAILED'\n | 'PORT_NOT_AVAILABLE'\n | 'NO_PORT_FOUND';\n\nexport class PortRegistryError extends Error {\n readonly code: PortRegistryErrorCode;\n\n constructor(message: string, code: PortRegistryErrorCode, options?: ErrorOptions) {\n super(message, options);\n this.name = 'PortRegistryError';\n this.code = code;\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const DEFAULT_REGISTRY_PATH = path.join(os.homedir(), '.port-registry', 'ports.json');\nexport const DEFAULT_REGISTRY_LOCK_PATH = `${DEFAULT_REGISTRY_PATH}.lock`;\nexport const LOCK_RETRY_DELAY_MS = 75;\nexport const LOCK_MAX_RETRIES = 80;\nexport const DEFAULT_PORT_RANGE = { min: 3000, max: 4999 };\nexport const DEFAULT_HOST = '127.0.0.1';\n\nexport const normalizeRepositoryPath = (value: string): string => path.resolve(value);\n\nexport const makeTempPath = (filePath: string): string => {\n const random = randomBytes(6).toString('hex');\n return `${filePath}.${random}.tmp`;\n};\n\nexport const isPortInRange = (port: number, range: { min: number; max: number }): boolean =>\n port >= range.min && port <= range.max;\n","import { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n type FindAvailablePortRequest,\n FindAvailablePortRequestSchema,\n type GetPortRequest,\n GetPortRequestSchema,\n type PortAllocationRange,\n type PortAllocationResponse,\n PortAllocationResponseSchema,\n PortRegistryError,\n type PortRegistryRecord,\n type PortRegistryState,\n PortRegistryStateSchema,\n type PortUsageListFilters,\n REGISTRY_VERSION,\n type ReleasePortRequest,\n ReleasePortRequestSchema,\n type ReservePortRequest,\n ReservePortRequestSchema,\n} from '../types';\nimport {\n DEFAULT_HOST,\n DEFAULT_PORT_RANGE,\n DEFAULT_REGISTRY_PATH,\n isPortInRange,\n LOCK_MAX_RETRIES,\n LOCK_RETRY_DELAY_MS,\n makeTempPath,\n normalizeRepositoryPath,\n} from '../utils';\n\ninterface LockState {\n pid: number;\n token: string;\n createdAt: string;\n}\n\ninterface NormalizedFilters {\n repositoryPath: string;\n serviceName: string;\n serviceType: 'service' | 'tool';\n environment?: string;\n}\n\n/**\n * Service for managing a shared port registry across worktrees and services.\n */\nexport class PortRegistryService {\n private readonly registryPath: string;\n private readonly lockPath: string;\n\n constructor(registryPath: string = DEFAULT_REGISTRY_PATH, lockPath?: string) {\n this.registryPath = PortRegistryService.resolveRegistryPath(registryPath);\n this.lockPath = lockPath ?? `${this.registryPath}.lock`;\n }\n\n /**\n * Resolve registry path with fallback handling for directory inputs.\n */\n static resolveRegistryPath(inputPath?: string): string {\n if (!inputPath) {\n return DEFAULT_REGISTRY_PATH;\n }\n\n const resolvedPath = path.isAbsolute(inputPath) ? inputPath : path.join(process.cwd(), inputPath);\n if (path.extname(resolvedPath) === '.json') {\n return resolvedPath;\n }\n\n return path.join(resolvedPath, 'ports.json');\n }\n\n /**\n * Find a matching port allocation for the requested service.\n */\n async getPort(rawRequest: GetPortRequest): Promise<PortAllocationResponse> {\n const request = GetPortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n const match = this.findEntry(registry, {\n repositoryPath: normalizeRepositoryPath(request.repositoryPath),\n serviceName: request.serviceName,\n serviceType: request.serviceType ?? 'service',\n environment: request.environment,\n });\n\n if (!match) {\n return this.createFailureResponse(`No allocation found for ${request.serviceName} in requested scope`);\n }\n\n return this.createSuccessResponse(match.port, match);\n });\n }\n\n /**\n * Find an available port without creating or updating state.\n */\n async findAvailablePort(rawRequest: FindAvailablePortRequest): Promise<PortAllocationResponse> {\n const request = FindAvailablePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const range = request.portRange ?? DEFAULT_PORT_RANGE;\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n const reserved = this.getReservedPorts(registry, {\n repositoryPath: normalizeRepositoryPath(request.repositoryPath),\n serviceName: request.serviceName,\n serviceType: request.serviceType ?? 'service',\n environment: request.environment,\n });\n\n const availablePort = await this.findAvailablePortInternal(range, request.preferredPort, reserved, request.host);\n if (availablePort === null) {\n return this.createFailureResponse(`No available port found in range ${range.min}-${range.max}`);\n }\n\n return this.createSuccessResponse(availablePort);\n });\n }\n\n /**\n * Reserve a port for a service. Reuses existing matching record if available.\n */\n async reservePort(rawRequest: ReservePortRequest): Promise<PortAllocationResponse> {\n const request = ReservePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const normalizedRepo = normalizeRepositoryPath(request.repositoryPath);\n const serviceType = request.serviceType ?? 'service';\n const environment = request.environment ?? process.env.NODE_ENV ?? 'development';\n const host = request.host ?? DEFAULT_HOST;\n const range = request.portRange ?? DEFAULT_PORT_RANGE;\n const force = request.force ?? false;\n\n const registry = await this.pruneMissingRepositories(state);\n\n const existing = this.findEntry(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n\n if (existing && !force) {\n if (isPortInRange(existing.port, range)) {\n const available = await this.isPortAvailable(existing.port, host);\n if (available) {\n existing.updatedAt = new Date().toISOString();\n await this.saveState(registry);\n return this.createSuccessResponse(existing.port, existing);\n }\n }\n\n this.removeMatchingEntries(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n }\n\n if (existing && force) {\n this.removeMatchingEntries(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n }\n\n const reserved = this.getReservedPorts(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n\n const preferredPort = request.preferredPort;\n const availablePort = await this.findAvailablePortInternal(range, preferredPort, reserved, host);\n if (availablePort === null) {\n return this.createFailureResponse(`No available port found in range ${range.min}-${range.max}`);\n }\n\n const now = new Date().toISOString();\n const record: PortRegistryRecord = {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n pid: request.pid,\n port: availablePort,\n host,\n metadata: request.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n registry.entries.push(record);\n await this.saveState(registry);\n return this.createSuccessResponse(availablePort, record);\n });\n }\n\n /**\n * Release matching entries from the registry.\n */\n async releasePort(rawRequest: ReleasePortRequest): Promise<PortAllocationResponse> {\n const request = ReleasePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const normalizedRepo = normalizeRepositoryPath(request.repositoryPath);\n const serviceType = request.serviceType ?? 'service';\n const environment = request.environment ?? process.env.NODE_ENV ?? 'development';\n const before = state.entries.length;\n let matched = false;\n\n state.entries = state.entries.filter((entry) => {\n const isMatch =\n entry.repositoryPath === normalizedRepo &&\n entry.serviceName === request.serviceName &&\n entry.serviceType === serviceType &&\n (request.environment ? entry.environment === environment : true);\n\n if (isMatch) {\n const hasPidFilter = typeof request.pid === 'number';\n if (!request.force && hasPidFilter && entry.pid !== request.pid) {\n return true;\n }\n\n matched = true;\n return false;\n }\n\n return true;\n });\n\n if (!matched || state.entries.length === before) {\n return this.createFailureResponse(`No matching registry entry for ${request.serviceName}`);\n }\n\n await this.saveState(state);\n return this.createSuccessResponse();\n });\n }\n\n /**\n * List allocations, optionally filtered.\n */\n async listAllocations(filters: PortUsageListFilters = {}): Promise<PortRegistryRecord[]> {\n return this.withLock(async () => {\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n return [...registry.entries].filter((entry) => {\n if (filters.repositoryPath && entry.repositoryPath !== normalizeRepositoryPath(filters.repositoryPath))\n return false;\n if (filters.serviceType && entry.serviceType !== filters.serviceType) return false;\n if (filters.serviceName && entry.serviceName !== filters.serviceName) return false;\n if (filters.environment && entry.environment !== filters.environment) return false;\n return true;\n });\n });\n }\n\n private async withLock<T>(callback: () => Promise<T>): Promise<T> {\n const lockToken = `${process.pid}-${randomBytes(6).toString('hex')}`;\n await this.acquireLock(lockToken);\n\n try {\n return await callback();\n } finally {\n await this.releaseLock(lockToken);\n }\n }\n\n private async loadState(): Promise<PortRegistryState> {\n await fs.mkdir(path.dirname(this.registryPath), { recursive: true });\n\n try {\n const content = await fs.readFile(this.registryPath, 'utf-8');\n const parsed = JSON.parse(content);\n return PortRegistryStateSchema.parse(parsed);\n } catch (error) {\n const sysError = error as NodeJS.ErrnoException;\n if (sysError.code === 'ENOENT') {\n return {\n version: REGISTRY_VERSION,\n updatedAt: new Date().toISOString(),\n entries: [],\n };\n }\n\n if (sysError instanceof SyntaxError) {\n const backupPath = `${this.registryPath}.corrupt.${Date.now()}`;\n await fs.rename(this.registryPath, backupPath).catch(() => undefined);\n }\n\n throw new PortRegistryError(\n `Failed to read registry file: ${error instanceof Error ? error.message : String(error)}`,\n 'REGISTRY_READ_FAILED',\n {\n cause: error,\n },\n );\n }\n }\n\n private async saveState(state: PortRegistryState): Promise<void> {\n await fs.mkdir(path.dirname(this.registryPath), { recursive: true });\n\n const payload: PortRegistryState = {\n ...state,\n updatedAt: new Date().toISOString(),\n entries: [...state.entries],\n };\n\n const tempPath = makeTempPath(this.registryPath);\n await fs.writeFile(tempPath, JSON.stringify(payload, null, 2), 'utf-8');\n await fs.rename(tempPath, this.registryPath);\n }\n\n private async pruneMissingRepositories(state: PortRegistryState): Promise<PortRegistryState> {\n let changed = false;\n const entries = await Promise.all(\n state.entries.map(async (entry) => ({\n entry,\n exists: await this.pathExists(entry.repositoryPath),\n })),\n );\n\n const pruned = entries.filter((x) => x.exists).map((x) => x.entry);\n\n if (pruned.length !== state.entries.length) {\n changed = true;\n state.entries = pruned;\n }\n\n if (changed) {\n await this.saveState(state);\n }\n\n return state;\n }\n\n private async acquireLock(token: string): Promise<void> {\n await fs.mkdir(path.dirname(this.lockPath), { recursive: true });\n\n for (let attempt = 0; attempt < LOCK_MAX_RETRIES; attempt += 1) {\n try {\n const lockState: LockState = {\n pid: process.pid,\n token,\n createdAt: new Date().toISOString(),\n };\n await fs.writeFile(this.lockPath, JSON.stringify(lockState), { flag: 'wx' });\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw new PortRegistryError(\n `Failed to acquire registry lock: ${error instanceof Error ? error.message : String(error)}`,\n 'REGISTRY_LOCK_FAILED',\n { cause: error },\n );\n }\n\n const stale = await this.isStaleLock();\n if (stale) {\n await fs.unlink(this.lockPath).catch(() => undefined);\n attempt -= 1;\n continue;\n }\n\n await this.delay(LOCK_RETRY_DELAY_MS);\n }\n }\n\n throw new PortRegistryError('Unable to acquire registry lock (timeout)', 'REGISTRY_LOCK_FAILED');\n }\n\n private async releaseLock(token: string): Promise<void> {\n try {\n const existing = await fs.readFile(this.lockPath, 'utf-8');\n const parsed = JSON.parse(existing) as { token: string };\n if (parsed.token === token) {\n await fs.unlink(this.lockPath);\n }\n } catch {\n // ignore\n }\n }\n\n private async isStaleLock(): Promise<boolean> {\n try {\n const content = await fs.readFile(this.lockPath, 'utf-8');\n const parsed = JSON.parse(content) as LockState;\n\n if (parsed.pid) {\n const pidAlive = this.isProcessRunning(parsed.pid);\n if (pidAlive) {\n const age = Date.now() - new Date(parsed.createdAt).getTime();\n if (Number.isFinite(age) && age < 5000) {\n return false;\n }\n return false;\n }\n }\n\n return true;\n } catch {\n return true;\n }\n }\n\n private isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n private async pathExists(candidate: string): Promise<boolean> {\n try {\n await fs.access(candidate);\n return true;\n } catch {\n return false;\n }\n }\n\n private findEntry(state: PortRegistryState, filters: NormalizedFilters): PortRegistryRecord | undefined {\n return state.entries.find(\n (entry) =>\n entry.repositoryPath === filters.repositoryPath &&\n entry.serviceName === filters.serviceName &&\n entry.serviceType === filters.serviceType &&\n (filters.environment ? entry.environment === filters.environment : true),\n );\n }\n\n private removeMatchingEntries(state: PortRegistryState, filters: NormalizedFilters): void {\n state.entries = state.entries.filter(\n (entry) =>\n !(\n entry.repositoryPath === filters.repositoryPath &&\n entry.serviceName === filters.serviceName &&\n entry.serviceType === filters.serviceType &&\n (!filters.environment || entry.environment === filters.environment)\n ),\n );\n }\n\n private getReservedPorts(state: PortRegistryState, filters: NormalizedFilters): Set<number> {\n const set = new Set<number>();\n\n for (const entry of state.entries) {\n if (filters.environment && entry.environment !== filters.environment) {\n continue;\n }\n\n if (entry.serviceType === filters.serviceType) {\n set.add(entry.port);\n }\n }\n\n return set;\n }\n\n private async findAvailablePortInternal(\n portRange: PortAllocationRange,\n preferredPort: number | undefined,\n reservedPorts: Set<number>,\n host: string,\n ): Promise<number | null> {\n const candidates = [] as number[];\n\n if (preferredPort !== undefined && isPortInRange(preferredPort, portRange)) {\n candidates.push(preferredPort);\n }\n\n for (let port = portRange.min; port <= portRange.max; port += 1) {\n if (!candidates.includes(port)) {\n candidates.push(port);\n }\n }\n\n for (const candidate of candidates) {\n if (reservedPorts.has(candidate)) {\n continue;\n }\n\n const available = await this.isPortAvailable(candidate, host);\n if (available) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async isPortAvailable(port: number, host: string): Promise<boolean> {\n if (os.platform() === 'win32') {\n host = '127.0.0.1';\n }\n\n const candidateHosts = Array.from(\n new Set(\n [host, '127.0.0.1', '0.0.0.0', undefined, '::1'].filter((value): value is string | undefined => value !== null),\n ),\n );\n\n for (const candidateHost of candidateHosts) {\n const available = await this.isPortAvailableOnHost(port, candidateHost);\n if (!available) {\n return false;\n }\n }\n\n return true;\n }\n\n private async isPortAvailableOnHost(port: number, host?: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => {\n resolve(false);\n });\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n if (host) {\n server.listen(port, host);\n } else {\n server.listen(port);\n }\n });\n }\n\n private createSuccessResponse(port?: number, record?: PortRegistryRecord): PortAllocationResponse {\n const payload: PortAllocationResponse = {\n success: true,\n };\n\n if (port !== undefined) {\n payload.port = port;\n }\n\n if (record !== undefined) {\n (payload as Record<string, unknown>).record = record;\n }\n\n return PortAllocationResponseSchema.parse(payload);\n }\n\n private createFailureResponse(error: string): PortAllocationResponse {\n return PortAllocationResponseSchema.parse({\n success: false,\n error,\n });\n }\n\n private async delay(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/types/index.d.ts
4
+ declare const REGISTRY_VERSION: 1;
5
+ declare const ServiceCategorySchema: z.ZodEnum<{
6
+ service: "service";
7
+ tool: "tool";
8
+ }>;
9
+ declare const ServiceMetadataSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
10
+ declare const PortRegistryRecordSchema: z.ZodObject<{
11
+ repositoryPath: z.ZodString;
12
+ serviceName: z.ZodString;
13
+ serviceType: z.ZodEnum<{
14
+ service: "service";
15
+ tool: "tool";
16
+ }>;
17
+ environment: z.ZodOptional<z.ZodString>;
18
+ pid: z.ZodOptional<z.ZodNumber>;
19
+ port: z.ZodNumber;
20
+ host: z.ZodDefault<z.ZodString>;
21
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
+ createdAt: z.ZodString;
23
+ updatedAt: z.ZodString;
24
+ }, z.core.$strip>;
25
+ declare const PortRegistryStateSchema: z.ZodObject<{
26
+ version: z.ZodLiteral<1>;
27
+ updatedAt: z.ZodString;
28
+ entries: z.ZodArray<z.ZodObject<{
29
+ repositoryPath: z.ZodString;
30
+ serviceName: z.ZodString;
31
+ serviceType: z.ZodEnum<{
32
+ service: "service";
33
+ tool: "tool";
34
+ }>;
35
+ environment: z.ZodOptional<z.ZodString>;
36
+ pid: z.ZodOptional<z.ZodNumber>;
37
+ port: z.ZodNumber;
38
+ host: z.ZodDefault<z.ZodString>;
39
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
40
+ createdAt: z.ZodString;
41
+ updatedAt: z.ZodString;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ declare const PortAllocationRangeSchema: z.ZodObject<{
45
+ min: z.ZodNumber;
46
+ max: z.ZodNumber;
47
+ }, z.core.$strip>;
48
+ declare const ReservePortRequestSchema: z.ZodObject<{
49
+ repositoryPath: z.ZodString;
50
+ serviceName: z.ZodString;
51
+ serviceType: z.ZodDefault<z.ZodEnum<{
52
+ service: "service";
53
+ tool: "tool";
54
+ }>>;
55
+ environment: z.ZodOptional<z.ZodString>;
56
+ pid: z.ZodOptional<z.ZodNumber>;
57
+ portRange: z.ZodOptional<z.ZodObject<{
58
+ min: z.ZodNumber;
59
+ max: z.ZodNumber;
60
+ }, z.core.$strip>>;
61
+ preferredPort: z.ZodOptional<z.ZodNumber>;
62
+ host: z.ZodOptional<z.ZodString>;
63
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
64
+ force: z.ZodOptional<z.ZodBoolean>;
65
+ }, z.core.$strip>;
66
+ declare const ReleasePortRequestSchema: z.ZodObject<{
67
+ repositoryPath: z.ZodString;
68
+ serviceName: z.ZodString;
69
+ serviceType: z.ZodOptional<z.ZodEnum<{
70
+ service: "service";
71
+ tool: "tool";
72
+ }>>;
73
+ pid: z.ZodOptional<z.ZodNumber>;
74
+ environment: z.ZodOptional<z.ZodString>;
75
+ force: z.ZodOptional<z.ZodBoolean>;
76
+ }, z.core.$strip>;
77
+ declare const GetPortRequestSchema: z.ZodObject<{
78
+ repositoryPath: z.ZodString;
79
+ serviceName: z.ZodString;
80
+ serviceType: z.ZodOptional<z.ZodEnum<{
81
+ service: "service";
82
+ tool: "tool";
83
+ }>>;
84
+ environment: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>;
86
+ declare const FindAvailablePortRequestSchema: z.ZodObject<{
87
+ repositoryPath: z.ZodString;
88
+ serviceName: z.ZodString;
89
+ serviceType: z.ZodOptional<z.ZodEnum<{
90
+ service: "service";
91
+ tool: "tool";
92
+ }>>;
93
+ environment: z.ZodOptional<z.ZodString>;
94
+ portRange: z.ZodOptional<z.ZodObject<{
95
+ min: z.ZodNumber;
96
+ max: z.ZodNumber;
97
+ }, z.core.$strip>>;
98
+ preferredPort: z.ZodOptional<z.ZodNumber>;
99
+ host: z.ZodDefault<z.ZodString>;
100
+ }, z.core.$strip>;
101
+ declare const PortAllocationResponseSchema: z.ZodObject<{
102
+ success: z.ZodBoolean;
103
+ port: z.ZodOptional<z.ZodNumber>;
104
+ record: z.ZodOptional<z.ZodObject<{
105
+ repositoryPath: z.ZodString;
106
+ serviceName: z.ZodString;
107
+ serviceType: z.ZodEnum<{
108
+ service: "service";
109
+ tool: "tool";
110
+ }>;
111
+ environment: z.ZodOptional<z.ZodString>;
112
+ pid: z.ZodOptional<z.ZodNumber>;
113
+ port: z.ZodNumber;
114
+ host: z.ZodDefault<z.ZodString>;
115
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
116
+ createdAt: z.ZodString;
117
+ updatedAt: z.ZodString;
118
+ }, z.core.$strip>>;
119
+ error: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strip>;
121
+ declare const PortUsageListFiltersSchema: z.ZodObject<{
122
+ repositoryPath: z.ZodOptional<z.ZodString>;
123
+ serviceType: z.ZodOptional<z.ZodEnum<{
124
+ service: "service";
125
+ tool: "tool";
126
+ }>>;
127
+ serviceName: z.ZodOptional<z.ZodString>;
128
+ environment: z.ZodOptional<z.ZodString>;
129
+ }, z.core.$strip>;
130
+ type ServiceCategory = z.infer<typeof ServiceCategorySchema>;
131
+ type ServiceMetadata = z.infer<typeof ServiceMetadataSchema>;
132
+ type PortRegistryRecord = z.infer<typeof PortRegistryRecordSchema>;
133
+ type PortRegistryState = z.infer<typeof PortRegistryStateSchema>;
134
+ type PortAllocationRange = z.infer<typeof PortAllocationRangeSchema>;
135
+ type ReservePortRequest = z.infer<typeof ReservePortRequestSchema>;
136
+ type ReleasePortRequest = z.infer<typeof ReleasePortRequestSchema>;
137
+ type GetPortRequest = z.infer<typeof GetPortRequestSchema>;
138
+ type FindAvailablePortRequest = z.infer<typeof FindAvailablePortRequestSchema>;
139
+ type PortAllocationResponse = z.infer<typeof PortAllocationResponseSchema>;
140
+ type PortUsageListFilters = z.infer<typeof PortUsageListFiltersSchema>;
141
+ type PortRegistryErrorCode = 'INVALID_REQUEST' | 'REGISTRY_READ_FAILED' | 'REGISTRY_WRITE_FAILED' | 'REGISTRY_LOCK_FAILED' | 'PORT_NOT_AVAILABLE' | 'NO_PORT_FOUND';
142
+ declare class PortRegistryError extends Error {
143
+ readonly code: PortRegistryErrorCode;
144
+ constructor(message: string, code: PortRegistryErrorCode, options?: ErrorOptions);
145
+ }
146
+ //#endregion
147
+ //#region src/services/PortRegistryService.d.ts
148
+ /**
149
+ * Service for managing a shared port registry across worktrees and services.
150
+ */
151
+ declare class PortRegistryService {
152
+ private readonly registryPath;
153
+ private readonly lockPath;
154
+ constructor(registryPath?: string, lockPath?: string);
155
+ /**
156
+ * Resolve registry path with fallback handling for directory inputs.
157
+ */
158
+ static resolveRegistryPath(inputPath?: string): string;
159
+ /**
160
+ * Find a matching port allocation for the requested service.
161
+ */
162
+ getPort(rawRequest: GetPortRequest): Promise<PortAllocationResponse>;
163
+ /**
164
+ * Find an available port without creating or updating state.
165
+ */
166
+ findAvailablePort(rawRequest: FindAvailablePortRequest): Promise<PortAllocationResponse>;
167
+ /**
168
+ * Reserve a port for a service. Reuses existing matching record if available.
169
+ */
170
+ reservePort(rawRequest: ReservePortRequest): Promise<PortAllocationResponse>;
171
+ /**
172
+ * Release matching entries from the registry.
173
+ */
174
+ releasePort(rawRequest: ReleasePortRequest): Promise<PortAllocationResponse>;
175
+ /**
176
+ * List allocations, optionally filtered.
177
+ */
178
+ listAllocations(filters?: PortUsageListFilters): Promise<PortRegistryRecord[]>;
179
+ private withLock;
180
+ private loadState;
181
+ private saveState;
182
+ private pruneMissingRepositories;
183
+ private acquireLock;
184
+ private releaseLock;
185
+ private isStaleLock;
186
+ private isProcessRunning;
187
+ private pathExists;
188
+ private findEntry;
189
+ private removeMatchingEntries;
190
+ private getReservedPorts;
191
+ private findAvailablePortInternal;
192
+ private isPortAvailable;
193
+ private isPortAvailableOnHost;
194
+ private createSuccessResponse;
195
+ private createFailureResponse;
196
+ private delay;
197
+ }
198
+ //#endregion
199
+ //#region src/utils/index.d.ts
200
+ declare const DEFAULT_REGISTRY_PATH: string;
201
+ declare const DEFAULT_REGISTRY_LOCK_PATH: string;
202
+ declare const LOCK_RETRY_DELAY_MS = 75;
203
+ declare const LOCK_MAX_RETRIES = 80;
204
+ declare const DEFAULT_PORT_RANGE: {
205
+ min: number;
206
+ max: number;
207
+ };
208
+ declare const DEFAULT_HOST = "127.0.0.1";
209
+ declare const normalizeRepositoryPath: (value: string) => string;
210
+ declare const makeTempPath: (filePath: string) => string;
211
+ declare const isPortInRange: (port: number, range: {
212
+ min: number;
213
+ max: number;
214
+ }) => boolean;
215
+ //#endregion
216
+ export { DEFAULT_HOST, DEFAULT_PORT_RANGE, DEFAULT_REGISTRY_LOCK_PATH, DEFAULT_REGISTRY_PATH, FindAvailablePortRequest, FindAvailablePortRequestSchema, GetPortRequest, GetPortRequestSchema, LOCK_MAX_RETRIES, LOCK_RETRY_DELAY_MS, PortAllocationRange, PortAllocationRangeSchema, PortAllocationResponse, PortAllocationResponseSchema, PortRegistryError, PortRegistryErrorCode, PortRegistryRecord, PortRegistryRecordSchema, PortRegistryService, PortRegistryState, PortRegistryStateSchema, PortUsageListFilters, PortUsageListFiltersSchema, REGISTRY_VERSION, ReleasePortRequest, ReleasePortRequestSchema, ReservePortRequest, ReservePortRequestSchema, ServiceCategory, ServiceCategorySchema, ServiceMetadata, ServiceMetadataSchema, isPortInRange, makeTempPath, normalizeRepositoryPath };
217
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types/index.ts","../src/services/PortRegistryService.ts","../src/utils/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/types/index.d.ts
4
+ declare const REGISTRY_VERSION: 1;
5
+ declare const ServiceCategorySchema: z.ZodEnum<{
6
+ service: "service";
7
+ tool: "tool";
8
+ }>;
9
+ declare const ServiceMetadataSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
10
+ declare const PortRegistryRecordSchema: z.ZodObject<{
11
+ repositoryPath: z.ZodString;
12
+ serviceName: z.ZodString;
13
+ serviceType: z.ZodEnum<{
14
+ service: "service";
15
+ tool: "tool";
16
+ }>;
17
+ environment: z.ZodOptional<z.ZodString>;
18
+ pid: z.ZodOptional<z.ZodNumber>;
19
+ port: z.ZodNumber;
20
+ host: z.ZodDefault<z.ZodString>;
21
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
22
+ createdAt: z.ZodString;
23
+ updatedAt: z.ZodString;
24
+ }, z.core.$strip>;
25
+ declare const PortRegistryStateSchema: z.ZodObject<{
26
+ version: z.ZodLiteral<1>;
27
+ updatedAt: z.ZodString;
28
+ entries: z.ZodArray<z.ZodObject<{
29
+ repositoryPath: z.ZodString;
30
+ serviceName: z.ZodString;
31
+ serviceType: z.ZodEnum<{
32
+ service: "service";
33
+ tool: "tool";
34
+ }>;
35
+ environment: z.ZodOptional<z.ZodString>;
36
+ pid: z.ZodOptional<z.ZodNumber>;
37
+ port: z.ZodNumber;
38
+ host: z.ZodDefault<z.ZodString>;
39
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
40
+ createdAt: z.ZodString;
41
+ updatedAt: z.ZodString;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ declare const PortAllocationRangeSchema: z.ZodObject<{
45
+ min: z.ZodNumber;
46
+ max: z.ZodNumber;
47
+ }, z.core.$strip>;
48
+ declare const ReservePortRequestSchema: z.ZodObject<{
49
+ repositoryPath: z.ZodString;
50
+ serviceName: z.ZodString;
51
+ serviceType: z.ZodDefault<z.ZodEnum<{
52
+ service: "service";
53
+ tool: "tool";
54
+ }>>;
55
+ environment: z.ZodOptional<z.ZodString>;
56
+ pid: z.ZodOptional<z.ZodNumber>;
57
+ portRange: z.ZodOptional<z.ZodObject<{
58
+ min: z.ZodNumber;
59
+ max: z.ZodNumber;
60
+ }, z.core.$strip>>;
61
+ preferredPort: z.ZodOptional<z.ZodNumber>;
62
+ host: z.ZodOptional<z.ZodString>;
63
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
64
+ force: z.ZodOptional<z.ZodBoolean>;
65
+ }, z.core.$strip>;
66
+ declare const ReleasePortRequestSchema: z.ZodObject<{
67
+ repositoryPath: z.ZodString;
68
+ serviceName: z.ZodString;
69
+ serviceType: z.ZodOptional<z.ZodEnum<{
70
+ service: "service";
71
+ tool: "tool";
72
+ }>>;
73
+ pid: z.ZodOptional<z.ZodNumber>;
74
+ environment: z.ZodOptional<z.ZodString>;
75
+ force: z.ZodOptional<z.ZodBoolean>;
76
+ }, z.core.$strip>;
77
+ declare const GetPortRequestSchema: z.ZodObject<{
78
+ repositoryPath: z.ZodString;
79
+ serviceName: z.ZodString;
80
+ serviceType: z.ZodOptional<z.ZodEnum<{
81
+ service: "service";
82
+ tool: "tool";
83
+ }>>;
84
+ environment: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>;
86
+ declare const FindAvailablePortRequestSchema: z.ZodObject<{
87
+ repositoryPath: z.ZodString;
88
+ serviceName: z.ZodString;
89
+ serviceType: z.ZodOptional<z.ZodEnum<{
90
+ service: "service";
91
+ tool: "tool";
92
+ }>>;
93
+ environment: z.ZodOptional<z.ZodString>;
94
+ portRange: z.ZodOptional<z.ZodObject<{
95
+ min: z.ZodNumber;
96
+ max: z.ZodNumber;
97
+ }, z.core.$strip>>;
98
+ preferredPort: z.ZodOptional<z.ZodNumber>;
99
+ host: z.ZodDefault<z.ZodString>;
100
+ }, z.core.$strip>;
101
+ declare const PortAllocationResponseSchema: z.ZodObject<{
102
+ success: z.ZodBoolean;
103
+ port: z.ZodOptional<z.ZodNumber>;
104
+ record: z.ZodOptional<z.ZodObject<{
105
+ repositoryPath: z.ZodString;
106
+ serviceName: z.ZodString;
107
+ serviceType: z.ZodEnum<{
108
+ service: "service";
109
+ tool: "tool";
110
+ }>;
111
+ environment: z.ZodOptional<z.ZodString>;
112
+ pid: z.ZodOptional<z.ZodNumber>;
113
+ port: z.ZodNumber;
114
+ host: z.ZodDefault<z.ZodString>;
115
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
116
+ createdAt: z.ZodString;
117
+ updatedAt: z.ZodString;
118
+ }, z.core.$strip>>;
119
+ error: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strip>;
121
+ declare const PortUsageListFiltersSchema: z.ZodObject<{
122
+ repositoryPath: z.ZodOptional<z.ZodString>;
123
+ serviceType: z.ZodOptional<z.ZodEnum<{
124
+ service: "service";
125
+ tool: "tool";
126
+ }>>;
127
+ serviceName: z.ZodOptional<z.ZodString>;
128
+ environment: z.ZodOptional<z.ZodString>;
129
+ }, z.core.$strip>;
130
+ type ServiceCategory = z.infer<typeof ServiceCategorySchema>;
131
+ type ServiceMetadata = z.infer<typeof ServiceMetadataSchema>;
132
+ type PortRegistryRecord = z.infer<typeof PortRegistryRecordSchema>;
133
+ type PortRegistryState = z.infer<typeof PortRegistryStateSchema>;
134
+ type PortAllocationRange = z.infer<typeof PortAllocationRangeSchema>;
135
+ type ReservePortRequest = z.infer<typeof ReservePortRequestSchema>;
136
+ type ReleasePortRequest = z.infer<typeof ReleasePortRequestSchema>;
137
+ type GetPortRequest = z.infer<typeof GetPortRequestSchema>;
138
+ type FindAvailablePortRequest = z.infer<typeof FindAvailablePortRequestSchema>;
139
+ type PortAllocationResponse = z.infer<typeof PortAllocationResponseSchema>;
140
+ type PortUsageListFilters = z.infer<typeof PortUsageListFiltersSchema>;
141
+ type PortRegistryErrorCode = 'INVALID_REQUEST' | 'REGISTRY_READ_FAILED' | 'REGISTRY_WRITE_FAILED' | 'REGISTRY_LOCK_FAILED' | 'PORT_NOT_AVAILABLE' | 'NO_PORT_FOUND';
142
+ declare class PortRegistryError extends Error {
143
+ readonly code: PortRegistryErrorCode;
144
+ constructor(message: string, code: PortRegistryErrorCode, options?: ErrorOptions);
145
+ }
146
+ //#endregion
147
+ //#region src/services/PortRegistryService.d.ts
148
+ /**
149
+ * Service for managing a shared port registry across worktrees and services.
150
+ */
151
+ declare class PortRegistryService {
152
+ private readonly registryPath;
153
+ private readonly lockPath;
154
+ constructor(registryPath?: string, lockPath?: string);
155
+ /**
156
+ * Resolve registry path with fallback handling for directory inputs.
157
+ */
158
+ static resolveRegistryPath(inputPath?: string): string;
159
+ /**
160
+ * Find a matching port allocation for the requested service.
161
+ */
162
+ getPort(rawRequest: GetPortRequest): Promise<PortAllocationResponse>;
163
+ /**
164
+ * Find an available port without creating or updating state.
165
+ */
166
+ findAvailablePort(rawRequest: FindAvailablePortRequest): Promise<PortAllocationResponse>;
167
+ /**
168
+ * Reserve a port for a service. Reuses existing matching record if available.
169
+ */
170
+ reservePort(rawRequest: ReservePortRequest): Promise<PortAllocationResponse>;
171
+ /**
172
+ * Release matching entries from the registry.
173
+ */
174
+ releasePort(rawRequest: ReleasePortRequest): Promise<PortAllocationResponse>;
175
+ /**
176
+ * List allocations, optionally filtered.
177
+ */
178
+ listAllocations(filters?: PortUsageListFilters): Promise<PortRegistryRecord[]>;
179
+ private withLock;
180
+ private loadState;
181
+ private saveState;
182
+ private pruneMissingRepositories;
183
+ private acquireLock;
184
+ private releaseLock;
185
+ private isStaleLock;
186
+ private isProcessRunning;
187
+ private pathExists;
188
+ private findEntry;
189
+ private removeMatchingEntries;
190
+ private getReservedPorts;
191
+ private findAvailablePortInternal;
192
+ private isPortAvailable;
193
+ private isPortAvailableOnHost;
194
+ private createSuccessResponse;
195
+ private createFailureResponse;
196
+ private delay;
197
+ }
198
+ //#endregion
199
+ //#region src/utils/index.d.ts
200
+ declare const DEFAULT_REGISTRY_PATH: string;
201
+ declare const DEFAULT_REGISTRY_LOCK_PATH: string;
202
+ declare const LOCK_RETRY_DELAY_MS = 75;
203
+ declare const LOCK_MAX_RETRIES = 80;
204
+ declare const DEFAULT_PORT_RANGE: {
205
+ min: number;
206
+ max: number;
207
+ };
208
+ declare const DEFAULT_HOST = "127.0.0.1";
209
+ declare const normalizeRepositoryPath: (value: string) => string;
210
+ declare const makeTempPath: (filePath: string) => string;
211
+ declare const isPortInRange: (port: number, range: {
212
+ min: number;
213
+ max: number;
214
+ }) => boolean;
215
+ //#endregion
216
+ export { DEFAULT_HOST, DEFAULT_PORT_RANGE, DEFAULT_REGISTRY_LOCK_PATH, DEFAULT_REGISTRY_PATH, FindAvailablePortRequest, FindAvailablePortRequestSchema, GetPortRequest, GetPortRequestSchema, LOCK_MAX_RETRIES, LOCK_RETRY_DELAY_MS, PortAllocationRange, PortAllocationRangeSchema, PortAllocationResponse, PortAllocationResponseSchema, PortRegistryError, PortRegistryErrorCode, PortRegistryRecord, PortRegistryRecordSchema, PortRegistryService, PortRegistryState, PortRegistryStateSchema, PortUsageListFilters, PortUsageListFiltersSchema, REGISTRY_VERSION, ReleasePortRequest, ReleasePortRequestSchema, ReservePortRequest, ReservePortRequestSchema, ServiceCategory, ServiceCategorySchema, ServiceMetadata, ServiceMetadataSchema, isPortInRange, makeTempPath, normalizeRepositoryPath };
217
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/index.ts","../src/services/PortRegistryService.ts","../src/utils/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import{randomBytes as e}from"node:crypto";import t from"node:fs/promises";import n from"node:net";import r from"node:os";import i from"node:path";import{z as a}from"zod";const o=1,s=a.enum([`service`,`tool`]),c=a.record(a.string(),a.unknown()),l=a.object({repositoryPath:a.string().trim().min(1,`repositoryPath is required`),serviceName:a.string().trim().min(1,`serviceName is required`),serviceType:s,environment:a.string().trim().min(1).optional(),pid:a.number().int().min(1).optional(),port:a.number().int().min(1).max(65535),host:a.string().trim().min(1).default(`127.0.0.1`),metadata:c.optional(),createdAt:a.string().trim().min(1),updatedAt:a.string().trim().min(1)}),u=a.object({version:a.literal(1),updatedAt:a.string().trim().min(1),entries:a.array(l)}),d=a.object({min:a.number().int().min(1).max(65535),max:a.number().int().min(1).max(65535)}).refine(e=>e.min<=e.max,{message:`Port range min must be less than or equal to max`,path:[`min`]}),f=a.object({repositoryPath:a.string().trim().min(1),serviceName:a.string().trim().min(1),serviceType:s.default(`service`),environment:a.string().trim().min(1).optional(),pid:a.number().int().min(1).optional(),portRange:d.optional(),preferredPort:a.number().int().min(1).max(65535).optional(),host:a.string().trim().min(1).optional(),metadata:c.optional(),force:a.boolean().optional()}),p=a.object({repositoryPath:a.string().trim().min(1),serviceName:a.string().trim().min(1),serviceType:s.optional(),pid:a.number().int().min(1).optional(),environment:a.string().trim().min(1).optional(),force:a.boolean().optional()}),m=a.object({repositoryPath:a.string().trim().min(1),serviceName:a.string().trim().min(1),serviceType:s.optional(),environment:a.string().trim().min(1).optional()}),h=a.object({repositoryPath:a.string().trim().min(1),serviceName:a.string().trim().min(1),serviceType:s.optional(),environment:a.string().trim().min(1).optional(),portRange:d.optional(),preferredPort:a.number().int().min(1).max(65535).optional(),host:a.string().trim().min(1).default(`127.0.0.1`)}),g=a.object({success:a.boolean(),port:a.number().int().min(1).max(65535).optional(),record:l.optional(),error:a.string().optional()}),_=a.object({repositoryPath:a.string().trim().min(1).optional(),serviceType:s.optional(),serviceName:a.string().trim().min(1).optional(),environment:a.string().trim().min(1).optional()});var v=class extends Error{code;constructor(e,t,n){super(e,n),this.name=`PortRegistryError`,this.code=t}};const y=i.join(r.homedir(),`.port-registry`,`ports.json`),b=`${y}.lock`,x=75,S=80,C={min:3e3,max:4999},w=`127.0.0.1`,T=e=>i.resolve(e),E=t=>`${t}.${e(6).toString(`hex`)}.tmp`,D=(e,t)=>e>=t.min&&e<=t.max;var O=class a{registryPath;lockPath;constructor(e=y,t){this.registryPath=a.resolveRegistryPath(e),this.lockPath=t??`${this.registryPath}.lock`}static resolveRegistryPath(e){if(!e)return y;let t=i.isAbsolute(e)?e:i.join(process.cwd(),e);return i.extname(t)===`.json`?t:i.join(t,`ports.json`)}async getPort(e){let t=m.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=await this.pruneMissingRepositories(e),r=this.findEntry(n,{repositoryPath:T(t.repositoryPath),serviceName:t.serviceName,serviceType:t.serviceType??`service`,environment:t.environment});return r?this.createSuccessResponse(r.port,r):this.createFailureResponse(`No allocation found for ${t.serviceName} in requested scope`)})}async findAvailablePort(e){let t=h.parse(e);return this.withLock(async()=>{let e=t.portRange??C,n=await this.loadState(),r=await this.pruneMissingRepositories(n),i=this.getReservedPorts(r,{repositoryPath:T(t.repositoryPath),serviceName:t.serviceName,serviceType:t.serviceType??`service`,environment:t.environment}),a=await this.findAvailablePortInternal(e,t.preferredPort,i,t.host);return a===null?this.createFailureResponse(`No available port found in range ${e.min}-${e.max}`):this.createSuccessResponse(a)})}async reservePort(e){let t=f.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=T(t.repositoryPath),r=t.serviceType??`service`,i=t.environment??process.env.NODE_ENV??`development`,a=t.host??w,o=t.portRange??C,s=t.force??!1,c=await this.pruneMissingRepositories(e),l=this.findEntry(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i});if(l&&!s){if(D(l.port,o)&&await this.isPortAvailable(l.port,a))return l.updatedAt=new Date().toISOString(),await this.saveState(c),this.createSuccessResponse(l.port,l);this.removeMatchingEntries(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i})}l&&s&&this.removeMatchingEntries(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i});let u=this.getReservedPorts(c,{repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i}),d=t.preferredPort,f=await this.findAvailablePortInternal(o,d,u,a);if(f===null)return this.createFailureResponse(`No available port found in range ${o.min}-${o.max}`);let p=new Date().toISOString(),m={repositoryPath:n,serviceName:t.serviceName,serviceType:r,environment:i,pid:t.pid,port:f,host:a,metadata:t.metadata,createdAt:p,updatedAt:p};return c.entries.push(m),await this.saveState(c),this.createSuccessResponse(f,m)})}async releasePort(e){let t=p.parse(e);return this.withLock(async()=>{let e=await this.loadState(),n=T(t.repositoryPath),r=t.serviceType??`service`,i=t.environment??process.env.NODE_ENV??`development`,a=e.entries.length,o=!1;return e.entries=e.entries.filter(e=>{if(e.repositoryPath===n&&e.serviceName===t.serviceName&&e.serviceType===r&&(!t.environment||e.environment===i)){let n=typeof t.pid==`number`;return!t.force&&n&&e.pid!==t.pid?!0:(o=!0,!1)}return!0}),!o||e.entries.length===a?this.createFailureResponse(`No matching registry entry for ${t.serviceName}`):(await this.saveState(e),this.createSuccessResponse())})}async listAllocations(e={}){return this.withLock(async()=>{let t=await this.loadState();return[...(await this.pruneMissingRepositories(t)).entries].filter(t=>!(e.repositoryPath&&t.repositoryPath!==T(e.repositoryPath)||e.serviceType&&t.serviceType!==e.serviceType||e.serviceName&&t.serviceName!==e.serviceName||e.environment&&t.environment!==e.environment))})}async withLock(t){let n=`${process.pid}-${e(6).toString(`hex`)}`;await this.acquireLock(n);try{return await t()}finally{await this.releaseLock(n)}}async loadState(){await t.mkdir(i.dirname(this.registryPath),{recursive:!0});try{let e=await t.readFile(this.registryPath,`utf-8`),n=JSON.parse(e);return u.parse(n)}catch(e){let n=e;if(n.code===`ENOENT`)return{version:1,updatedAt:new Date().toISOString(),entries:[]};if(n instanceof SyntaxError){let e=`${this.registryPath}.corrupt.${Date.now()}`;await t.rename(this.registryPath,e).catch(()=>void 0)}throw new v(`Failed to read registry file: ${e instanceof Error?e.message:String(e)}`,`REGISTRY_READ_FAILED`,{cause:e})}}async saveState(e){await t.mkdir(i.dirname(this.registryPath),{recursive:!0});let n={...e,updatedAt:new Date().toISOString(),entries:[...e.entries]},r=E(this.registryPath);await t.writeFile(r,JSON.stringify(n,null,2),`utf-8`),await t.rename(r,this.registryPath)}async pruneMissingRepositories(e){let t=!1,n=(await Promise.all(e.entries.map(async e=>({entry:e,exists:await this.pathExists(e.repositoryPath)})))).filter(e=>e.exists).map(e=>e.entry);return n.length!==e.entries.length&&(t=!0,e.entries=n),t&&await this.saveState(e),e}async acquireLock(e){await t.mkdir(i.dirname(this.lockPath),{recursive:!0});for(let n=0;n<80;n+=1)try{let n={pid:process.pid,token:e,createdAt:new Date().toISOString()};await t.writeFile(this.lockPath,JSON.stringify(n),{flag:`wx`});return}catch(e){if(e.code!==`EEXIST`)throw new v(`Failed to acquire registry lock: ${e instanceof Error?e.message:String(e)}`,`REGISTRY_LOCK_FAILED`,{cause:e});if(await this.isStaleLock()){await t.unlink(this.lockPath).catch(()=>void 0),--n;continue}await this.delay(75)}throw new v(`Unable to acquire registry lock (timeout)`,`REGISTRY_LOCK_FAILED`)}async releaseLock(e){try{let n=await t.readFile(this.lockPath,`utf-8`);JSON.parse(n).token===e&&await t.unlink(this.lockPath)}catch{}}async isStaleLock(){try{let e=await t.readFile(this.lockPath,`utf-8`),n=JSON.parse(e);return n.pid&&this.isProcessRunning(n.pid)?(Date.now()-new Date(n.createdAt).getTime(),!1):!0}catch{return!0}}isProcessRunning(e){try{return process.kill(e,0),!0}catch{return!1}}async pathExists(e){try{return await t.access(e),!0}catch{return!1}}findEntry(e,t){return e.entries.find(e=>e.repositoryPath===t.repositoryPath&&e.serviceName===t.serviceName&&e.serviceType===t.serviceType&&(t.environment?e.environment===t.environment:!0))}removeMatchingEntries(e,t){e.entries=e.entries.filter(e=>!(e.repositoryPath===t.repositoryPath&&e.serviceName===t.serviceName&&e.serviceType===t.serviceType&&(!t.environment||e.environment===t.environment)))}getReservedPorts(e,t){let n=new Set;for(let r of e.entries)t.environment&&r.environment!==t.environment||r.serviceType===t.serviceType&&n.add(r.port);return n}async findAvailablePortInternal(e,t,n,r){let i=[];t!==void 0&&D(t,e)&&i.push(t);for(let t=e.min;t<=e.max;t+=1)i.includes(t)||i.push(t);for(let e of i)if(!n.has(e)&&await this.isPortAvailable(e,r))return e;return null}async isPortAvailable(e,t){r.platform()===`win32`&&(t=`127.0.0.1`);let n=Array.from(new Set([t,`127.0.0.1`,`0.0.0.0`,void 0,`::1`].filter(e=>e!==null)));for(let t of n)if(!await this.isPortAvailableOnHost(e,t))return!1;return!0}async isPortAvailableOnHost(e,t){return new Promise(r=>{let i=n.createServer();i.once(`error`,()=>{r(!1)}),i.once(`listening`,()=>{i.close(()=>r(!0))}),t?i.listen(e,t):i.listen(e)})}createSuccessResponse(e,t){let n={success:!0};return e!==void 0&&(n.port=e),t!==void 0&&(n.record=t),g.parse(n)}createFailureResponse(e){return g.parse({success:!1,error:e})}async delay(e){await new Promise(t=>setTimeout(t,e))}};export{w as DEFAULT_HOST,C as DEFAULT_PORT_RANGE,b as DEFAULT_REGISTRY_LOCK_PATH,y as DEFAULT_REGISTRY_PATH,h as FindAvailablePortRequestSchema,m as GetPortRequestSchema,S as LOCK_MAX_RETRIES,x as LOCK_RETRY_DELAY_MS,d as PortAllocationRangeSchema,g as PortAllocationResponseSchema,v as PortRegistryError,l as PortRegistryRecordSchema,O as PortRegistryService,u as PortRegistryStateSchema,_ as PortUsageListFiltersSchema,o as REGISTRY_VERSION,p as ReleasePortRequestSchema,f as ReservePortRequestSchema,s as ServiceCategorySchema,c as ServiceMetadataSchema,D as isPortInRange,E as makeTempPath,T as normalizeRepositoryPath};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["record: PortRegistryRecord","payload: PortRegistryState","lockState: LockState","payload: PortAllocationResponse"],"sources":["../src/types/index.ts","../src/utils/index.ts","../src/services/PortRegistryService.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const REGISTRY_VERSION = 1 as const;\n\nexport const ServiceCategorySchema = z.enum(['service', 'tool']);\n\nexport const ServiceMetadataSchema = z.record(z.string(), z.unknown());\n\nexport const PortRegistryRecordSchema = z.object({\n repositoryPath: z.string().trim().min(1, 'repositoryPath is required'),\n serviceName: z.string().trim().min(1, 'serviceName is required'),\n serviceType: ServiceCategorySchema,\n environment: z.string().trim().min(1).optional(),\n pid: z.number().int().min(1).optional(),\n port: z.number().int().min(1).max(65535),\n host: z.string().trim().min(1).default('127.0.0.1'),\n metadata: ServiceMetadataSchema.optional(),\n createdAt: z.string().trim().min(1),\n updatedAt: z.string().trim().min(1),\n});\n\nexport const PortRegistryStateSchema = z.object({\n version: z.literal(REGISTRY_VERSION),\n updatedAt: z.string().trim().min(1),\n entries: z.array(PortRegistryRecordSchema),\n});\n\nexport const PortAllocationRangeSchema = z\n .object({\n min: z.number().int().min(1).max(65535),\n max: z.number().int().min(1).max(65535),\n })\n .refine((range) => range.min <= range.max, {\n message: 'Port range min must be less than or equal to max',\n path: ['min'],\n });\n\nexport const ReservePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.default('service'),\n environment: z.string().trim().min(1).optional(),\n pid: z.number().int().min(1).optional(),\n portRange: PortAllocationRangeSchema.optional(),\n preferredPort: z.number().int().min(1).max(65535).optional(),\n host: z.string().trim().min(1).optional(),\n metadata: ServiceMetadataSchema.optional(),\n force: z.boolean().optional(),\n});\n\nexport const ReleasePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n pid: z.number().int().min(1).optional(),\n environment: z.string().trim().min(1).optional(),\n force: z.boolean().optional(),\n});\n\nexport const GetPortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n environment: z.string().trim().min(1).optional(),\n});\n\nexport const FindAvailablePortRequestSchema = z.object({\n repositoryPath: z.string().trim().min(1),\n serviceName: z.string().trim().min(1),\n serviceType: ServiceCategorySchema.optional(),\n environment: z.string().trim().min(1).optional(),\n portRange: PortAllocationRangeSchema.optional(),\n preferredPort: z.number().int().min(1).max(65535).optional(),\n host: z.string().trim().min(1).default('127.0.0.1'),\n});\n\nexport const PortAllocationResponseSchema = z.object({\n success: z.boolean(),\n port: z.number().int().min(1).max(65535).optional(),\n record: PortRegistryRecordSchema.optional(),\n error: z.string().optional(),\n});\n\nexport const PortUsageListFiltersSchema = z.object({\n repositoryPath: z.string().trim().min(1).optional(),\n serviceType: ServiceCategorySchema.optional(),\n serviceName: z.string().trim().min(1).optional(),\n environment: z.string().trim().min(1).optional(),\n});\n\nexport type ServiceCategory = z.infer<typeof ServiceCategorySchema>;\nexport type ServiceMetadata = z.infer<typeof ServiceMetadataSchema>;\nexport type PortRegistryRecord = z.infer<typeof PortRegistryRecordSchema>;\nexport type PortRegistryState = z.infer<typeof PortRegistryStateSchema>;\nexport type PortAllocationRange = z.infer<typeof PortAllocationRangeSchema>;\nexport type ReservePortRequest = z.infer<typeof ReservePortRequestSchema>;\nexport type ReleasePortRequest = z.infer<typeof ReleasePortRequestSchema>;\nexport type GetPortRequest = z.infer<typeof GetPortRequestSchema>;\nexport type FindAvailablePortRequest = z.infer<typeof FindAvailablePortRequestSchema>;\nexport type PortAllocationResponse = z.infer<typeof PortAllocationResponseSchema>;\nexport type PortUsageListFilters = z.infer<typeof PortUsageListFiltersSchema>;\n\nexport type PortRegistryErrorCode =\n | 'INVALID_REQUEST'\n | 'REGISTRY_READ_FAILED'\n | 'REGISTRY_WRITE_FAILED'\n | 'REGISTRY_LOCK_FAILED'\n | 'PORT_NOT_AVAILABLE'\n | 'NO_PORT_FOUND';\n\nexport class PortRegistryError extends Error {\n readonly code: PortRegistryErrorCode;\n\n constructor(message: string, code: PortRegistryErrorCode, options?: ErrorOptions) {\n super(message, options);\n this.name = 'PortRegistryError';\n this.code = code;\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const DEFAULT_REGISTRY_PATH = path.join(os.homedir(), '.port-registry', 'ports.json');\nexport const DEFAULT_REGISTRY_LOCK_PATH = `${DEFAULT_REGISTRY_PATH}.lock`;\nexport const LOCK_RETRY_DELAY_MS = 75;\nexport const LOCK_MAX_RETRIES = 80;\nexport const DEFAULT_PORT_RANGE = { min: 3000, max: 4999 };\nexport const DEFAULT_HOST = '127.0.0.1';\n\nexport const normalizeRepositoryPath = (value: string): string => path.resolve(value);\n\nexport const makeTempPath = (filePath: string): string => {\n const random = randomBytes(6).toString('hex');\n return `${filePath}.${random}.tmp`;\n};\n\nexport const isPortInRange = (port: number, range: { min: number; max: number }): boolean =>\n port >= range.min && port <= range.max;\n","import { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n type FindAvailablePortRequest,\n FindAvailablePortRequestSchema,\n type GetPortRequest,\n GetPortRequestSchema,\n type PortAllocationRange,\n type PortAllocationResponse,\n PortAllocationResponseSchema,\n PortRegistryError,\n type PortRegistryRecord,\n type PortRegistryState,\n PortRegistryStateSchema,\n type PortUsageListFilters,\n REGISTRY_VERSION,\n type ReleasePortRequest,\n ReleasePortRequestSchema,\n type ReservePortRequest,\n ReservePortRequestSchema,\n} from '../types';\nimport {\n DEFAULT_HOST,\n DEFAULT_PORT_RANGE,\n DEFAULT_REGISTRY_PATH,\n isPortInRange,\n LOCK_MAX_RETRIES,\n LOCK_RETRY_DELAY_MS,\n makeTempPath,\n normalizeRepositoryPath,\n} from '../utils';\n\ninterface LockState {\n pid: number;\n token: string;\n createdAt: string;\n}\n\ninterface NormalizedFilters {\n repositoryPath: string;\n serviceName: string;\n serviceType: 'service' | 'tool';\n environment?: string;\n}\n\n/**\n * Service for managing a shared port registry across worktrees and services.\n */\nexport class PortRegistryService {\n private readonly registryPath: string;\n private readonly lockPath: string;\n\n constructor(registryPath: string = DEFAULT_REGISTRY_PATH, lockPath?: string) {\n this.registryPath = PortRegistryService.resolveRegistryPath(registryPath);\n this.lockPath = lockPath ?? `${this.registryPath}.lock`;\n }\n\n /**\n * Resolve registry path with fallback handling for directory inputs.\n */\n static resolveRegistryPath(inputPath?: string): string {\n if (!inputPath) {\n return DEFAULT_REGISTRY_PATH;\n }\n\n const resolvedPath = path.isAbsolute(inputPath) ? inputPath : path.join(process.cwd(), inputPath);\n if (path.extname(resolvedPath) === '.json') {\n return resolvedPath;\n }\n\n return path.join(resolvedPath, 'ports.json');\n }\n\n /**\n * Find a matching port allocation for the requested service.\n */\n async getPort(rawRequest: GetPortRequest): Promise<PortAllocationResponse> {\n const request = GetPortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n const match = this.findEntry(registry, {\n repositoryPath: normalizeRepositoryPath(request.repositoryPath),\n serviceName: request.serviceName,\n serviceType: request.serviceType ?? 'service',\n environment: request.environment,\n });\n\n if (!match) {\n return this.createFailureResponse(`No allocation found for ${request.serviceName} in requested scope`);\n }\n\n return this.createSuccessResponse(match.port, match);\n });\n }\n\n /**\n * Find an available port without creating or updating state.\n */\n async findAvailablePort(rawRequest: FindAvailablePortRequest): Promise<PortAllocationResponse> {\n const request = FindAvailablePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const range = request.portRange ?? DEFAULT_PORT_RANGE;\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n const reserved = this.getReservedPorts(registry, {\n repositoryPath: normalizeRepositoryPath(request.repositoryPath),\n serviceName: request.serviceName,\n serviceType: request.serviceType ?? 'service',\n environment: request.environment,\n });\n\n const availablePort = await this.findAvailablePortInternal(range, request.preferredPort, reserved, request.host);\n if (availablePort === null) {\n return this.createFailureResponse(`No available port found in range ${range.min}-${range.max}`);\n }\n\n return this.createSuccessResponse(availablePort);\n });\n }\n\n /**\n * Reserve a port for a service. Reuses existing matching record if available.\n */\n async reservePort(rawRequest: ReservePortRequest): Promise<PortAllocationResponse> {\n const request = ReservePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const normalizedRepo = normalizeRepositoryPath(request.repositoryPath);\n const serviceType = request.serviceType ?? 'service';\n const environment = request.environment ?? process.env.NODE_ENV ?? 'development';\n const host = request.host ?? DEFAULT_HOST;\n const range = request.portRange ?? DEFAULT_PORT_RANGE;\n const force = request.force ?? false;\n\n const registry = await this.pruneMissingRepositories(state);\n\n const existing = this.findEntry(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n\n if (existing && !force) {\n if (isPortInRange(existing.port, range)) {\n const available = await this.isPortAvailable(existing.port, host);\n if (available) {\n existing.updatedAt = new Date().toISOString();\n await this.saveState(registry);\n return this.createSuccessResponse(existing.port, existing);\n }\n }\n\n this.removeMatchingEntries(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n }\n\n if (existing && force) {\n this.removeMatchingEntries(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n }\n\n const reserved = this.getReservedPorts(registry, {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n });\n\n const preferredPort = request.preferredPort;\n const availablePort = await this.findAvailablePortInternal(range, preferredPort, reserved, host);\n if (availablePort === null) {\n return this.createFailureResponse(`No available port found in range ${range.min}-${range.max}`);\n }\n\n const now = new Date().toISOString();\n const record: PortRegistryRecord = {\n repositoryPath: normalizedRepo,\n serviceName: request.serviceName,\n serviceType,\n environment,\n pid: request.pid,\n port: availablePort,\n host,\n metadata: request.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n registry.entries.push(record);\n await this.saveState(registry);\n return this.createSuccessResponse(availablePort, record);\n });\n }\n\n /**\n * Release matching entries from the registry.\n */\n async releasePort(rawRequest: ReleasePortRequest): Promise<PortAllocationResponse> {\n const request = ReleasePortRequestSchema.parse(rawRequest);\n\n return this.withLock(async () => {\n const state = await this.loadState();\n const normalizedRepo = normalizeRepositoryPath(request.repositoryPath);\n const serviceType = request.serviceType ?? 'service';\n const environment = request.environment ?? process.env.NODE_ENV ?? 'development';\n const before = state.entries.length;\n let matched = false;\n\n state.entries = state.entries.filter((entry) => {\n const isMatch =\n entry.repositoryPath === normalizedRepo &&\n entry.serviceName === request.serviceName &&\n entry.serviceType === serviceType &&\n (request.environment ? entry.environment === environment : true);\n\n if (isMatch) {\n const hasPidFilter = typeof request.pid === 'number';\n if (!request.force && hasPidFilter && entry.pid !== request.pid) {\n return true;\n }\n\n matched = true;\n return false;\n }\n\n return true;\n });\n\n if (!matched || state.entries.length === before) {\n return this.createFailureResponse(`No matching registry entry for ${request.serviceName}`);\n }\n\n await this.saveState(state);\n return this.createSuccessResponse();\n });\n }\n\n /**\n * List allocations, optionally filtered.\n */\n async listAllocations(filters: PortUsageListFilters = {}): Promise<PortRegistryRecord[]> {\n return this.withLock(async () => {\n const state = await this.loadState();\n const registry = await this.pruneMissingRepositories(state);\n\n return [...registry.entries].filter((entry) => {\n if (filters.repositoryPath && entry.repositoryPath !== normalizeRepositoryPath(filters.repositoryPath))\n return false;\n if (filters.serviceType && entry.serviceType !== filters.serviceType) return false;\n if (filters.serviceName && entry.serviceName !== filters.serviceName) return false;\n if (filters.environment && entry.environment !== filters.environment) return false;\n return true;\n });\n });\n }\n\n private async withLock<T>(callback: () => Promise<T>): Promise<T> {\n const lockToken = `${process.pid}-${randomBytes(6).toString('hex')}`;\n await this.acquireLock(lockToken);\n\n try {\n return await callback();\n } finally {\n await this.releaseLock(lockToken);\n }\n }\n\n private async loadState(): Promise<PortRegistryState> {\n await fs.mkdir(path.dirname(this.registryPath), { recursive: true });\n\n try {\n const content = await fs.readFile(this.registryPath, 'utf-8');\n const parsed = JSON.parse(content);\n return PortRegistryStateSchema.parse(parsed);\n } catch (error) {\n const sysError = error as NodeJS.ErrnoException;\n if (sysError.code === 'ENOENT') {\n return {\n version: REGISTRY_VERSION,\n updatedAt: new Date().toISOString(),\n entries: [],\n };\n }\n\n if (sysError instanceof SyntaxError) {\n const backupPath = `${this.registryPath}.corrupt.${Date.now()}`;\n await fs.rename(this.registryPath, backupPath).catch(() => undefined);\n }\n\n throw new PortRegistryError(\n `Failed to read registry file: ${error instanceof Error ? error.message : String(error)}`,\n 'REGISTRY_READ_FAILED',\n {\n cause: error,\n },\n );\n }\n }\n\n private async saveState(state: PortRegistryState): Promise<void> {\n await fs.mkdir(path.dirname(this.registryPath), { recursive: true });\n\n const payload: PortRegistryState = {\n ...state,\n updatedAt: new Date().toISOString(),\n entries: [...state.entries],\n };\n\n const tempPath = makeTempPath(this.registryPath);\n await fs.writeFile(tempPath, JSON.stringify(payload, null, 2), 'utf-8');\n await fs.rename(tempPath, this.registryPath);\n }\n\n private async pruneMissingRepositories(state: PortRegistryState): Promise<PortRegistryState> {\n let changed = false;\n const entries = await Promise.all(\n state.entries.map(async (entry) => ({\n entry,\n exists: await this.pathExists(entry.repositoryPath),\n })),\n );\n\n const pruned = entries.filter((x) => x.exists).map((x) => x.entry);\n\n if (pruned.length !== state.entries.length) {\n changed = true;\n state.entries = pruned;\n }\n\n if (changed) {\n await this.saveState(state);\n }\n\n return state;\n }\n\n private async acquireLock(token: string): Promise<void> {\n await fs.mkdir(path.dirname(this.lockPath), { recursive: true });\n\n for (let attempt = 0; attempt < LOCK_MAX_RETRIES; attempt += 1) {\n try {\n const lockState: LockState = {\n pid: process.pid,\n token,\n createdAt: new Date().toISOString(),\n };\n await fs.writeFile(this.lockPath, JSON.stringify(lockState), { flag: 'wx' });\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw new PortRegistryError(\n `Failed to acquire registry lock: ${error instanceof Error ? error.message : String(error)}`,\n 'REGISTRY_LOCK_FAILED',\n { cause: error },\n );\n }\n\n const stale = await this.isStaleLock();\n if (stale) {\n await fs.unlink(this.lockPath).catch(() => undefined);\n attempt -= 1;\n continue;\n }\n\n await this.delay(LOCK_RETRY_DELAY_MS);\n }\n }\n\n throw new PortRegistryError('Unable to acquire registry lock (timeout)', 'REGISTRY_LOCK_FAILED');\n }\n\n private async releaseLock(token: string): Promise<void> {\n try {\n const existing = await fs.readFile(this.lockPath, 'utf-8');\n const parsed = JSON.parse(existing) as { token: string };\n if (parsed.token === token) {\n await fs.unlink(this.lockPath);\n }\n } catch {\n // ignore\n }\n }\n\n private async isStaleLock(): Promise<boolean> {\n try {\n const content = await fs.readFile(this.lockPath, 'utf-8');\n const parsed = JSON.parse(content) as LockState;\n\n if (parsed.pid) {\n const pidAlive = this.isProcessRunning(parsed.pid);\n if (pidAlive) {\n const age = Date.now() - new Date(parsed.createdAt).getTime();\n if (Number.isFinite(age) && age < 5000) {\n return false;\n }\n return false;\n }\n }\n\n return true;\n } catch {\n return true;\n }\n }\n\n private isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n private async pathExists(candidate: string): Promise<boolean> {\n try {\n await fs.access(candidate);\n return true;\n } catch {\n return false;\n }\n }\n\n private findEntry(state: PortRegistryState, filters: NormalizedFilters): PortRegistryRecord | undefined {\n return state.entries.find(\n (entry) =>\n entry.repositoryPath === filters.repositoryPath &&\n entry.serviceName === filters.serviceName &&\n entry.serviceType === filters.serviceType &&\n (filters.environment ? entry.environment === filters.environment : true),\n );\n }\n\n private removeMatchingEntries(state: PortRegistryState, filters: NormalizedFilters): void {\n state.entries = state.entries.filter(\n (entry) =>\n !(\n entry.repositoryPath === filters.repositoryPath &&\n entry.serviceName === filters.serviceName &&\n entry.serviceType === filters.serviceType &&\n (!filters.environment || entry.environment === filters.environment)\n ),\n );\n }\n\n private getReservedPorts(state: PortRegistryState, filters: NormalizedFilters): Set<number> {\n const set = new Set<number>();\n\n for (const entry of state.entries) {\n if (filters.environment && entry.environment !== filters.environment) {\n continue;\n }\n\n if (entry.serviceType === filters.serviceType) {\n set.add(entry.port);\n }\n }\n\n return set;\n }\n\n private async findAvailablePortInternal(\n portRange: PortAllocationRange,\n preferredPort: number | undefined,\n reservedPorts: Set<number>,\n host: string,\n ): Promise<number | null> {\n const candidates = [] as number[];\n\n if (preferredPort !== undefined && isPortInRange(preferredPort, portRange)) {\n candidates.push(preferredPort);\n }\n\n for (let port = portRange.min; port <= portRange.max; port += 1) {\n if (!candidates.includes(port)) {\n candidates.push(port);\n }\n }\n\n for (const candidate of candidates) {\n if (reservedPorts.has(candidate)) {\n continue;\n }\n\n const available = await this.isPortAvailable(candidate, host);\n if (available) {\n return candidate;\n }\n }\n\n return null;\n }\n\n private async isPortAvailable(port: number, host: string): Promise<boolean> {\n if (os.platform() === 'win32') {\n host = '127.0.0.1';\n }\n\n const candidateHosts = Array.from(\n new Set(\n [host, '127.0.0.1', '0.0.0.0', undefined, '::1'].filter((value): value is string | undefined => value !== null),\n ),\n );\n\n for (const candidateHost of candidateHosts) {\n const available = await this.isPortAvailableOnHost(port, candidateHost);\n if (!available) {\n return false;\n }\n }\n\n return true;\n }\n\n private async isPortAvailableOnHost(port: number, host?: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => {\n resolve(false);\n });\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n if (host) {\n server.listen(port, host);\n } else {\n server.listen(port);\n }\n });\n }\n\n private createSuccessResponse(port?: number, record?: PortRegistryRecord): PortAllocationResponse {\n const payload: PortAllocationResponse = {\n success: true,\n };\n\n if (port !== undefined) {\n payload.port = port;\n }\n\n if (record !== undefined) {\n (payload as Record<string, unknown>).record = record;\n }\n\n return PortAllocationResponseSchema.parse(payload);\n }\n\n private createFailureResponse(error: string): PortAllocationResponse {\n return PortAllocationResponseSchema.parse({\n success: false,\n error,\n });\n }\n\n private async delay(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/standard-schema.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/registries.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/to-json-schema.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/util.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/versions.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/checks.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/errors.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/core.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/parse.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/regexes.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ar.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/az.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/be.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/bg.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ca.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/cs.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/da.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/de.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/en.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/eo.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/es.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fa.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fi.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fr.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fr-ca.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/he.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/hu.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/hy.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/id.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/is.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/it.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ja.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ka.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/kh.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/km.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ko.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/lt.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/mk.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ms.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/nl.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/no.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ota.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ps.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/pl.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/pt.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ru.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/sl.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/sv.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ta.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/th.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/tr.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ua.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/uk.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ur.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/uz.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/vi.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/zh-cn.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/zh-tw.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/yo.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/index.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/doc.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/api.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema-processors.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema-generator.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/index.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/errors.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/parse.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/schemas.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/checks.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/compat.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/from-json-schema.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/iso.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/coerce.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/external.d.cts","../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/index.d.cts","../src/types/index.ts","../src/utils/index.ts","../src/services/portregistryservice.ts","../src/services/index.ts","../src/index.ts","../../../../node_modules/.pnpm/@vitest+pretty-format@4.0.18/node_modules/@vitest/pretty-format/dist/index.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/display.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/types.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/helpers.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/timers.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/index.d.ts","../../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/tasks.d-c7uxawj9.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/diff.d.ts","../../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/types.d.ts","../../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/traces.d.402v_yfi.d.ts","../../../../node_modules/.pnpm/vite@7.0.5_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vite/types/hmrpayload.d.ts","../../../../node_modules/.pnpm/vite@7.0.5_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vite/dist/node/modulerunnertransport-bwuzbvlx.d.ts","../../../../node_modules/.pnpm/vite@7.0.5_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vite/types/customevent.d.ts","../../../../node_modules/.pnpm/vite@7.0.5_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vite/types/hot.d.ts","../../../../node_modules/.pnpm/vite@7.0.5_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vite/dist/node/module-runner.d.ts","../../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","../../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","../../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/index.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/config.d.cy95hicx.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/rpc.d.rh3apgef.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/worker.d.dyxm8del.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/browser.d.chkacdzh.d.ts","../../../../node_modules/.pnpm/@vitest+spy@4.0.18/node_modules/@vitest/spy/dist/index.d.ts","../../../../node_modules/.pnpm/tinyrainbow@3.0.3/node_modules/tinyrainbow/dist/index.d.ts","../../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../../../node_modules/.pnpm/@vitest+expect@4.0.18/node_modules/@vitest/expect/dist/index.d.ts","../../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/utils.d.ts","../../../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/global.d.b15mdlcr.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/suite.d.bjwk38hb.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@22.19.15_jiti@2.6.1_yaml@2.8.2/node_modules/vitest/dist/index.d.ts","../tests/portregistryservice.spec.ts","../tests/setup.ts","../tests/testhelpers.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/disposable.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/indexable.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/iterators.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/compatibility/index.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.typedarray.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/globals.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/domexception.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/events.d.ts","../../../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/fetch.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/navigator.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/web-globals/storage.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/child_process.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/cluster.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/console.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/crypto.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dgram.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/domain.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/events.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/http2.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/https.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/inspector.generated.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/module.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/net.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/os.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/path.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/process.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/punycode.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/querystring.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/readline/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/repl.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sea.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/sqlite.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/stream/web.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/test.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tls.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/trace_events.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/tty.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/url.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/util.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/v8.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/vm.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/wasi.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/zlib.d.ts","../../../../node_modules/.pnpm/@types+node@22.19.15/node_modules/@types/node/index.d.ts"],"fileIdsList":[[192,241,258,259],[168,169,192,241,258,259],[192,238,239,241,258,259],[192,240,241,258,259],[241,258,259],[192,241,246,258,259,276],[192,241,242,247,252,258,259,261,273,284],[192,241,242,243,252,258,259,261],[187,188,189,192,241,258,259],[192,241,244,258,259,285],[192,241,245,246,253,258,259,262],[192,241,246,258,259,273,281],[192,241,247,249,252,258,259,261],[192,240,241,248,258,259],[192,241,249,250,258,259],[192,241,251,252,258,259],[192,240,241,252,258,259],[192,241,252,253,254,258,259,273,284],[192,241,252,253,254,258,259,268,273,276],[192,234,241,249,252,255,258,259,261,273,284],[192,241,252,253,255,256,258,259,261,273,281,284],[192,241,255,257,258,259,273,281,284],[190,191,192,193,194,195,196,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290],[192,241,252,258,259],[192,241,258,259,260,284],[192,241,249,252,258,259,261,273],[192,241,258,259,262],[192,241,258,259,263],[192,240,241,258,259,264],[192,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290],[192,241,258,259,266],[192,241,258,259,267],[192,241,252,258,259,268,269],[192,241,258,259,268,270,285,287],[192,241,253,258,259],[192,241,252,258,259,273,274,276],[192,241,258,259,275,276],[192,241,258,259,273,274],[192,241,258,259,276],[192,241,258,259,277],[192,238,241,258,259,273,278,284],[192,241,252,258,259,279,280],[192,241,258,259,279,280],[192,241,246,258,259,261,273,281],[192,241,258,259,282],[192,241,258,259,261,283],[192,241,255,258,259,267,284],[192,241,246,258,259,285],[192,241,258,259,273,286],[192,241,258,259,260,287],[192,241,258,259,288],[192,234,241,258,259],[192,234,241,252,254,258,259,264,273,276,284,286,287,289],[192,241,258,259,273,290],[141,145,148,150,165,166,167,170,175,192,241,258,259],[145,146,148,149,192,241,258,259],[145,192,241,258,259],[145,146,148,192,241,258,259],[145,146,192,241,258,259],[140,157,158,192,241,258,259],[140,157,192,241,258,259],[140,147,192,241,258,259],[140,192,241,258,259],[142,192,241,258,259],[140,141,142,143,144,192,241,258,259],[178,179,192,241,258,259],[178,179,180,181,192,241,258,259],[178,180,192,241,258,259],[178,192,241,258,259],[192,206,210,241,258,259,284],[192,206,241,258,259,273,284],[192,201,241,258,259],[192,203,206,241,258,259,281,284],[192,241,258,259,261,281],[192,241,258,259,291],[192,201,241,258,259,291],[192,203,206,241,258,259,261,284],[192,198,199,202,205,241,252,258,259,273,284],[192,206,213,241,258,259],[192,198,204,241,258,259],[192,206,227,228,241,258,259],[192,202,206,241,258,259,276,284,291],[192,227,241,258,259,291],[192,200,201,241,258,259,291],[192,206,241,258,259],[192,200,201,202,203,204,205,206,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,228,229,230,231,232,233,241,258,259],[192,206,221,241,258,259],[192,206,213,214,241,258,259],[192,204,206,214,215,241,258,259],[192,205,241,258,259],[192,198,201,206,241,258,259],[192,206,210,214,215,241,258,259],[192,210,241,258,259],[192,204,206,209,241,258,259,284],[192,198,203,206,213,241,258,259],[192,241,258,259,273],[192,201,206,227,241,258,259,289,291],[152,153,154,155,192,241,258,259],[152,192,241,258,259],[154,192,241,258,259],[150,172,173,175,192,241,258,259],[150,151,163,175,192,241,258,259],[140,148,150,159,175,192,241,258,259],[156,192,241,258,259],[140,150,159,162,171,174,175,192,241,258,259],[150,151,156,159,175,192,241,258,259],[150,172,173,174,175,192,241,258,259],[150,156,160,161,162,175,192,241,258,259],[140,145,148,150,151,156,159,160,161,162,163,164,165,171,172,173,174,175,176,177,182,192,241,258,259],[133,192,241,258,259],[124,192,241,258,259],[124,127,192,241,258,259],[119,122,124,125,126,127,128,129,130,131,132,192,241,258,259],[58,60,127,192,241,258,259],[124,125,192,241,258,259],[59,124,126,192,241,258,259],[60,62,64,65,66,67,192,241,258,259],[62,64,66,67,192,241,258,259],[62,64,66,192,241,258,259],[59,62,64,65,67,192,241,258,259],[58,60,61,62,63,64,65,66,67,68,69,119,120,121,122,123,192,241,258,259],[58,60,61,64,192,241,258,259],[60,61,64,192,241,258,259],[64,67,192,241,258,259],[58,59,61,62,63,65,66,67,192,241,258,259],[58,59,60,64,124,192,241,258,259],[64,65,66,67,192,241,258,259],[66,192,241,258,259],[70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,192,241,258,259],[135,136,138,192,241,258,259],[137,192,241,258,259],[135,136,192,241,246,254,258,259,261,262,263],[134,192,241,258,259],[192,241,246,258,259,262,263],[138,183,192,241,246,253,254,258,259,262,263],[183,192,241,258,259]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"ef28645500305d41a1ead79b0ce5e304093ccf243cf9d029662d884fa6745a8c","753160a39be953d65a8810d1efc2137ff68e4c9c98d68f53b2c51850ac41a8f8","923afcda2d51820225008ecb31c4c2ef69bd4e30639eca91bd1b120003ecea1e","e075171122e1b7af888174ecd74db9d5217add19226218f9b493279495f9855c","df0f6b9c42e6f241bb25fbe447251aa3f8a495bd11bd4b25ec0a856b5954883d",{"version":"acfb723d81eda39156251aed414c553294870bf53062429ebfcfba8a68cb4753","impliedFormat":99},{"version":"fa69a90381c2f85889722a911a732a5ee3596dc3acecda8a9aa2fa89b9615d8d","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"57e9e1b0911874c62d743af24b5d56032759846533641d550b12a45ff404bf07","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"854cd3a3375ffc4e7a92b2168dd065d7ff2614b43341038a65cca865a44c00c5","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"2f863ee9b873a65d9c3338ea7aaddbdb41a9673f062f06983d712bd01c25dc6b","impliedFormat":99},{"version":"67aa128c2bc170b93794f191feffc65a4b33e878db211cfcb7658c4b72f7a1f5","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"5c31dea483b64cbb341ea8a7073c457720d1574f87837e71cccb70ce91196211","impliedFormat":99},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"91b625209fa2a7c406923f59460ddb8d8919cd1c956edd76a047a670a6250d22","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"c35b8117804c639c53c87f2c23e0c786df61d552e513bd5179f5b88e29964838","impliedFormat":99},{"version":"c609331c6ed4ad4af54e101088c6a4dcb48f8db7b0b97e44a6efeb130f4331bd","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"67acaedb46832d66c15f1b09fb7b6a0b7f41bdbf8eaa586ec70459b3e8896eb9","impliedFormat":99},{"version":"4535ab977ee871e956eb7bebe2db5de79f5d5ec7dfbbf1d35e08f4a2d6630dac","impliedFormat":99},{"version":"b79b5ed99f26ffb2f8ae4bdcc4b34a9542197dc3fa96cfb425c2a81e618cff28","impliedFormat":99},{"version":"31fd7c12f6e27154efb52a916b872509a771880f3b20f2dfd045785c13aa813f","impliedFormat":99},{"version":"b481de4ab5379bd481ca12fc0b255cdc47341629a22c240a89cdb4e209522be2","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"4e258d11c899cb9ff36b4b5c53df59cf4a5ccae9a9931529686e77431e0a3518","affectsGlobalScope":true,"impliedFormat":99},{"version":"a5ae67a67f786ffe92d34b55467a40fb50fb0093e92388cadce6168fa42690fd","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"a534e61c2f06a147d97aebad720db97dffd8066b7142212e46bcbcdcb640b81a","impliedFormat":99},{"version":"ddf569d04470a4d629090d43a16735185001f3fcf0ae036ead99f2ceab62be48","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"53c448183c7177c83d3eb0b40824cf8952721a6584cf22052adc24f778986732","impliedFormat":99},"a469909d1ed76e21d4c9f7cb249d2b4cf15b443aaa194467344ddf02df34e08d","d172a5176859288f45f51a15fbb04cf161fece7b9a78b064c27c5499b83311d9","1cf104614cf7a8ff6d7b27efeaa87f498c40940607a0d90a0fe3a644ec437291",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[[135,139],[184,186]],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":7,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"verbatimModuleSyntax":false},"referencedMap":[[167,1],[170,2],[168,1],[238,3],[239,3],[240,4],[192,5],[241,6],[242,7],[243,8],[187,1],[190,9],[188,1],[189,1],[244,10],[245,11],[246,12],[247,13],[248,14],[249,15],[250,15],[251,16],[252,17],[253,18],[254,19],[193,1],[191,1],[255,20],[256,21],[257,22],[291,23],[258,24],[259,1],[260,25],[261,26],[262,27],[263,28],[264,29],[265,30],[266,31],[267,32],[268,33],[269,33],[270,34],[271,1],[272,35],[273,36],[275,37],[274,38],[276,39],[277,40],[278,41],[279,42],[280,43],[281,44],[282,45],[283,46],[284,47],[285,48],[286,49],[287,50],[288,51],[194,1],[195,1],[196,1],[235,52],[236,1],[237,1],[289,53],[290,54],[171,55],[140,1],[150,56],[146,57],[149,58],[172,59],[157,1],[159,60],[158,61],[165,1],[148,62],[141,63],[143,64],[145,65],[144,1],[147,63],[142,1],[169,1],[197,1],[180,66],[182,67],[181,68],[179,69],[178,1],[173,1],[166,1],[56,1],[57,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[8,1],[49,1],[46,1],[47,1],[48,1],[50,1],[9,1],[51,1],[52,1],[53,1],[55,1],[54,1],[1,1],[213,70],[223,71],[212,70],[233,72],[204,73],[203,74],[232,75],[226,76],[231,77],[206,78],[220,79],[205,80],[229,81],[201,82],[200,75],[230,83],[202,84],[207,85],[208,1],[211,85],[198,1],[234,86],[224,87],[215,88],[216,89],[218,90],[214,91],[217,92],[227,75],[209,93],[210,94],[219,95],[199,96],[222,87],[221,85],[225,1],[228,97],[156,98],[153,99],[154,99],[152,1],[155,100],[174,101],[164,102],[160,103],[161,57],[177,104],[175,105],[162,106],[176,107],[151,1],[163,108],[183,109],[134,110],[128,111],[132,112],[129,112],[125,111],[133,113],[130,114],[131,112],[126,115],[127,116],[121,117],[65,118],[67,119],[120,1],[66,120],[124,121],[123,122],[122,123],[58,1],[68,118],[69,1],[60,124],[64,125],[59,1],[61,126],[62,127],[63,1],[70,128],[71,128],[72,128],[73,128],[74,128],[75,128],[76,128],[77,128],[78,128],[79,128],[80,128],[81,128],[82,128],[84,128],[83,128],[85,128],[86,128],[87,128],[88,128],[119,129],[89,128],[90,128],[91,128],[92,128],[93,128],[94,128],[95,128],[96,128],[97,128],[98,128],[99,128],[100,128],[101,128],[103,128],[102,128],[104,128],[105,128],[106,128],[107,128],[108,128],[109,128],[110,128],[111,128],[112,128],[113,128],[114,128],[115,128],[118,128],[116,128],[117,128],[139,130],[138,131],[137,132],[135,133],[136,134],[184,135],[185,136],[186,1]],"affectedFilesPendingEmit":[[139,51],[138,51],[137,51],[135,51],[136,51],[184,51],[185,51],[186,51]],"version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@agimon-ai/foundation-port-registry",
3
+ "version": "0.2.0",
4
+ "description": "Global port registry shared across worktrees",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.mts",
8
+ "sideEffects": false,
9
+ "publishConfig": {
10
+ "registry": "https://registry.npmjs.org/",
11
+ "access": "public"
12
+ },
13
+ "dependencies": {
14
+ "zod": "4.3.6"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.0.0",
18
+ "tsdown": "0.16.1",
19
+ "typescript": "5.9.3",
20
+ "vitest": "4.0.18"
21
+ },
22
+ "author": "Vuong Ngo",
23
+ "license": "BUSL-1.1",
24
+ "type": "module",
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/index.mjs",
28
+ "require": "./dist/index.cjs"
29
+ },
30
+ "./*": "./*"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsdown",
38
+ "test": "vitest run --coverage.enabled=false",
39
+ "lint": "eslint src",
40
+ "fixcode": "pnpm exec biome check --write",
41
+ "typecheck": "tsc --noEmit --incremental"
42
+ }
43
+ }