@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 +52 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +217 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +217 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +43 -0
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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"}
|
package/dist/index.d.cts
ADDED
|
@@ -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":";;;cAEa;cAEA,uBAAqB,CAAA,CAAA;EAFrB,OAAA,EAAA,SAAA;EAEA,IAAA,EAAA,MAAA;AAEb,CAAA,CAAA;AAAkC,cAArB,qBAAqB,EAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,UAAA,CAAA;AAAA,cAErB,wBAFqB,EAEG,CAAA,CAAA,SAFH,CAAA;EAAA,cAAA,aAAA;EAAA,WAAA,aAAA;EAErB,WAAA,WAAA,CAAA;;;;;;;;;;;;cAaA,yBAAuB,CAAA,CAAA;;;;;;IAbC,WAAA,WAAA,CAAA;MAAA,OAAA,EAAA,SAAA;MAaxB,IAAA,EAAA,MAAA;;;;;;;;;;;cAMA,2BAAyB,CAAA,CAAA;;;;cAUzB,0BAAwB,CAAA,CAAA;;;;;;;;EAhBD,GAAA,eAAA,YAAA,CAAA;EAAA,SAAA,eAAA,YAAA,CAAA;IAMvB,GAAA,aAAA;;;;EAAyB,IAAA,eAAA,YAAA,CAAA;EAAA,QAAA,eAAA,YAAA,YAAA,cAAA,CAAA,CAAA;EAUzB,KAAA,eAAA,aAWX,CAAA;;cAEW,0BAAwB,CAAA,CAAA;;;;;;;;;;;cASxB,sBAAoB,CAAA,CAAA;;;;;;;;;cAOpB,gCAA8B,CAAA,CAAA;;;EA7BN,WAAA,eAAA,UAAA,CAAA;IAAA,OAAA,EAAA,SAAA;IAaxB,IAAA,EAAA,MAAA;;;;;;;;;;cA0BA,8BAA4B,CAAA,CAAA;;EA1BJ,IAAA,eAAA,YAAA,CAAA;EAAA,MAAA,eAAA,YAAA,CAAA;IASxB,cAAA,aAKX;;;;;;;;IAL+B,IAAA,aAAA;IAAA,IAAA,cAAA,YAAA,CAAA;IAOpB,QAAA,eAAA,YAQX,YAAA,cAAA,CAAA,CAAA;;;;;;cASW,4BAA0B,CAAA,CAAA;;;;;;;;;KAO3B,eAAA,GAAkB,CAAA,CAAE,aAAa;KACjC,eAAA,GAAkB,CAAA,CAAE,aAAa;AAzBF,KA0B/B,kBAAA,GAAqB,CAAA,CAAE,KA1BQ,CAAA,OA0BK,wBA1BL,CAAA;AAAA,KA2B/B,iBAAA,GAAoB,CAAA,CAAE,KA3BS,CAAA,OA2BI,uBA3BJ,CAAA;AAU9B,KAkBD,mBAAA,GAAsB,CAAA,CAAE,KAblC,CAAA,OAa+C,yBAb/C,CAAA;KAcU,kBAAA,GAAqB,CAAA,CAAE,aAAa;KACpC,kBAAA,GAAqB,CAAA,CAAE,aAAa;KACpC,cAAA,GAAiB,CAAA,CAAE,aAAa;KAChC,wBAAA,GAA2B,CAAA,CAAE,aAAa;KAC1C,sBAAA,GAAyB,CAAA,CAAE,aAAa;KACxC,oBAAA,GAAuB,CAAA,CAAE,aAAa;KAEtC,qBAAA;cAQC,iBAAA,SAA0B,KAAA;iBACtB;qCAEoB,iCAAiC;;;;;;AA/GtE;AAEa,cC+CA,mBAAA,CD/CqB;EAErB,iBAAA,YAAyD;EAApC,iBAAA,QAAA;EAAA,WAAA,CAAA,YAAA,CAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,MAAA;EAAA;;AAElC;;;;;sBCuE4B,iBAAiB,QAAQ;;;;gCAyBf,2BAA2B,QAAQ;;;;0BA2BzC,qBAAqB,QAAQ;;;;0BAoF7B,qBAAqB,QAAQ;ED/MxB;;AAarC;4BC6OiC,uBAA4B,QAAQ;;;;;;;;;;;;;;;;;;;;;;cC9PxD;cACA;cACA,mBAAA;AFJA,cEKA,gBAAA,GFL6B,EAAA;AAE7B,cEIA,kBFJmD,EAA9B;EAErB,GAAA,EAAA,MAAA;EAAqB,GAAA,EAAA,MAAA;CAAA;AAAA,cEGrB,YAAA,GFHqB,WAAA;AAAA,cEKrB,uBFLqB,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AAErB,cEKA,YFMX,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAAA,MAAA;cEDW"}
|
package/dist/index.d.mts
ADDED
|
@@ -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":"0KAEA,MAAa,EAAmB,EAEnB,EAAwB,EAAE,KAAK,CAAC,UAAW,OAAO,CAAC,CAEnD,EAAwB,EAAE,OAAO,EAAE,QAAQ,CAAE,EAAE,SAAS,CAAC,CAEzD,EAA2B,EAAE,OAAO,CAC/C,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAG,6BAA6B,CACtE,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAG,0BAA0B,CAChE,YAAa,EACb,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAChD,IAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CACvC,KAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CACxC,KAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,YAAY,CACnD,SAAU,EAAsB,UAAU,CAC1C,UAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACnC,UAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACpC,CAAC,CAEW,EAA0B,EAAE,OAAO,CAC9C,QAAS,EAAE,QAAQ,EAAiB,CACpC,UAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACnC,QAAS,EAAE,MAAM,EAAyB,CAC3C,CAAC,CAEW,EAA4B,EACtC,OAAO,CACN,IAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CACvC,IAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CACxC,CAAC,CACD,OAAQ,GAAU,EAAM,KAAO,EAAM,IAAK,CACzC,QAAS,mDACT,KAAM,CAAC,MAAM,CACd,CAAC,CAES,EAA2B,EAAE,OAAO,CAC/C,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACxC,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACrC,YAAa,EAAsB,QAAQ,UAAU,CACrD,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAChD,IAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CACvC,UAAW,EAA0B,UAAU,CAC/C,cAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CAC5D,KAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CACzC,SAAU,EAAsB,UAAU,CAC1C,MAAO,EAAE,SAAS,CAAC,UAAU,CAC9B,CAAC,CAEW,EAA2B,EAAE,OAAO,CAC/C,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACxC,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACrC,YAAa,EAAsB,UAAU,CAC7C,IAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CACvC,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAChD,MAAO,EAAE,SAAS,CAAC,UAAU,CAC9B,CAAC,CAEW,EAAuB,EAAE,OAAO,CAC3C,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACxC,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACrC,YAAa,EAAsB,UAAU,CAC7C,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CACjD,CAAC,CAEW,EAAiC,EAAE,OAAO,CACrD,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACxC,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CACrC,YAAa,EAAsB,UAAU,CAC7C,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAChD,UAAW,EAA0B,UAAU,CAC/C,cAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CAC5D,KAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,YAAY,CACpD,CAAC,CAEW,EAA+B,EAAE,OAAO,CACnD,QAAS,EAAE,SAAS,CACpB,KAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CACnD,OAAQ,EAAyB,UAAU,CAC3C,MAAO,EAAE,QAAQ,CAAC,UAAU,CAC7B,CAAC,CAEW,EAA6B,EAAE,OAAO,CACjD,eAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CACnD,YAAa,EAAsB,UAAU,CAC7C,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAChD,YAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CACjD,CAAC,CAsBF,IAAa,EAAb,cAAuC,KAAM,CAC3C,KAEA,YAAY,EAAiB,EAA6B,EAAwB,CAChF,MAAM,EAAS,EAAQ,CACvB,KAAK,KAAO,oBACZ,KAAK,KAAO,IChHhB,MAAa,EAAwB,EAAK,KAAK,EAAG,SAAS,CAAE,iBAAkB,aAAa,CAC/E,EAA6B,GAAG,EAAsB,OACtD,EAAsB,GACtB,EAAmB,GACnB,EAAqB,CAAE,IAAK,IAAM,IAAK,KAAM,CAC7C,EAAe,YAEf,EAA2B,GAA0B,EAAK,QAAQ,EAAM,CAExE,EAAgB,GAEpB,GAAG,EAAS,GADJ,EAAY,EAAE,CAAC,SAAS,MAAM,CAChB,MAGlB,GAAiB,EAAc,IAC1C,GAAQ,EAAM,KAAO,GAAQ,EAAM,ICgCrC,IAAa,EAAb,MAAa,CAAoB,CAC/B,aACA,SAEA,YAAY,EAAuB,EAAuB,EAAmB,CAC3E,KAAK,aAAe,EAAoB,oBAAoB,EAAa,CACzE,KAAK,SAAW,GAAY,GAAG,KAAK,aAAa,OAMnD,OAAO,oBAAoB,EAA4B,CACrD,GAAI,CAAC,EACH,OAAO,EAGT,IAAM,EAAe,EAAK,WAAW,EAAU,CAAG,EAAY,EAAK,KAAK,QAAQ,KAAK,CAAE,EAAU,CAKjG,OAJI,EAAK,QAAQ,EAAa,GAAK,QAC1B,EAGF,EAAK,KAAK,EAAc,aAAa,CAM9C,MAAM,QAAQ,EAA6D,CACzE,IAAM,EAAU,EAAqB,MAAM,EAAW,CAEtD,OAAO,KAAK,SAAS,SAAY,CAC/B,IAAM,EAAQ,MAAM,KAAK,WAAW,CAC9B,EAAW,MAAM,KAAK,yBAAyB,EAAM,CAErD,EAAQ,KAAK,UAAU,EAAU,CACrC,eAAgB,EAAwB,EAAQ,eAAe,CAC/D,YAAa,EAAQ,YACrB,YAAa,EAAQ,aAAe,UACpC,YAAa,EAAQ,YACtB,CAAC,CAMF,OAJK,EAIE,KAAK,sBAAsB,EAAM,KAAM,EAAM,CAH3C,KAAK,sBAAsB,2BAA2B,EAAQ,YAAY,qBAAqB,EAIxG,CAMJ,MAAM,kBAAkB,EAAuE,CAC7F,IAAM,EAAU,EAA+B,MAAM,EAAW,CAEhE,OAAO,KAAK,SAAS,SAAY,CAC/B,IAAM,EAAQ,EAAQ,WAAa,EAC7B,EAAQ,MAAM,KAAK,WAAW,CAC9B,EAAW,MAAM,KAAK,yBAAyB,EAAM,CAErD,EAAW,KAAK,iBAAiB,EAAU,CAC/C,eAAgB,EAAwB,EAAQ,eAAe,CAC/D,YAAa,EAAQ,YACrB,YAAa,EAAQ,aAAe,UACpC,YAAa,EAAQ,YACtB,CAAC,CAEI,EAAgB,MAAM,KAAK,0BAA0B,EAAO,EAAQ,cAAe,EAAU,EAAQ,KAAK,CAKhH,OAJI,IAAkB,KACb,KAAK,sBAAsB,oCAAoC,EAAM,IAAI,GAAG,EAAM,MAAM,CAG1F,KAAK,sBAAsB,EAAc,EAChD,CAMJ,MAAM,YAAY,EAAiE,CACjF,IAAM,EAAU,EAAyB,MAAM,EAAW,CAE1D,OAAO,KAAK,SAAS,SAAY,CAC/B,IAAM,EAAQ,MAAM,KAAK,WAAW,CAC9B,EAAiB,EAAwB,EAAQ,eAAe,CAChE,EAAc,EAAQ,aAAe,UACrC,EAAc,EAAQ,aAAe,QAAQ,IAAI,UAAY,cAC7D,EAAO,EAAQ,MAAQ,EACvB,EAAQ,EAAQ,WAAa,EAC7B,EAAQ,EAAQ,OAAS,GAEzB,EAAW,MAAM,KAAK,yBAAyB,EAAM,CAErD,EAAW,KAAK,UAAU,EAAU,CACxC,eAAgB,EAChB,YAAa,EAAQ,YACrB,cACA,cACD,CAAC,CAEF,GAAI,GAAY,CAAC,EAAO,CACtB,GAAI,EAAc,EAAS,KAAM,EAAM,EACnB,MAAM,KAAK,gBAAgB,EAAS,KAAM,EAAK,CAI/D,MAFA,GAAS,UAAY,IAAI,MAAM,CAAC,aAAa,CAC7C,MAAM,KAAK,UAAU,EAAS,CACvB,KAAK,sBAAsB,EAAS,KAAM,EAAS,CAI9D,KAAK,sBAAsB,EAAU,CACnC,eAAgB,EAChB,YAAa,EAAQ,YACrB,cACA,cACD,CAAC,CAGA,GAAY,GACd,KAAK,sBAAsB,EAAU,CACnC,eAAgB,EAChB,YAAa,EAAQ,YACrB,cACA,cACD,CAAC,CAGJ,IAAM,EAAW,KAAK,iBAAiB,EAAU,CAC/C,eAAgB,EAChB,YAAa,EAAQ,YACrB,cACA,cACD,CAAC,CAEI,EAAgB,EAAQ,cACxB,EAAgB,MAAM,KAAK,0BAA0B,EAAO,EAAe,EAAU,EAAK,CAChG,GAAI,IAAkB,KACpB,OAAO,KAAK,sBAAsB,oCAAoC,EAAM,IAAI,GAAG,EAAM,MAAM,CAGjG,IAAM,EAAM,IAAI,MAAM,CAAC,aAAa,CAC9BA,EAA6B,CACjC,eAAgB,EAChB,YAAa,EAAQ,YACrB,cACA,cACA,IAAK,EAAQ,IACb,KAAM,EACN,OACA,SAAU,EAAQ,SAClB,UAAW,EACX,UAAW,EACZ,CAID,OAFA,EAAS,QAAQ,KAAK,EAAO,CAC7B,MAAM,KAAK,UAAU,EAAS,CACvB,KAAK,sBAAsB,EAAe,EAAO,EACxD,CAMJ,MAAM,YAAY,EAAiE,CACjF,IAAM,EAAU,EAAyB,MAAM,EAAW,CAE1D,OAAO,KAAK,SAAS,SAAY,CAC/B,IAAM,EAAQ,MAAM,KAAK,WAAW,CAC9B,EAAiB,EAAwB,EAAQ,eAAe,CAChE,EAAc,EAAQ,aAAe,UACrC,EAAc,EAAQ,aAAe,QAAQ,IAAI,UAAY,cAC7D,EAAS,EAAM,QAAQ,OACzB,EAAU,GA2Bd,MAzBA,GAAM,QAAU,EAAM,QAAQ,OAAQ,GAAU,CAO9C,GALE,EAAM,iBAAmB,GACzB,EAAM,cAAgB,EAAQ,aAC9B,EAAM,cAAgB,IACrB,GAAQ,aAAc,EAAM,cAAgB,GAElC,CACX,IAAM,EAAe,OAAO,EAAQ,KAAQ,SAM5C,MALI,CAAC,EAAQ,OAAS,GAAgB,EAAM,MAAQ,EAAQ,IACnD,IAGT,EAAU,GACH,IAGT,MAAO,IACP,CAEE,CAAC,GAAW,EAAM,QAAQ,SAAW,EAChC,KAAK,sBAAsB,kCAAkC,EAAQ,cAAc,EAG5F,MAAM,KAAK,UAAU,EAAM,CACpB,KAAK,uBAAuB,GACnC,CAMJ,MAAM,gBAAgB,EAAgC,EAAE,CAAiC,CACvF,OAAO,KAAK,SAAS,SAAY,CAC/B,IAAM,EAAQ,MAAM,KAAK,WAAW,CAGpC,MAAO,CAAC,IAFS,MAAM,KAAK,yBAAyB,EAAM,EAEvC,QAAQ,CAAC,OAAQ,GAKnC,EAJI,EAAQ,gBAAkB,EAAM,iBAAmB,EAAwB,EAAQ,eAAe,EAElG,EAAQ,aAAe,EAAM,cAAgB,EAAQ,aACrD,EAAQ,aAAe,EAAM,cAAgB,EAAQ,aACrD,EAAQ,aAAe,EAAM,cAAgB,EAAQ,aAEzD,EACF,CAGJ,MAAc,SAAY,EAAwC,CAChE,IAAM,EAAY,GAAG,QAAQ,IAAI,GAAG,EAAY,EAAE,CAAC,SAAS,MAAM,GAClE,MAAM,KAAK,YAAY,EAAU,CAEjC,GAAI,CACF,OAAO,MAAM,GAAU,QACf,CACR,MAAM,KAAK,YAAY,EAAU,EAIrC,MAAc,WAAwC,CACpD,MAAM,EAAG,MAAM,EAAK,QAAQ,KAAK,aAAa,CAAE,CAAE,UAAW,GAAM,CAAC,CAEpE,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,SAAS,KAAK,aAAc,QAAQ,CACvD,EAAS,KAAK,MAAM,EAAQ,CAClC,OAAO,EAAwB,MAAM,EAAO,OACrC,EAAO,CACd,IAAM,EAAW,EACjB,GAAI,EAAS,OAAS,SACpB,MAAO,CACL,QAAS,EACT,UAAW,IAAI,MAAM,CAAC,aAAa,CACnC,QAAS,EAAE,CACZ,CAGH,GAAI,aAAoB,YAAa,CACnC,IAAM,EAAa,GAAG,KAAK,aAAa,WAAW,KAAK,KAAK,GAC7D,MAAM,EAAG,OAAO,KAAK,aAAc,EAAW,CAAC,UAAY,IAAA,GAAU,CAGvE,MAAM,IAAI,EACR,iCAAiC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GACvF,uBACA,CACE,MAAO,EACR,CACF,EAIL,MAAc,UAAU,EAAyC,CAC/D,MAAM,EAAG,MAAM,EAAK,QAAQ,KAAK,aAAa,CAAE,CAAE,UAAW,GAAM,CAAC,CAEpE,IAAMC,EAA6B,CACjC,GAAG,EACH,UAAW,IAAI,MAAM,CAAC,aAAa,CACnC,QAAS,CAAC,GAAG,EAAM,QAAQ,CAC5B,CAEK,EAAW,EAAa,KAAK,aAAa,CAChD,MAAM,EAAG,UAAU,EAAU,KAAK,UAAU,EAAS,KAAM,EAAE,CAAE,QAAQ,CACvE,MAAM,EAAG,OAAO,EAAU,KAAK,aAAa,CAG9C,MAAc,yBAAyB,EAAsD,CAC3F,IAAI,EAAU,GAQR,GAPU,MAAM,QAAQ,IAC5B,EAAM,QAAQ,IAAI,KAAO,KAAW,CAClC,QACA,OAAQ,MAAM,KAAK,WAAW,EAAM,eAAe,CACpD,EAAE,CACJ,EAEsB,OAAQ,GAAM,EAAE,OAAO,CAAC,IAAK,GAAM,EAAE,MAAM,CAWlE,OATI,EAAO,SAAW,EAAM,QAAQ,SAClC,EAAU,GACV,EAAM,QAAU,GAGd,GACF,MAAM,KAAK,UAAU,EAAM,CAGtB,EAGT,MAAc,YAAY,EAA8B,CACtD,MAAM,EAAG,MAAM,EAAK,QAAQ,KAAK,SAAS,CAAE,CAAE,UAAW,GAAM,CAAC,CAEhE,IAAK,IAAI,EAAU,EAAG,EAAU,GAAkB,GAAW,EAC3D,GAAI,CACF,IAAMC,EAAuB,CAC3B,IAAK,QAAQ,IACb,QACA,UAAW,IAAI,MAAM,CAAC,aAAa,CACpC,CACD,MAAM,EAAG,UAAU,KAAK,SAAU,KAAK,UAAU,EAAU,CAAE,CAAE,KAAM,KAAM,CAAC,CAC5E,aACO,EAAO,CACd,GAAK,EAAgC,OAAS,SAC5C,MAAM,IAAI,EACR,oCAAoC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAC1F,uBACA,CAAE,MAAO,EAAO,CACjB,CAIH,GADc,MAAM,KAAK,aAAa,CAC3B,CACT,MAAM,EAAG,OAAO,KAAK,SAAS,CAAC,UAAY,IAAA,GAAU,CACrD,IACA,SAGF,MAAM,KAAK,MAAM,GAAoB,CAIzC,MAAM,IAAI,EAAkB,4CAA6C,uBAAuB,CAGlG,MAAc,YAAY,EAA8B,CACtD,GAAI,CACF,IAAM,EAAW,MAAM,EAAG,SAAS,KAAK,SAAU,QAAQ,CAC3C,KAAK,MAAM,EAAS,CACxB,QAAU,GACnB,MAAM,EAAG,OAAO,KAAK,SAAS,MAE1B,GAKV,MAAc,aAAgC,CAC5C,GAAI,CACF,IAAM,EAAU,MAAM,EAAG,SAAS,KAAK,SAAU,QAAQ,CACnD,EAAS,KAAK,MAAM,EAAQ,CAalC,OAXI,EAAO,KACQ,KAAK,iBAAiB,EAAO,IAAI,EAEpC,KAAK,KAAK,CAAG,IAAI,KAAK,EAAO,UAAU,CAAC,SAAS,CAEpD,IAMN,QACD,CACN,MAAO,IAIX,iBAAyB,EAAsB,CAC7C,GAAI,CAEF,OADA,QAAQ,KAAK,EAAK,EAAE,CACb,QACD,CACN,MAAO,IAIX,MAAc,WAAW,EAAqC,CAC5D,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAU,CACnB,QACD,CACN,MAAO,IAIX,UAAkB,EAA0B,EAA4D,CACtG,OAAO,EAAM,QAAQ,KAClB,GACC,EAAM,iBAAmB,EAAQ,gBACjC,EAAM,cAAgB,EAAQ,aAC9B,EAAM,cAAgB,EAAQ,cAC7B,EAAQ,YAAc,EAAM,cAAgB,EAAQ,YAAc,IACtE,CAGH,sBAA8B,EAA0B,EAAkC,CACxF,EAAM,QAAU,EAAM,QAAQ,OAC3B,GACC,EACE,EAAM,iBAAmB,EAAQ,gBACjC,EAAM,cAAgB,EAAQ,aAC9B,EAAM,cAAgB,EAAQ,cAC7B,CAAC,EAAQ,aAAe,EAAM,cAAgB,EAAQ,cAE5D,CAGH,iBAAyB,EAA0B,EAAyC,CAC1F,IAAM,EAAM,IAAI,IAEhB,IAAK,IAAM,KAAS,EAAM,QACpB,EAAQ,aAAe,EAAM,cAAgB,EAAQ,aAIrD,EAAM,cAAgB,EAAQ,aAChC,EAAI,IAAI,EAAM,KAAK,CAIvB,OAAO,EAGT,MAAc,0BACZ,EACA,EACA,EACA,EACwB,CACxB,IAAM,EAAa,EAAE,CAEjB,IAAkB,IAAA,IAAa,EAAc,EAAe,EAAU,EACxE,EAAW,KAAK,EAAc,CAGhC,IAAK,IAAI,EAAO,EAAU,IAAK,GAAQ,EAAU,IAAK,GAAQ,EACvD,EAAW,SAAS,EAAK,EAC5B,EAAW,KAAK,EAAK,CAIzB,IAAK,IAAM,KAAa,EAClB,MAAc,IAAI,EAAU,EAId,MAAM,KAAK,gBAAgB,EAAW,EAAK,CAE3D,OAAO,EAIX,OAAO,KAGT,MAAc,gBAAgB,EAAc,EAAgC,CACtE,EAAG,UAAU,GAAK,UACpB,EAAO,aAGT,IAAM,EAAiB,MAAM,KAC3B,IAAI,IACF,CAAC,EAAM,YAAa,UAAW,IAAA,GAAW,MAAM,CAAC,OAAQ,GAAuC,IAAU,KAAK,CAChH,CACF,CAED,IAAK,IAAM,KAAiB,EAE1B,GAAI,CADc,MAAM,KAAK,sBAAsB,EAAM,EAAc,CAErE,MAAO,GAIX,MAAO,GAGT,MAAc,sBAAsB,EAAc,EAAiC,CACjF,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAM,EAAS,EAAI,cAAc,CACjC,EAAO,KAAK,YAAe,CACzB,EAAQ,GAAM,EACd,CACF,EAAO,KAAK,gBAAmB,CAC7B,EAAO,UAAY,EAAQ,GAAK,CAAC,EACjC,CACE,EACF,EAAO,OAAO,EAAM,EAAK,CAEzB,EAAO,OAAO,EAAK,EAErB,CAGJ,sBAA8B,EAAe,EAAqD,CAChG,IAAMC,EAAkC,CACtC,QAAS,GACV,CAUD,OARI,IAAS,IAAA,KACX,EAAQ,KAAO,GAGb,IAAW,IAAA,KACZ,EAAoC,OAAS,GAGzC,EAA6B,MAAM,EAAQ,CAGpD,sBAA8B,EAAuC,CACnE,OAAO,EAA6B,MAAM,CACxC,QAAS,GACT,QACD,CAAC,CAGJ,MAAc,MAAM,EAA2B,CAC7C,MAAM,IAAI,QAAS,GAAY,WAAW,EAAS,EAAG,CAAC"}
|
|
@@ -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
|
+
}
|