@procedures/client 0.1.0 → 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.
Files changed (118) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  5. package/dist/adapters/http/server/transport.js +1 -0
  6. package/dist/adapters/http/server/transport.js.map +1 -1
  7. package/dist/browser.d.ts +5 -2
  8. package/dist/browser.d.ts.map +1 -1
  9. package/dist/browser.js +4 -1
  10. package/dist/browser.js.map +1 -1
  11. package/dist/client/client.d.ts +9 -1
  12. package/dist/client/client.d.ts.map +1 -1
  13. package/dist/client/client.js +27 -6
  14. package/dist/client/client.js.map +1 -1
  15. package/dist/client/types.d.ts +9 -0
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/client/types.js.map +1 -1
  18. package/dist/procedures/capability.d.ts +111 -0
  19. package/dist/procedures/capability.d.ts.map +1 -0
  20. package/dist/procedures/capability.js +269 -0
  21. package/dist/procedures/capability.js.map +1 -0
  22. package/dist/procedures/cli/discover.d.ts +3 -3
  23. package/dist/procedures/cli/discover.js +3 -3
  24. package/dist/procedures/cli/index.js +5 -3
  25. package/dist/procedures/cli/index.js.map +1 -1
  26. package/dist/procedures/cli/init.js +1 -1
  27. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  28. package/dist/procedures/collection/procedures.js +12 -0
  29. package/dist/procedures/collection/procedures.js.map +1 -1
  30. package/dist/procedures/core/array.d.ts.map +1 -1
  31. package/dist/procedures/core/array.js +3 -1
  32. package/dist/procedures/core/array.js.map +1 -1
  33. package/dist/procedures/core/comparison.d.ts.map +1 -1
  34. package/dist/procedures/core/comparison.js +3 -1
  35. package/dist/procedures/core/comparison.js.map +1 -1
  36. package/dist/procedures/core/index.d.ts.map +1 -1
  37. package/dist/procedures/core/index.js +5 -2
  38. package/dist/procedures/core/index.js.map +1 -1
  39. package/dist/procedures/core/math.d.ts.map +1 -1
  40. package/dist/procedures/core/math.js +3 -1
  41. package/dist/procedures/core/math.js.map +1 -1
  42. package/dist/procedures/core/meta.d.ts.map +1 -1
  43. package/dist/procedures/core/meta.js +11 -6
  44. package/dist/procedures/core/meta.js.map +1 -1
  45. package/dist/procedures/core/object.d.ts.map +1 -1
  46. package/dist/procedures/core/object.js +3 -1
  47. package/dist/procedures/core/object.js.map +1 -1
  48. package/dist/procedures/core/string.d.ts.map +1 -1
  49. package/dist/procedures/core/string.js +3 -1
  50. package/dist/procedures/core/string.js.map +1 -1
  51. package/dist/procedures/core/type.d.ts.map +1 -1
  52. package/dist/procedures/core/type.js +3 -1
  53. package/dist/procedures/core/type.js.map +1 -1
  54. package/dist/procedures/define-procedure.d.ts.map +1 -1
  55. package/dist/procedures/define-procedure.js +5 -4
  56. package/dist/procedures/define-procedure.js.map +1 -1
  57. package/dist/procedures/effects.d.ts +15 -0
  58. package/dist/procedures/effects.d.ts.map +1 -0
  59. package/dist/procedures/effects.js +18 -0
  60. package/dist/procedures/effects.js.map +1 -0
  61. package/dist/procedures/index.d.ts +5 -2
  62. package/dist/procedures/index.d.ts.map +1 -1
  63. package/dist/procedures/index.js +8 -23
  64. package/dist/procedures/index.js.map +1 -1
  65. package/dist/procedures/interceptors.d.ts.map +1 -1
  66. package/dist/procedures/interceptors.js +2 -1
  67. package/dist/procedures/interceptors.js.map +1 -1
  68. package/dist/procedures/invoke.d.ts +31 -3
  69. package/dist/procedures/invoke.d.ts.map +1 -1
  70. package/dist/procedures/invoke.js +78 -12
  71. package/dist/procedures/invoke.js.map +1 -1
  72. package/dist/procedures/module.d.ts +13 -8
  73. package/dist/procedures/module.d.ts.map +1 -1
  74. package/dist/procedures/module.js +19 -9
  75. package/dist/procedures/module.js.map +1 -1
  76. package/dist/procedures/types.d.ts +100 -2
  77. package/dist/procedures/types.d.ts.map +1 -1
  78. package/dist/procedures/types.js.map +1 -1
  79. package/dist/register.d.ts +8 -0
  80. package/dist/register.d.ts.map +1 -0
  81. package/dist/register.js +9 -0
  82. package/dist/register.js.map +1 -0
  83. package/dist/server/host-policy.d.ts +24 -2
  84. package/dist/server/host-policy.d.ts.map +1 -1
  85. package/dist/server/host-policy.js +22 -0
  86. package/dist/server/host-policy.js.map +1 -1
  87. package/dist/server/procedure-server.d.ts +16 -2
  88. package/dist/server/procedure-server.d.ts.map +1 -1
  89. package/dist/server/procedure-server.js +26 -1
  90. package/dist/server/procedure-server.js.map +1 -1
  91. package/package.json +6 -4
  92. package/src/adapters/http/server/transport.ts +1 -0
  93. package/src/browser.ts +28 -0
  94. package/src/client/client.ts +33 -6
  95. package/src/client/types.ts +11 -0
  96. package/src/procedures/capability.ts +333 -0
  97. package/src/procedures/cli/discover.ts +3 -3
  98. package/src/procedures/cli/index.ts +5 -3
  99. package/src/procedures/cli/init.ts +1 -1
  100. package/src/procedures/collection/procedures.ts +12 -0
  101. package/src/procedures/core/array.ts +3 -1
  102. package/src/procedures/core/comparison.ts +3 -1
  103. package/src/procedures/core/index.ts +5 -2
  104. package/src/procedures/core/math.ts +3 -1
  105. package/src/procedures/core/meta.ts +11 -6
  106. package/src/procedures/core/object.ts +3 -1
  107. package/src/procedures/core/string.ts +3 -1
  108. package/src/procedures/core/type.ts +3 -1
  109. package/src/procedures/define-procedure.ts +5 -4
  110. package/src/procedures/effects.ts +24 -0
  111. package/src/procedures/index.ts +33 -22
  112. package/src/procedures/interceptors.ts +2 -1
  113. package/src/procedures/invoke.ts +106 -13
  114. package/src/procedures/module.ts +19 -9
  115. package/src/procedures/types.ts +113 -2
  116. package/src/register.ts +10 -0
  117. package/src/server/host-policy.ts +44 -2
  118. package/src/server/procedure-server.ts +44 -2
@@ -17,7 +17,9 @@ import type {
17
17
  import { pathToKey } from "../procedures/types.js";
18
18
  import { ProcedureRegistry, PROCEDURE_REGISTRY } from "../procedures/registry.js";
19
19
  import { createCollectionProcedures } from "../procedures/collection/procedures.js";
20
- import { InvocationError, invokeProcedure, type Interceptor } from "../procedures/invoke.js";
20
+ import { InvocationError, invokeProcedure, type Interceptor, type Invocation } from "../procedures/invoke.js";
21
+ import type { Capability, ClearanceOrder, ResourcesOf } from "../procedures/types.js";
22
+ import { TIMEOUT_METADATA_KEY, narrowCapability } from "../procedures/capability.js";
21
23
  import type { CollectionStorage } from "../procedures/collection/storage.js";
22
24
 
23
25
  // =============================================================================
@@ -68,6 +70,29 @@ export interface ProcedureServerOptions extends ServerOptions {
68
70
  * tracing, timeouts, metrics (see `procedures/interceptors.ts`).
69
71
  */
70
72
  interceptors?: readonly Interceptor[] | undefined;
73
+
74
+ /**
75
+ * The capability of each request (CAPABILITIES-2026-10): one value, or a function of the
76
+ * request. The function reads only what the transport authenticated. Without it: no limits.
77
+ */
78
+ capability?: Capability | ((request: ServerRequest<unknown>) => Capability | undefined) | undefined;
79
+ /** The order of the clearance values. */
80
+ clearanceOrder?: ClearanceOrder | undefined;
81
+ /** The resources of each invocation for its capability (`ctx.resources`). */
82
+ resources?: ((invocation: Invocation) => ResourcesOf) | undefined;
83
+ /** The filter of the output that leaves the server. */
84
+ admitItem?: ((item: unknown, invocation: Invocation) => boolean) | undefined;
85
+ }
86
+
87
+ /** The capability of a request with the remaining time of its caller, when it sends one. */
88
+ function withRequestTimeout(
89
+ capability: Capability | undefined,
90
+ request: ServerRequest<unknown>,
91
+ order: ClearanceOrder | undefined
92
+ ): Capability | undefined {
93
+ const timeoutMs = request.metadata[TIMEOUT_METADATA_KEY];
94
+ if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs < 0) return capability;
95
+ return narrowCapability(capability, { timeoutMs }, order);
71
96
  }
72
97
 
73
98
  /**
@@ -78,6 +103,8 @@ export function errorResponse(id: string, error: unknown): ServerResponse<unknow
78
103
  // An error that says it is retryable stays retryable: before, every error lost the flag
79
104
  // (deep dive TRN-7)
80
105
  const retryable = (error as { retryable?: unknown } | undefined)?.retryable;
106
+ // A refusal of the capability says why (CAPABILITIES-2026-10)
107
+ const reason = error instanceof InvocationError ? error.reason : undefined;
81
108
  return {
82
109
  id,
83
110
  status: {
@@ -86,7 +113,7 @@ export function errorResponse(id: string, error: unknown): ServerResponse<unknow
86
113
  message: error instanceof Error ? error.message : String(error),
87
114
  retryable: typeof retryable === "boolean" ? retryable : false,
88
115
  },
89
- metadata: {},
116
+ metadata: reason ? { reason } : {},
90
117
  };
91
118
  }
92
119
 
@@ -136,6 +163,8 @@ export class ProcedureServer extends Server implements RepositoryProvider {
136
163
  private readonly expose: ((path: ProcedurePath) => boolean) | undefined;
137
164
  private readonly strictCalls: boolean;
138
165
  private readonly interceptors: readonly Interceptor[];
166
+ /** The capability options of the requests (CAPABILITIES-2026-10). */
167
+ private readonly capabilityOptions: Pick<ProcedureServerOptions, "capability" | "clearanceOrder" | "resources" | "admitItem">;
139
168
 
140
169
  constructor(options: ProcedureServerOptions = {}) {
141
170
  super(options);
@@ -144,6 +173,12 @@ export class ProcedureServer extends Server implements RepositoryProvider {
144
173
  this.expose = options.expose;
145
174
  this.strictCalls = options.strictCalls ?? false;
146
175
  this.interceptors = options.interceptors ?? [];
176
+ this.capabilityOptions = {
177
+ capability: options.capability,
178
+ clearanceOrder: options.clearanceOrder,
179
+ resources: options.resources,
180
+ admitItem: options.admitItem,
181
+ };
147
182
 
148
183
  // Configure collections
149
184
  if (options.collections) {
@@ -303,6 +338,7 @@ export class ProcedureServer extends Server implements RepositoryProvider {
303
338
  try {
304
339
  // One invocation path for every host (ARCHITECTURE-PROPOSALS P1): input validation, the
305
340
  // context, the expose rule for nested calls (BUGS-2026-07 H18) and output validation
341
+ const { capability, clearanceOrder, resources, admitItem } = this.capabilityOptions;
306
342
  const output = await invokeProcedure(procedure, request.payload, {
307
343
  registry: this.procedureRegistry,
308
344
  metadata: request.metadata,
@@ -311,6 +347,12 @@ export class ProcedureServer extends Server implements RepositoryProvider {
311
347
  expose: this.expose,
312
348
  strictCalls: this.strictCalls,
313
349
  interceptors: this.interceptors,
350
+ // The capability comes from the server, never from the request. The remaining time of
351
+ // the caller can only make the deadline earlier (CAPABILITIES-2026-10, decision 9).
352
+ capability: withRequestTimeout(typeof capability === "function" ? capability(request) : capability, request, clearanceOrder),
353
+ clearanceOrder,
354
+ resources,
355
+ admitItem,
314
356
  });
315
357
  if (output.kind === "stream") {
316
358
  return { id: request.id, status: { type: "success", code: 200 }, stream: output.items, metadata: {} };