@pikku/inspector 0.12.22 → 0.12.24

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/add/add-addon-bans.d.ts +7 -0
  3. package/dist/add/add-addon-bans.js +65 -0
  4. package/dist/add/add-auth.js +43 -0
  5. package/dist/add/add-channel.js +47 -6
  6. package/dist/add/add-cli.js +17 -0
  7. package/dist/add/add-http-route.d.ts +11 -1
  8. package/dist/add/add-http-route.js +37 -0
  9. package/dist/add/add-http-routes.d.ts +0 -3
  10. package/dist/add/add-http-routes.js +179 -36
  11. package/dist/error-codes.d.ts +3 -1
  12. package/dist/error-codes.js +3 -0
  13. package/dist/inspector.js +17 -5
  14. package/dist/types.d.ts +48 -1
  15. package/dist/utils/get-exported-variable-name.d.ts +2 -0
  16. package/dist/utils/get-exported-variable-name.js +34 -0
  17. package/dist/utils/load-addon-functions-meta.js +98 -0
  18. package/dist/utils/post-process.js +16 -3
  19. package/dist/utils/resolve-addon-package.js +3 -1
  20. package/dist/utils/resolve-ref-contract.d.ts +21 -0
  21. package/dist/utils/resolve-ref-contract.js +46 -0
  22. package/dist/utils/serialize-inspector-state.d.ts +1 -0
  23. package/dist/utils/serialize-inspector-state.js +9 -0
  24. package/dist/visit.js +24 -19
  25. package/package.json +1 -1
  26. package/src/add/add-addon-bans.ts +84 -0
  27. package/src/add/add-auth.test.ts +94 -0
  28. package/src/add/add-auth.ts +46 -0
  29. package/src/add/add-channel.ts +66 -7
  30. package/src/add/add-cli.ts +30 -0
  31. package/src/add/add-http-route.ts +75 -1
  32. package/src/add/add-http-routes.ts +283 -41
  33. package/src/add/addon-bans.test.ts +121 -0
  34. package/src/add/addon-contracts.test.ts +221 -0
  35. package/src/error-codes.ts +4 -0
  36. package/src/inspector.ts +17 -5
  37. package/src/types.ts +70 -1
  38. package/src/utils/get-exported-variable-name.ts +48 -0
  39. package/src/utils/load-addon-functions-meta.ts +164 -0
  40. package/src/utils/post-process.ts +17 -3
  41. package/src/utils/resolve-addon-package.ts +6 -1
  42. package/src/utils/resolve-ref-contract.ts +71 -0
  43. package/src/utils/serialize-inspector-state.ts +10 -0
  44. package/src/visit.ts +26 -19
  45. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,43 @@
1
+ ## 0.12.24
2
+
3
+ ### Patch Changes
4
+
5
+ - 5fe3f47: fix(better-auth): skip the auto-generated stateless session middleware when the
6
+ project registers its own. Closes #754.
7
+
8
+ With `session.cookieCache` enabled the CLI generates a global
9
+ `betterAuthStatelessSession()` using the default `{ userId }` map. Because session
10
+ middleware short-circuits once a session is set (`if (session) next()`) and the
11
+ generated file is imported before user wirings, that default-map middleware ran
12
+ first and **pre-empted** a project's own `betterAuthStatelessSession({ mapSession })`
13
+ — silently dropping custom session fields (`role`, `locale`, …).
14
+
15
+ The inspector now detects a user-owned global registration (a
16
+ `betterAuthStatelessSession(...)` call inside `addGlobalMiddleware` or the global
17
+ form of `addHTTPMiddleware` — the array form or the `'*'` pattern, not a
18
+ route-scoped `addHTTPMiddleware('/path', …)`; ignoring `.gen.ts` files and bare
19
+ standalone calls) and
20
+ sets `state.auth.userStatelessSession`. When set, the CLI skips writing
21
+ `auth-middleware.gen.ts` (and removes a stale one) so the project's own middleware
22
+ — with its custom `mapSession` — is the only one registered. Projects without a
23
+ custom map are unaffected: the default middleware is still generated.
24
+
25
+ - 3ba12ca: Stop consumed-addon parent services from polluting every per-unit deploy bundle, and stub the AI SDKs out of non-agent units.
26
+
27
+ `aggregateRequiredServices` added `addonRequiredParentServices` (the services a consumed addon needs from its parent — e.g. `aiAgentRunner`, `deploymentService`, `metaService`) to **every** unit's `requiredServices` unconditionally. For any project that consumes an addon, this marked those services required on all units, so the per-unit service tree-shaking (and the gen-file/module stubs that key off the `false` flags) never fired — every unit shipped the full set. These parent services are now added only to units that actually deploy an addon function (its `pikkuFuncId` appears in `usedFunctions`); a unit that only calls the addon over RPC, or never touches it, no longer carries them.
28
+
29
+ On the back of the now-honest flags, the bundler stubs the AI SDK packages (`@pikku/ai-vercel`, `@ai-sdk/*`, `ai`) out of any unit where `aiAgentRunner` is not required, via a new service→module stub map alongside the existing gen-file stub map. The shared services factory must guard runner construction behind a defined-check on the dynamic import so a stubbed unit simply skips building the runner.
30
+
31
+ ## 0.12.23
32
+
33
+ ### Patch Changes
34
+
35
+ - 807a8d0: Add `refHTTP` / `refChannel` / `refCLI` so a consumer can wire an addon's HTTP routes, channel actions, and CLI commands directly from the addon's published `.pikku` contract metadata — no addon source is imported and nothing is hand-wired. These mirror the existing `ref('namespace:fn')` helper: each reference resolves the addon's already-loaded contract (via `wireAddon`) and proxies every function through `ref()` (RPC) at runtime.
36
+ - **Inspector:** `wireHTTPRoutes`/`wireChannel`/`wireCLI` now expand `refHTTP('ns:contract')` / `refChannel('ns:contract')` / `refCLI('ns:contract')` call expressions against `state.exportedContracts.addon{Http,Channel,Cli}` (already namespaced and `packageName`-tagged by `loadAddonFunctionsMeta`). An optional second argument overrides the mount basePath, e.g. `refHTTP('ext:helloRoutes', { basePath: '/ext' })`; otherwise the addon contract's own basePath is preserved.
37
+ - **CLI codegen:** the generated `pikku-function-types.gen.ts` now emits `refHTTP`/`refChannel`/`refCLI` (exported through `#pikku`) backed by const maps built from each wired addon's contract metadata, with every function pre-bound to `ref('ns:fn')`. Type-checking and runtime wiring resolve from the same generated artifact, so a reference can never be an inert marker.
38
+ - **Addon authoring bans:** when inspecting an addon package (`isAddon`), the inspector now raises a critical error if the addon calls a transport wiring helper (`wireHTTP`/`wireHTTPRoutes`/`wireChannel`/`wireCLI`/`wireScheduler`/`wireQueueWorker`/`wireMCPPrompt`/`wireMCPResource`/`wireTrigger`/`wireTriggerSource`/`wireGateway`/`wireAddon`) — these are the consuming app's responsibility (`PKU920`) — or if a `define*` contract carries `middleware`/`permissions`, which the consuming app applies, not the addon (`PKU921`). Service declarations (`wireSecret`/`wireVariable`/`wireCredential`) and function-level middleware/permissions remain allowed.
39
+ - **Deploy-bundle fix:** the HTTP/channel/CLI codegen commands now always emit their wiring and meta gen files once they report the category as active (truthy return), including the contracts-only or synthetic-route case where there are no local `wireHTTP`/`addChannel`/`wireCLI` source files. The generated bootstrap imports those files unconditionally, so skipping them left per-unit deploy bundles (e.g. Cloudflare units for scheduled tasks and workflow steps) unable to resolve `pikku-http-wirings.gen.js` and failing to build.
40
+
1
41
  ## 0.12.22
2
42
 
3
43
  ### Patch Changes
@@ -0,0 +1,7 @@
1
+ import type { AddWiring } from '../types.js';
2
+ /**
3
+ * Enforce addon authoring rules. Only runs when inspecting an addon package
4
+ * (options.isAddon). Addons cannot wire transports, and their contracts cannot
5
+ * carry middleware or permissions — those are the consuming app's concern.
6
+ */
7
+ export declare const checkAddonBans: AddWiring;
@@ -0,0 +1,65 @@
1
+ import * as ts from 'typescript';
2
+ import { ErrorCode } from '../error-codes.js';
3
+ /**
4
+ * Wiring helpers an addon must not call. Addons declare contracts with the
5
+ * define* helpers and export functions; the consuming app does the wiring via
6
+ * refHTTP / refChannel / refCLI. Service declarations remain allowed.
7
+ */
8
+ const BANNED_WIRINGS = new Set([
9
+ 'wireAddon',
10
+ 'wireChannel',
11
+ 'wireCLI',
12
+ 'wireGateway',
13
+ 'wireHTTP',
14
+ 'wireHTTPRoutes',
15
+ 'wireMCPPrompt',
16
+ 'wireMCPResource',
17
+ 'wireQueueWorker',
18
+ 'wireScheduler',
19
+ 'wireTrigger',
20
+ 'wireTriggerSource',
21
+ ]);
22
+ const CONTRACT_DEFINERS = new Set([
23
+ 'defineHTTPRoutes',
24
+ 'defineChannelRoutes',
25
+ 'defineCLICommands',
26
+ ]);
27
+ const hasHandlerProperty = (node) => {
28
+ let found = false;
29
+ const visit = (current) => {
30
+ if (found)
31
+ return;
32
+ if (ts.isPropertyAssignment(current) &&
33
+ (ts.isIdentifier(current.name) || ts.isStringLiteral(current.name)) &&
34
+ (current.name.text === 'middleware' ||
35
+ current.name.text === 'permissions')) {
36
+ found = true;
37
+ return;
38
+ }
39
+ ts.forEachChild(current, visit);
40
+ };
41
+ visit(node);
42
+ return found;
43
+ };
44
+ /**
45
+ * Enforce addon authoring rules. Only runs when inspecting an addon package
46
+ * (options.isAddon). Addons cannot wire transports, and their contracts cannot
47
+ * carry middleware or permissions — those are the consuming app's concern.
48
+ */
49
+ export const checkAddonBans = (logger, node, _checker, _state, options) => {
50
+ if (!options.isAddon)
51
+ return;
52
+ if (!ts.isCallExpression(node) || !ts.isIdentifier(node.expression))
53
+ return;
54
+ const name = node.expression.text;
55
+ if (BANNED_WIRINGS.has(name)) {
56
+ logger.critical(ErrorCode.ADDON_WIRING_NOT_ALLOWED, `Addons must not call '${name}'. Declare contracts with define* and export functions; the consuming app wires them via refHTTP / refChannel / refCLI.`);
57
+ return;
58
+ }
59
+ if (CONTRACT_DEFINERS.has(name)) {
60
+ const [arg] = node.arguments;
61
+ if (arg && hasHandlerProperty(arg)) {
62
+ logger.critical(ErrorCode.ADDON_CONTRACT_HANDLERS_NOT_ALLOWED, `Addon contract '${name}' must not declare middleware or permissions — these are applied by the consuming app, not the addon.`);
63
+ }
64
+ }
65
+ };
@@ -71,6 +71,36 @@ const readPluginId = (el) => {
71
71
  return el.expression.text;
72
72
  return undefined;
73
73
  };
74
+ /**
75
+ * True when `node` sits inside a GLOBAL middleware registration — i.e. an actual
76
+ * global registration, not a bare standalone call or a route-scoped one.
77
+ *
78
+ * `addGlobalMiddleware(...)` is always global. `addHTTPMiddleware` is global only
79
+ * in its array form (`addHTTPMiddleware([...])`) or with the `'*'` wildcard
80
+ * pattern; a specific route pattern (`addHTTPMiddleware('/api/admin/*', [...])`)
81
+ * scopes the middleware to that route and must NOT count as a global stateless
82
+ * registration (#754).
83
+ */
84
+ const isInsideGlobalMiddlewareRegistration = (node) => {
85
+ let parent = node.parent;
86
+ while (parent) {
87
+ if (ts.isCallExpression(parent) && ts.isIdentifier(parent.expression)) {
88
+ const fn = parent.expression.text;
89
+ if (fn === 'addGlobalMiddleware')
90
+ return true;
91
+ if (fn === 'addHTTPMiddleware') {
92
+ const first = parent.arguments[0];
93
+ if (!first)
94
+ return false;
95
+ // String first arg → route pattern (global only when '*'); otherwise
96
+ // the array form, which is global.
97
+ return ts.isStringLiteral(first) ? first.text === '*' : true;
98
+ }
99
+ }
100
+ parent = parent.parent;
101
+ }
102
+ return false;
103
+ };
74
104
  /**
75
105
  * Detects `pikkuBetterAuth((services) => betterAuth({...}))` calls.
76
106
  *
@@ -94,6 +124,19 @@ export const addAuth = (logger, node, _checker, state) => {
94
124
  if (!ts.isCallExpression(node))
95
125
  return;
96
126
  const expression = node.expression;
127
+ // A user-registered stateless session middleware (custom mapSession) means the
128
+ // CLI must NOT auto-generate its own default-map one — the generated one runs
129
+ // first and pre-empts the user's via the `if (session) next()` short-circuit
130
+ // (pikkujs/pikku#754). Only a GLOBAL registration counts (inside
131
+ // addHTTPMiddleware/addGlobalMiddleware) — a bare betterAuthStatelessSession()
132
+ // call (e.g. a test harness) is not a registration. Ignore generated files so
133
+ // the emitted middleware can't self-trigger the skip.
134
+ if (ts.isIdentifier(expression) &&
135
+ expression.text === 'betterAuthStatelessSession' &&
136
+ !node.getSourceFile().fileName.endsWith('.gen.ts') &&
137
+ isInsideGlobalMiddlewareRegistration(node)) {
138
+ state.auth.userStatelessSession = true;
139
+ }
97
140
  if (!ts.isIdentifier(expression) || expression.text !== 'pikkuBetterAuth')
98
141
  return;
99
142
  const sourceFile = node.getSourceFile().fileName;
@@ -10,6 +10,8 @@ import { resolveIdentifier } from '../utils/resolve-identifier.js';
10
10
  import { resolveFunctionMeta } from '../utils/resolve-function-meta.js';
11
11
  import { resolveAddonName } from '../utils/resolve-addon-package.js';
12
12
  import { validateAuthSessionless } from '../utils/validate-auth-sessionless.js';
13
+ import { getExportedVariableName } from '../utils/get-exported-variable-name.js';
14
+ import { resolveRefContract } from '../utils/resolve-ref-contract.js';
13
15
  /**
14
16
  * Safely get the "initializer" expression of a property-like AST node:
15
17
  * - for `foo: expr`, returns `expr`
@@ -25,6 +27,17 @@ function getInitializerOf(elem) {
25
27
  }
26
28
  return undefined;
27
29
  }
30
+ function getObjectPropertyName(name) {
31
+ if (!name)
32
+ return null;
33
+ if (ts.isIdentifier(name))
34
+ return name.text;
35
+ if (ts.isStringLiteral(name) || ts.isNumericLiteral(name))
36
+ return name.text;
37
+ if (ts.isComputedPropertyName(name))
38
+ return null;
39
+ return name.getText();
40
+ }
28
41
  /**
29
42
  * Resolve a handler expression (Identifier, CallExpression, or { func })
30
43
  * into its underlying function name.
@@ -84,6 +97,14 @@ function getHandlerNameFromExpression(expr, checker, rootDir) {
84
97
  }
85
98
  return null;
86
99
  }
100
+ function extractExportedChannelRoutes(logger, routes, state, checker) {
101
+ const wrapper = ts.factory.createObjectLiteralExpression([
102
+ ts.factory.createPropertyAssignment('onMessageWiring', ts.factory.createObjectLiteralExpression([
103
+ ts.factory.createPropertyAssignment('contract', routes),
104
+ ])),
105
+ ]);
106
+ return addMessagesRoutes(logger, wrapper, state, checker).contract ?? {};
107
+ }
87
108
  /**
88
109
  * Build out the nested message-routes by looking up each handler
89
110
  * in state.functions.meta instead of re-inferring it here.
@@ -108,9 +129,21 @@ export function addMessagesRoutes(logger, obj, state, checker) {
108
129
  chanInit = resolved;
109
130
  }
110
131
  }
132
+ const refContract = resolveRefContract(chanInit, 'refChannel', state.exportedContracts.addonChannel);
133
+ if (refContract) {
134
+ const refChannelKey = getObjectPropertyName(chanElem.name);
135
+ if (!refChannelKey)
136
+ continue;
137
+ result[refChannelKey] = {
138
+ ...refContract.contract,
139
+ };
140
+ continue;
141
+ }
111
142
  if (!ts.isObjectLiteralExpression(chanInit))
112
143
  continue;
113
- const channelKey = chanElem.name.getText();
144
+ const channelKey = getObjectPropertyName(chanElem.name);
145
+ if (!channelKey)
146
+ continue;
114
147
  result[channelKey] = {};
115
148
  for (const routeElem of chanInit.properties) {
116
149
  const init = getInitializerOf(routeElem);
@@ -120,11 +153,9 @@ export function addMessagesRoutes(logger, obj, state, checker) {
120
153
  const routeName = routeElem.name;
121
154
  if (!routeName)
122
155
  continue;
123
- let routeKey = routeName.getText();
124
- // For string literals like 'greet' or "greet", strip the quotes
125
- if (ts.isStringLiteral(routeName)) {
126
- routeKey = routeName.text;
127
- }
156
+ const routeKey = getObjectPropertyName(routeName);
157
+ if (!routeKey)
158
+ continue;
128
159
  // For shorthand properties, we need to resolve the identifier to its declaration
129
160
  if (ts.isShorthandPropertyAssignment(routeElem)) {
130
161
  // Get the symbol for the shorthand property
@@ -359,6 +390,16 @@ export function addMessagesRoutes(logger, obj, state, checker) {
359
390
  export const addChannel = (logger, node, checker, state, options) => {
360
391
  if (!ts.isCallExpression(node))
361
392
  return;
393
+ if (ts.isIdentifier(node.expression) &&
394
+ node.expression.text === 'defineChannelRoutes') {
395
+ const exportName = getExportedVariableName(node, options.sourceFile);
396
+ const [firstArg] = node.arguments;
397
+ if (exportName && firstArg && ts.isObjectLiteralExpression(firstArg)) {
398
+ state.exportedContracts.channel[exportName] =
399
+ extractExportedChannelRoutes(logger, firstArg, state, checker);
400
+ }
401
+ return;
402
+ }
362
403
  const { expression, arguments: args } = node;
363
404
  if (!ts.isIdentifier(expression) || expression.text !== 'wireChannel')
364
405
  return;
@@ -8,6 +8,8 @@ import { resolveIdentifier } from '../utils/resolve-identifier.js';
8
8
  import { resolveAddonName } from '../utils/resolve-addon-package.js';
9
9
  import { validateAuthSessionless } from '../utils/validate-auth-sessionless.js';
10
10
  import { extractServicesFromFunction } from '../utils/extract-services.js';
11
+ import { getExportedVariableName } from '../utils/get-exported-variable-name.js';
12
+ import { resolveRefContract } from '../utils/resolve-ref-contract.js';
11
13
  // Track if we've warned about missing Config type to avoid duplicate warnings
12
14
  const configTypeWarningShown = new Set();
13
15
  /**
@@ -16,6 +18,15 @@ const configTypeWarningShown = new Set();
16
18
  export const addCLI = (logger, node, typeChecker, inspectorState, options) => {
17
19
  if (!ts.isCallExpression(node))
18
20
  return;
21
+ if (ts.isIdentifier(node.expression) &&
22
+ node.expression.text === 'defineCLICommands') {
23
+ const exportName = getExportedVariableName(node, options.sourceFile);
24
+ const [firstArg] = node.arguments;
25
+ if (exportName && firstArg && ts.isObjectLiteralExpression(firstArg)) {
26
+ inspectorState.exportedContracts.cli[exportName] = processCommands(logger, firstArg, node.getSourceFile(), typeChecker, exportName, inspectorState, options);
27
+ }
28
+ return;
29
+ }
19
30
  // Check if this is a wireCLI call
20
31
  if (!node || !node.expression) {
21
32
  return;
@@ -129,6 +140,12 @@ function processCommands(logger, node, sourceFile, typeChecker, programName, ins
129
140
  const spreadCommands = processCommands(logger, spreadTarget, sourceFile, typeChecker, programName, inspectorState, options, programTags);
130
141
  Object.assign(commands, spreadCommands);
131
142
  }
143
+ else {
144
+ const refCommands = resolveRefContract(prop.expression, 'refCLI', inspectorState.exportedContracts.addonCli);
145
+ if (refCommands) {
146
+ Object.assign(commands, refCommands.contract);
147
+ }
148
+ }
132
149
  continue;
133
150
  }
134
151
  if (!ts.isPropertyAssignment(prop))
@@ -1,5 +1,5 @@
1
1
  import * as ts from 'typescript';
2
- import type { AddWiring, InspectorState } from '../types.js';
2
+ import type { AddWiring, ExportedHTTPRouteConfigMeta, InspectorState } from '../types.js';
3
3
  import type { InspectorLogger } from '../types.js';
4
4
  /**
5
5
  * Parameters for registering an HTTP route
@@ -14,11 +14,21 @@ export interface RegisterHTTPRouteParams {
14
14
  inheritedTags?: string[];
15
15
  inheritedAuth?: boolean;
16
16
  }
17
+ export interface RegisterHTTPRouteMetaParams {
18
+ route: ExportedHTTPRouteConfigMeta;
19
+ state: InspectorState;
20
+ logger: InspectorLogger;
21
+ sourceFile: ts.SourceFile;
22
+ basePath?: string;
23
+ inheritedTags?: string[];
24
+ inheritedAuth?: boolean;
25
+ }
17
26
  /**
18
27
  * Shared function to register an HTTP route in the inspector state.
19
28
  * Used by both wireHTTP and wireHTTPRoutes.
20
29
  */
21
30
  export declare function registerHTTPRoute({ obj, state, checker, logger, sourceFile, basePath, inheritedTags, inheritedAuth, }: RegisterHTTPRouteParams): void;
31
+ export declare function registerHTTPRouteMeta({ route, state, logger, sourceFile, basePath, inheritedTags, inheritedAuth, }: RegisterHTTPRouteMetaParams): void;
22
32
  /**
23
33
  * Process wireHTTP calls
24
34
  */
@@ -251,6 +251,43 @@ export function registerHTTPRoute({ obj, state, checker, logger, sourceFile, bas
251
251
  groupBasePath: basePath || undefined,
252
252
  };
253
253
  }
254
+ export function registerHTTPRouteMeta({ route, state, logger, sourceFile, basePath = '', inheritedTags = [], inheritedAuth, }) {
255
+ const method = route.method.toLowerCase();
256
+ const fullRoute = basePath + route.route;
257
+ const tags = [...inheritedTags, ...(route.tags || [])];
258
+ const funcName = route.func.pikkuFuncId;
259
+ const fnMeta = resolveFunctionMeta(state, funcName);
260
+ if (!fnMeta) {
261
+ logger.critical(ErrorCode.FUNCTION_METADATA_NOT_FOUND, `No function metadata found for '${funcName}'.`);
262
+ return;
263
+ }
264
+ let params = [];
265
+ try {
266
+ const keys = pathToRegexp(fullRoute).keys;
267
+ params = keys.filter((k) => k.type === 'param').map((k) => k.name);
268
+ }
269
+ catch (error) {
270
+ logger.error(`Failed to parse route '${fullRoute}': ${error instanceof Error ? error.message : error}`);
271
+ return;
272
+ }
273
+ if (!route.func.packageName) {
274
+ computeInputTypes(state.http.metaInputTypes, method, fnMeta.inputs?.[0] || null, [], params);
275
+ }
276
+ state.serviceAggregation.usedFunctions.add(funcName);
277
+ state.http.files.add(sourceFile.fileName);
278
+ state.http.meta[method][fullRoute] = {
279
+ pikkuFuncId: funcName,
280
+ ...(route.func.packageName && { packageName: route.func.packageName }),
281
+ route: fullRoute,
282
+ sourceFile: sourceFile.fileName,
283
+ method: method,
284
+ params: params.length > 0 ? params : undefined,
285
+ inputTypes: undefined,
286
+ tags: tags.length > 0 ? tags : undefined,
287
+ sse: route.sse ? true : undefined,
288
+ groupBasePath: basePath || undefined,
289
+ };
290
+ }
254
291
  /**
255
292
  * Process wireHTTP calls
256
293
  */
@@ -1,5 +1,2 @@
1
1
  import type { AddWiring } from '../types.js';
2
- /**
3
- * Process wireHTTPRoutes calls
4
- */
5
2
  export declare const addHTTPRoutes: AddWiring;