@classytic/arc 2.41.1 → 2.43.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/dist/{EventTransport-CbUKDzZZ.d.mts → EventTransport-CiicKz2Z.d.mts} +1 -1
- package/dist/{EventTransport-DSqD_Xsg.mjs → EventTransport-tzA7CAB4.mjs} +22 -17
- package/dist/{HookSystem-CMF94SEA.mjs → HookSystem-B6UaKRbF.mjs} +2 -2
- package/dist/{QueryCache-DFA-QrU9.d.mts → QueryCache--5uAuYPW.d.mts} +7 -3
- package/dist/{ResourceRegistry-MGpXoxHZ.mjs → ResourceRegistry-CuCARu2B.mjs} +44 -13
- package/dist/actionPermissions-BotX1YOa.mjs +776 -0
- package/dist/audit/index.d.mts +43 -5
- package/dist/audit/index.mjs +48 -26
- package/dist/auth/audit.mjs +1 -1
- package/dist/auth/index.d.mts +43 -13
- package/dist/auth/index.mjs +130 -155
- package/dist/auth/redis-session.mjs +1 -1
- package/dist/{authorizationDecision-DawKGoXb.mjs → authorizationDecision-DQYrkl5f.mjs} +7 -102
- package/dist/{base-CxrV1LmG.d.mts → base-CZyixEQR.d.mts} +27 -5
- package/dist/boundedMap-BULzfXYU.mjs +57 -0
- package/dist/{buildHandler-CvxKOc0m.mjs → buildHandler-CRQ8EcX5.mjs} +4 -4
- package/dist/cache/index.d.mts +22 -34
- package/dist/cache/index.mjs +4 -4
- package/dist/{caching-DbCBxlgw.mjs → caching-Cc2M1DwO.mjs} +3 -3
- package/dist/claimed-B10RTfkM.mjs +8 -0
- package/dist/cleanup/index.d.mts +6 -10
- package/dist/cleanup/index.mjs +27 -73
- package/dist/cli/commands/describe.d.mts +4 -2
- package/dist/cli/commands/describe.mjs +7 -4
- package/dist/cli/commands/docs.mjs +3 -3
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/generate.mjs +2 -2
- package/dist/cli/commands/init.mjs +2 -2
- package/dist/cli/commands/introspect.mjs +2 -2
- package/dist/cli/index.mjs +3 -3
- package/dist/{constants-D5Ubn1fe.mjs → constants-Cu7Mx7_U.mjs} +4 -2
- package/dist/context/index.d.mts +2 -5
- package/dist/context/index.mjs +18 -38
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +8 -8
- package/dist/{core-5lazhva9.mjs → core-Cb0LjccA.mjs} +5 -4
- package/dist/{createActionRouter-DNqoaK81.mjs → createActionRouter-xjqonMRO.mjs} +87 -39
- package/dist/{createAggregationRouter-BcbQJf10.mjs → createAggregationRouter-zRYWw_5D.mjs} +11 -8
- package/dist/{preloadResources-f3boenVZ.mjs → createApp-D-953ZAq.mjs} +299 -390
- package/dist/{createMcpServer-CbDWkZ1T.d.mts → createMcpServer-C9cxS8zt.d.mts} +1 -1
- package/dist/{defineAggregation-D_eJjm5A.mjs → defineAggregation-Bm8RjMbq.mjs} +1 -1
- package/dist/{defineResource-DxkMTjRn.mjs → defineResource-DIC7JZGU.mjs} +118 -1024
- package/dist/discovery/index.mjs +1 -1
- package/dist/docs/index.d.mts +10 -4
- package/dist/docs/index.mjs +4 -4
- package/dist/{elevation-BXCfVcNG.d.mts → elevation-BW2J3tNj.d.mts} +1 -2
- package/dist/{elevation-CkvG0LG2.mjs → elevation-DG8SrLN-.mjs} +41 -12
- package/dist/encryption/index.mjs +3 -3
- package/dist/{errorHandler-D1GHKGlV.mjs → errorHandler-BnfDviL1.mjs} +26 -5
- package/dist/{errors-BH7YU_9O.mjs → errors-CtrywMHP.mjs} +58 -23
- package/dist/{errors-BGdVwP25.d.mts → errors-JYc9vwqE.d.mts} +9 -0
- package/dist/{eventPlugin-B52abJ8W.d.mts → eventPlugin-BtmA4-3P.d.mts} +65 -9
- package/dist/{eventPlugin-zZY-unhr.mjs → eventPlugin-Q6BhzHzs.mjs} +82 -21
- package/dist/{subscribe-helpers-DatDkcuG.mjs → eventTypes-Cdhm6ZlV.mjs} +151 -17
- package/dist/events/index.d.mts +33 -8
- package/dist/events/index.mjs +49 -53
- package/dist/events/transports/redis-stream-entry.d.mts +1 -1
- package/dist/events/transports/redis-stream-entry.mjs +139 -157
- package/dist/events/transports/redis.d.mts +1 -1
- package/dist/events/transports/redis.mjs +2 -2
- package/dist/factory/index.d.mts +32 -17
- package/dist/factory/index.mjs +213 -32
- package/dist/{fastify-augmentation-Cq2nHVaW.d.mts → fastify-augmentation-DhUJ-mvo.d.mts} +11 -25
- package/dist/{fields-I_EeRWND.d.mts → fields-BBSpf8pS.d.mts} +1 -1
- package/dist/{fields-BHrkoF5y.mjs → fields-ToPYpMqS.mjs} +1 -1
- package/dist/filter-merge-IpGywvym.mjs +99 -0
- package/dist/{generate-BLRf2m3y.mjs → generate-DRTkLlIl.mjs} +2 -2
- package/dist/{headers-BIXWKrzQ.mjs → headers-BbkIF6vA.mjs} +2 -2
- package/dist/health-D-Ft6JM6.mjs +22 -0
- package/dist/{health-ZRHeDHXH.mjs → health-DqbsG-_w.mjs} +115 -55
- package/dist/hooks/index.d.mts +2 -2
- package/dist/hooks/index.mjs +2 -2
- package/dist/idempotency/index.d.mts +31 -7
- package/dist/idempotency/index.mjs +155 -98
- package/dist/idempotency/redis.d.mts +1 -1
- package/dist/idempotency/redis.mjs +48 -11
- package/dist/{index-BHdZD8zK.d.mts → index-Bxriq3so.d.mts} +84 -21
- package/dist/{preloadResources-CjS2OfpU.d.mts → index-C8zVGYsk.d.mts} +37 -38
- package/dist/{index-D4u76eQW.d.mts → index-CRoPtISf.d.mts} +23 -73
- package/dist/{index-CbJiYrfv.d.mts → index-Chgz3d0i.d.mts} +1 -1
- package/dist/index-JdbZAIsm.d.mts +510 -0
- package/dist/{index-DHbyPo5j.d.mts → index-mqaqZNpe.d.mts} +253 -254
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +11 -11
- package/dist/{init-CpLkjU18.mjs → init-B_oUYDXI.mjs} +1 -1
- package/dist/integrations/event-gateway.d.mts +8 -3
- package/dist/integrations/event-gateway.mjs +4 -4
- package/dist/integrations/index.d.mts +3 -3
- package/dist/integrations/index.mjs +1 -1
- package/dist/integrations/jobs/index.d.mts +1 -1
- package/dist/integrations/jobs/index.mjs +18 -5
- package/dist/integrations/mcp/index.d.mts +72 -59
- package/dist/integrations/mcp/index.mjs +19 -4
- package/dist/integrations/mcp/testing.d.mts +2 -2
- package/dist/integrations/mcp/testing.mjs +2 -2
- package/dist/integrations/streamline.d.mts +78 -136
- package/dist/integrations/streamline.mjs +116 -54
- package/dist/integrations/webhooks.d.mts +60 -120
- package/dist/integrations/webhooks.mjs +36 -80
- package/dist/integrations/websocket-pushref-redis.d.mts +1 -1
- package/dist/integrations/websocket-pushref-redis.mjs +1 -1
- package/dist/integrations/websocket-redis.d.mts +1 -1
- package/dist/integrations/websocket-redis.mjs +1 -1
- package/dist/integrations/websocket.d.mts +3 -3
- package/dist/integrations/websocket.mjs +2 -2
- package/dist/{interface-DEWNOMza.d.mts → interface-C0395yUN.d.mts} +13 -1
- package/dist/{jsonBody-ELR9lfeU.mjs → jsonBody-B4YVGcql.mjs} +2 -2
- package/dist/{keys-cpZCtcIE.mjs → keys-B2KtgMLJ.mjs} +7 -18
- package/dist/{loadResources-BPfWiI5s.mjs → loadResources-Dn4lalw2.mjs} +3 -3
- package/dist/{loadResourcesFromEntry-ixtfL3J2.mjs → loadResourcesFromEntry-3sLYbuse.mjs} +2 -2
- package/dist/logger/index.d.mts +1 -8
- package/dist/logger/index.mjs +3 -153
- package/dist/logger-DXjfIqjV.mjs +160 -0
- package/dist/{mcpPlugin-BX5PujI0.mjs → mcpPlugin-C08HalN5.mjs} +433 -170
- package/dist/{memory-Iotz0cCx.mjs → memory-9Cp7611C.mjs} +36 -34
- package/dist/{metrics-NMsmpRmY.mjs → metrics-CWI11eRu.mjs} +39 -72
- package/dist/middleware/index.d.mts +2 -2
- package/dist/middleware/index.mjs +3 -3
- package/dist/migrations/index.mjs +2 -2
- package/dist/{module-DpLJG2_N.mjs → module-BSvOQC7E.mjs} +8 -8
- package/dist/multiTenant-cY0FkDiA.d.mts +104 -0
- package/dist/{multipartBody-DtRWM6_U.mjs → multipartBody-CXM2a-Dy.mjs} +46 -7
- package/dist/{openapi-CmFf3yq_.mjs → openapi-DT_G4VhY.mjs} +48 -10
- package/dist/outbox-admin/index.d.mts +3 -3
- package/dist/outbox-admin/index.mjs +6 -18
- package/dist/{outbox-module-D2z5WkDY.mjs → outbox-module-Bjgzl6tg.mjs} +203 -33
- package/dist/{outbox-module-BHdUnuuK.d.mts → outbox-module-gZCHoE4H.d.mts} +79 -6
- package/dist/permissions/index.d.mts +5 -4
- package/dist/permissions/index.mjs +8 -6
- package/dist/{permissions-D8TBH44E.mjs → permissions-Cm0uYHvd.mjs} +149 -33
- package/dist/{pipe-FMWNheSO.mjs → pipe-BqeGT6UO.mjs} +2 -2
- package/dist/pipeline/index.d.mts +2 -2
- package/dist/pipeline/index.mjs +2 -2
- package/dist/plan-FVR6LP59.mjs +565 -0
- package/dist/{BaseController-CYEwjyjN.mjs → plugin-BccET1tL.mjs} +1256 -345
- package/dist/plugins/index.d.mts +14 -11
- package/dist/plugins/index.mjs +44 -22
- package/dist/plugins/response-cache.mjs +8 -14
- package/dist/plugins/tracing-entry.mjs +2 -2
- package/dist/{pluralize-CXWZIzTv.mjs → pluralize-CVIOcgMF.mjs} +1 -1
- package/dist/presets/filesUpload.d.mts +2 -2
- package/dist/presets/filesUpload.mjs +5 -5
- package/dist/presets/index.d.mts +26 -31
- package/dist/presets/index.mjs +4 -4
- package/dist/presets/multiTenant.d.mts +2 -107
- package/dist/presets/multiTenant.mjs +22 -162
- package/dist/presets/search.d.mts +2 -2
- package/dist/presets/search.mjs +2 -2
- package/dist/{presets-ZJSPgmT2.mjs → presets-Cpvj6fGO.mjs} +99 -107
- package/dist/{projection-BzIgzoKZ.mjs → projection-Ce4aQhQk.mjs} +2 -2
- package/dist/{pushref-registry-Dov9l4qE.d.mts → pushref-registry-UxCkoA4C.d.mts} +1 -1
- package/dist/{queryCachePlugin-BzqxconG.d.mts → queryCachePlugin-C2lZjTxk.d.mts} +1 -1
- package/dist/{queryCachePlugin-DZHPOm9p.mjs → queryCachePlugin-CFWNH8aT.mjs} +12 -14
- package/dist/{rateLimitKey-BvOvcBDi.mjs → rateLimitKey-C4O-kPm0.mjs} +1 -1
- package/dist/{realtime-8tIQWZz4.mjs → realtime-DmPE9S54.mjs} +25 -21
- package/dist/redis-stream-BMk-bpQS.d.mts +219 -0
- package/dist/{redis-Bzi1y3F9.d.mts → redis-vLvtcGy_.d.mts} +13 -24
- package/dist/redisShapes-CQksY67q.d.mts +55 -0
- package/dist/registry/index.d.mts +9 -4
- package/dist/registry/index.mjs +4 -4
- package/dist/{registry-DNkgGQcK.mjs → registry-Bcz9G1bh.mjs} +10 -8
- package/dist/{renewingLease-yF8BdW4b.mjs → renewingLease-qODa7KJQ.mjs} +1 -1
- package/dist/{replyHelpers-CNdvMfM4.mjs → replyHelpers-CG_VtVgS.mjs} +2 -2
- package/dist/{requestContext-cDkAUr-P.mjs → requestContext-Dsu9P1bV.mjs} +1 -1
- package/dist/requirement-CbiLdQ1n.d.mts +22 -0
- package/dist/requirement-KDdoRcOP.mjs +35 -0
- package/dist/resourceRateLimit-Wf6d6FL9.d.mts +30 -0
- package/dist/resourceRateLimit-dSjVr1pk.mjs +180 -0
- package/dist/{rolldown-runtime-eysyzFAF.mjs → rolldown-runtime-D1w9Y1VJ.mjs} +1 -1
- package/dist/routeValidator-D36SW8qt.mjs +70 -0
- package/dist/{runtimeCapabilities-CkhS6jn6.mjs → runtimeCapabilities-0tccjRlj.mjs} +1 -1
- package/dist/{schedules-j6uXXAeJ.mjs → schedules-C-OpmHBq.mjs} +46 -37
- package/dist/{schemaConverter-BVA7cFRG.mjs → schemaConverter-BORek3O-.mjs} +2 -2
- package/dist/{schemaIR-CTvPDoPB.mjs → schemaIR-C7Vbp71I.mjs} +2 -2
- package/dist/schemas/index.d.mts +10 -0
- package/dist/schemas/index.mjs +8 -3
- package/dist/scim/index.mjs +2 -2
- package/dist/scope/index.d.mts +2 -2
- package/dist/scope/index.mjs +6 -6
- package/dist/{scope-BUi1xV1I.mjs → scope-DQthe88b.mjs} +4 -4
- package/dist/shutdown-MqA81z_P.mjs +59 -0
- package/dist/{simpleEqualityMatcher-C9bzq2gO.mjs → simpleEqualityMatcher-auW8QjXN.mjs} +1 -1
- package/dist/{sse-BeqVKQKu.mjs → sse-CYzQBVFe.mjs} +11 -15
- package/dist/{sseStream-Ppzo-WUH.mjs → sseStream-B5_Afiqn.mjs} +2 -2
- package/dist/{store-helpers-dW71XVWL.mjs → store-helpers-BOzk-CuX.mjs} +1 -1
- package/dist/{streaming-IcRFjWQU.mjs → streaming-DjTQhZrN.mjs} +1 -1
- package/dist/subscriberIdentity-CW39uA8G.mjs +28 -0
- package/dist/tenancy--ed9eH_z.mjs +43 -0
- package/dist/tenantPreparation-BKon6Yox.mjs +67 -0
- package/dist/testing/cleanupStoreContract.mjs +1 -1
- package/dist/testing/index.d.mts +193 -175
- package/dist/testing/index.mjs +286 -212
- package/dist/testing/outboxStoreContract.mjs +137 -2
- package/dist/testing/requiredPorts.d.mts +17 -0
- package/dist/testing/requiredPorts.mjs +65 -0
- package/dist/testing/storageContract.mjs +1 -1
- package/dist/timing-qczZ0YC-.mjs +46 -0
- package/dist/{transactionContext-CPbdlnVw.mjs → transactionContext-DjFkrNG6.mjs} +1 -1
- package/dist/{typeGuards-BLjPgVBm.mjs → typeGuards-CySF12G-.mjs} +1 -1
- package/dist/types/index.d.mts +4 -4
- package/dist/types/index.mjs +1 -1
- package/dist/types/storage.mjs +1 -1
- package/dist/{types-CWQn9-IC.d.mts → types-B4Aq4Sdj.d.mts} +22 -9
- package/dist/{types-DfVDvkdP.d.mts → types-BJ-2XqVF.d.mts} +189 -204
- package/dist/{types-CgenB1gv.mjs → types-Bk9NOgOC.mjs} +4 -4
- package/dist/usage/index.d.mts +2 -3
- package/dist/usage/index.mjs +5 -5
- package/dist/{userHelpers-ChRvkuSZ.mjs → userHelpers-aklawRaK.mjs} +1 -1
- package/dist/utils/index.d.mts +84 -223
- package/dist/utils/index.mjs +13 -12
- package/dist/{utils-CxcctrAh.mjs → utils-ec1oTo1n.mjs} +315 -404
- package/dist/{validate-DrYWnOzI.mjs → validate-9yzHC1e2.mjs} +6 -14
- package/dist/{versioning-D6JIK8Tk.d.mts → versioning-Bsb51gGT.d.mts} +28 -13
- package/dist/{versioning-DKkT4hNJ.mjs → versioning-fhhWHV74.mjs} +4 -4
- package/dist/{websocket-BOXVggMf.d.mts → websocket-Cs4awVyD.d.mts} +1 -1
- package/dist/{workScope-CxKqoIFn.mjs → workScope-zpPyge4t.mjs} +2 -2
- package/package.json +16 -12
- package/skills/arc/SKILL.md +13 -4
- package/skills/arc/references/auth.md +8 -5
- package/skills/arc/references/integrations.md +1 -1
- package/skills/arc/references/mcp.md +8 -6
- package/skills/arc/references/multi-tenancy.md +19 -14
- package/skills/arc/references/production.md +27 -10
- package/dist/actionPermissions-BoPGQ5-4.mjs +0 -350
- package/dist/index-CFfLKMH4.d.mts +0 -290
- package/dist/interface-YzIbF7Ii.mjs +0 -17
- package/dist/redis-stream-BPKscsTB.d.mts +0 -260
- package/dist/registerRoute-Bsnk6NiZ.mjs +0 -364
- package/dist/sync/changelog.d.mts +0 -3
- package/dist/sync/changelog.mjs +0 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
import { r as ArcModuleInput } from "../types-BJ-2XqVF.mjs";
|
|
3
|
+
//#region src/testing/requiredPorts.d.ts
|
|
4
|
+
interface RequiredPortsOptions {
|
|
5
|
+
/** Modules composed alongside — the peers the module `dependsOn` or `requires.modules`. */
|
|
6
|
+
readonly with?: readonly ArcModuleInput[];
|
|
7
|
+
/** Ports supplied in every case — the peers' own required ports. Never one under test. Values are never read. */
|
|
8
|
+
readonly ports?: Readonly<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
interface RequiredPortsResult {
|
|
11
|
+
readonly module: string;
|
|
12
|
+
/** The required ports, in declared order. */
|
|
13
|
+
readonly ports: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
declare function assertRequiresPorts(module: ArcModuleInput, ports: readonly string[], options?: RequiredPortsOptions): Promise<RequiredPortsResult>;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { RequiredPortsOptions, RequiredPortsResult, assertRequiresPorts };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import { c as declareModules, d as resolveModule, i as planModules, r as compositionProblems } from "../plan-FVR6LP59.mjs";
|
|
3
|
+
//#region src/testing/requiredPorts.ts
|
|
4
|
+
/**
|
|
5
|
+
* Assert a module declares EXACTLY `ports` as required, and that composing it without any one of
|
|
6
|
+
* them fails naming the module and that port — alone, and all together in one error. `[]` asserts
|
|
7
|
+
* it declares none and plans with nothing supplied. `with` composes peers it depends on; `ports`
|
|
8
|
+
* supplies what they need. Pass `ports` as a literal, never the module's own list: dropping a port
|
|
9
|
+
* from the module must fail here.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* it("fails loud without each port", () =>
|
|
13
|
+
* assertRequiresPorts(createOrderModule(deps), ["connection", "outbox"], { with: [catalog] }));
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
async function assertRequiresPorts(module, ports, options = {}) {
|
|
17
|
+
const peers = options.with ?? [];
|
|
18
|
+
const base = options.ports ?? {};
|
|
19
|
+
const fail = (msg) => {
|
|
20
|
+
throw new Error(`[arc/testing] assertRequiresPorts: ${msg}`);
|
|
21
|
+
};
|
|
22
|
+
const target = await resolveModule(module);
|
|
23
|
+
const name = target.name;
|
|
24
|
+
const { active } = await declareModules([...peers, module]);
|
|
25
|
+
if (!active.some((m) => m.name === name)) fail(`module "${name}" is not active in this composition`);
|
|
26
|
+
const declared = target.requires?.ports ?? [];
|
|
27
|
+
if (!sameList(declared, ports)) fail(`module "${name}" declares required ports [${declared.join(", ")}], expected [${ports.join(", ")}]`);
|
|
28
|
+
const shadowed = ports.filter((p) => Object.hasOwn(base, p));
|
|
29
|
+
if (shadowed.length > 0) fail(`options.ports supplies a port under test: ${shadowed.join(", ")}`);
|
|
30
|
+
const supplying = (names) => {
|
|
31
|
+
const out = { ...base };
|
|
32
|
+
for (const p of names) out[p] = Object.freeze({ port: p });
|
|
33
|
+
return out;
|
|
34
|
+
};
|
|
35
|
+
const missingFor = (supplied) => {
|
|
36
|
+
const problems = compositionProblems(active, supplied);
|
|
37
|
+
const foreign = problems.filter((p) => p.module !== name || p.code !== "missing-port");
|
|
38
|
+
if (foreign.length > 0) fail(`the composition has problems besides the module's ports — fix \`with\`/\`ports\`:\n${foreign.map((p) => ` - ${p.message}`).join("\n")}`);
|
|
39
|
+
return problems.map((p) => p.target);
|
|
40
|
+
};
|
|
41
|
+
const unplanned = await planModules([...peers, module], { ports: supplying(ports) }).catch((err) => err);
|
|
42
|
+
if (unplanned instanceof Error) fail(`module "${name}" does not plan with every port supplied: ${unplanned.message}`);
|
|
43
|
+
if (ports.length === 0) return {
|
|
44
|
+
module: name,
|
|
45
|
+
ports
|
|
46
|
+
};
|
|
47
|
+
const allMissing = missingFor(supplying([]));
|
|
48
|
+
if (!sameList(allMissing, ports)) fail(`with no port supplied, module "${name}" reported [${allMissing.join(", ")}], expected [${ports.join(", ")}] in ONE error`);
|
|
49
|
+
const refused = await planModules([...peers, module], { ports: supplying([]) }).then(() => null, (err) => err instanceof Error ? err.message : String(err));
|
|
50
|
+
if (refused === null) fail(`module "${name}" planned with none of its required ports supplied`);
|
|
51
|
+
for (const port of ports) {
|
|
52
|
+
const missing = missingFor(supplying(ports.filter((p) => p !== port)));
|
|
53
|
+
if (!sameList(missing, [port])) fail(`without "${port}", module "${name}" reported [${missing.join(", ")}], expected exactly ["${port}"]`);
|
|
54
|
+
if (!refused?.includes(`module "${name}" requires port "${port}"`)) fail(`the composition error does not name module "${name}" and port "${port}": ${refused}`);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
module: name,
|
|
58
|
+
ports
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function sameList(a, b) {
|
|
62
|
+
return a.length === b.length && a.every((x, i) => x === b[i]);
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { assertRequiresPorts };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
//#region src/utils/operationIdentity.ts
|
|
4
|
+
/** Security context included in idempotency identities across transports. */
|
|
5
|
+
function operationIdentity(operation, scope, fallbackPrincipal, namespace) {
|
|
6
|
+
const principal = scope?.kind === "service" ? scope.clientId : scope?.kind === "public" ? fallbackPrincipal : scope?.userId ?? fallbackPrincipal;
|
|
7
|
+
const org = scope && "organizationId" in scope ? scope.organizationId : void 0;
|
|
8
|
+
const team = scope && "teamId" in scope ? scope.teamId : void 0;
|
|
9
|
+
const context = scope && "context" in scope ? Object.entries(scope.context ?? {}).sort(([a], [b]) => a.localeCompare(b)) : [];
|
|
10
|
+
const identity = JSON.stringify([
|
|
11
|
+
namespace ?? "",
|
|
12
|
+
operation,
|
|
13
|
+
scope?.kind ?? "public",
|
|
14
|
+
principal ?? "anon",
|
|
15
|
+
org ?? null,
|
|
16
|
+
team ?? null,
|
|
17
|
+
context
|
|
18
|
+
]);
|
|
19
|
+
return createHash("sha256").update(identity).digest("hex");
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/idempotency/stores/interface.ts
|
|
23
|
+
/**
|
|
24
|
+
* Helper to create a result object
|
|
25
|
+
*/
|
|
26
|
+
function createIdempotencyResult(statusCode, body, headers, ttlMs, requestFingerprint) {
|
|
27
|
+
const now = /* @__PURE__ */ new Date();
|
|
28
|
+
return {
|
|
29
|
+
...requestFingerprint ? { requestFingerprint } : {},
|
|
30
|
+
statusCode,
|
|
31
|
+
headers,
|
|
32
|
+
body,
|
|
33
|
+
createdAt: now,
|
|
34
|
+
expiresAt: new Date(now.getTime() + ttlMs)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function resolveIdempotencyTiming(ttlMs, lockTimeoutMs) {
|
|
38
|
+
const timing = {
|
|
39
|
+
ttlMs: ttlMs ?? 864e5,
|
|
40
|
+
lockTimeoutMs: lockTimeoutMs ?? 3e4
|
|
41
|
+
};
|
|
42
|
+
for (const [name, value] of Object.entries(timing)) if (!Number.isFinite(value) || value <= 0) throw new Error(`[arc idempotency] ${name} must be a positive finite duration in milliseconds.`);
|
|
43
|
+
return timing;
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { createIdempotencyResult as n, operationIdentity as r, resolveIdempotencyTiming as t };
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
import { i as RequestScope } from "../types-Ddl9OjmE.mjs";
|
|
3
|
-
import { a as UserLike, c as DataPolicy, d as UserBase, i as ObjectId, l as PermissionCheck, n as ArcRequest, o as UserOrganization, r as JWTPayload, s as AuthorizationDecision, t as AnyRecord, u as PermissionContext } from "../base-
|
|
4
|
-
import { $ as
|
|
5
|
-
import { n as ElevationOptions, t as ElevationEvent } from "../elevation-
|
|
6
|
-
export type { ActionDefinition, ActionEntry, ActionHandlerFn, ActionsMap, AnyRecord, ArcDecorator, ArcFieldRule, ArcInternalMetadata, ArcRequest, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, AuthorizationDecision, BaseControllerOptions,
|
|
3
|
+
import { a as UserLike, c as DataPolicy, d as UserBase, i as ObjectId, l as PermissionCheck, n as ArcRequest, o as UserOrganization, r as JWTPayload, s as AuthorizationDecision, t as AnyRecord, u as PermissionContext } from "../base-CZyixEQR.mjs";
|
|
4
|
+
import { $ as ResourceHookContext, A as RequestWithExtras, An as WriteContext, At as AuthHelpers, B as OnTenantDeleteConfig, C as RequestIdOptions, Ct as ActionEntry, D as FastifyWithAuth, Dt as RouteMcpConfig, E as FastifyRequestExtras, Et as RouteDefinition, Fn as IController, Ft as TokenPair, G as CrudRouteKey, H as PresetFunction, I as CrudController, In as IControllerResponse, J as MiddlewareConfig, K as CrudSchemas, L as ResourceConfig, Ln as IRequestContext, Mn as ControllerHandler, Mt as Authenticator, Nn as ControllerLike, Nt as AuthenticatorContext, O as FastifyWithDecorators, On as MutationWriteContext, Ot as RouteMethod, Pn as FastifyHandler, Pt as JwtContext, Q as FieldRule, R as ResourceIdempotencyConfig, Rn as RawRouteHandler, S as IntrospectionPluginOptions, St as ActionDefinition, T as EventsDecorator, Tt as ActionsMap, U as PresetHook, V as ResolvedTenantPurge, W as PresetResult, X as RouteSchemaOptions, Y as OpenApiSchemas, Z as ArcFieldRule, _ as ServiceContext, a as IntrospectionData, b as HealthCheck, c as ResourceMetadata, d as LookupOption, et as ResourceHooks, f as OwnershipCheck, g as RequestContext, h as QueryParserInterface, i as PaginationResult, jn as WriteVerbKey, jt as AuthPluginOptions, k as MiddlewareHandler, kn as ResourceWrites, kt as RateLimitConfig, l as ArcInternalMetadata, m as PopulateOption, n as InferDocType, nt as EventDefinition, o as RegistryEntry, p as ParsedQuery, q as LookupPolicy, r as InferResourceDoc, s as RegistryStats, t as InferAdapterDoc, tt as ResourceExtensions, u as ControllerQueryOptions, v as CrudRouterOptions, w as ArcDecorator, wt as ActionHandlerFn, x as HealthOptions, xn as BaseControllerOptions, xt as ResourceCacheConfig, y as GracefulShutdownOptions, z as ResourcePermissions, zn as RouteHandler } from "../index-mqaqZNpe.mjs";
|
|
5
|
+
import { n as ElevationOptions, t as ElevationEvent } from "../elevation-BW2J3tNj.mjs";
|
|
6
|
+
export type { ActionDefinition, ActionEntry, ActionHandlerFn, ActionsMap, AnyRecord, ArcDecorator, ArcFieldRule, ArcInternalMetadata, ArcRequest, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, AuthorizationDecision, BaseControllerOptions, ControllerHandler, ControllerLike, ControllerQueryOptions, CrudController, CrudRouteKey, CrudRouterOptions, CrudSchemas, DataPolicy, ElevationEvent, ElevationOptions, EventDefinition, EventsDecorator, FastifyHandler, FastifyRequestExtras, FastifyWithAuth, FastifyWithDecorators, FieldRule, GracefulShutdownOptions, HealthCheck, HealthOptions, IController, IControllerResponse, IRequestContext, InferAdapterDoc, InferDocType, InferResourceDoc, IntrospectionData, IntrospectionPluginOptions, JWTPayload, JwtContext, LookupOption, LookupPolicy, MiddlewareConfig, MiddlewareHandler, MutationWriteContext, ObjectId, OnTenantDeleteConfig, OpenApiSchemas, OwnershipCheck, PaginationResult, ParsedQuery, PermissionCheck, PermissionContext, PopulateOption, PresetFunction, PresetHook, PresetResult, QueryParserInterface, RateLimitConfig, RawRouteHandler, RegistryEntry, RegistryStats, RequestContext, RequestIdOptions, RequestScope, RequestWithExtras, ResolvedTenantPurge, ResourceCacheConfig, ResourceConfig, ResourceExtensions, ResourceHookContext, ResourceHooks, ResourceIdempotencyConfig, ResourceMetadata, ResourcePermissions, ResourceWrites, RouteDefinition, RouteHandler, RouteMcpConfig, RouteMethod, RouteSchemaOptions, ServiceContext, TokenPair, UserBase, UserLike, UserOrganization, WriteContext, WriteVerbKey };
|
package/dist/types/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
2
|
export {};
|
package/dist/types/storage.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @classytic/arc v2.
|
|
1
|
+
/*! @classytic/arc v2.43.0 | MIT | https://classytic.com */
|
|
2
2
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
2
|
+
import { F as ResourceDefinition } from "./index-mqaqZNpe.mjs";
|
|
3
|
+
import { i as ResourceRateLimiter } from "./resourceRateLimit-Wf6d6FL9.mjs";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
//#region src/integrations/mcp/types.d.ts
|
|
5
6
|
/** Behavioral hints for MCP clients (tool annotations per MCP spec) */
|
|
@@ -87,8 +88,12 @@ interface ToolDefinition<TSession = McpAuthResult> {
|
|
|
87
88
|
name: string;
|
|
88
89
|
description: string;
|
|
89
90
|
title?: string;
|
|
90
|
-
/**
|
|
91
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Flat Zod shape `{ field: z.string() }` (the SDK wraps it in a STRIPPING
|
|
93
|
+
* `z.object()`), or a whole Zod schema registered as-is — use the whole form
|
|
94
|
+
* when unknown keys must be refused or the input is a union of objects.
|
|
95
|
+
*/
|
|
96
|
+
inputSchema?: ToolInputSchema;
|
|
92
97
|
/** Flat Zod shape for structured output validation */
|
|
93
98
|
outputSchema?: Record<string, z.ZodTypeAny>;
|
|
94
99
|
annotations?: ToolAnnotations;
|
|
@@ -105,6 +110,8 @@ interface ToolDefinition<TSession = McpAuthResult> {
|
|
|
105
110
|
*/
|
|
106
111
|
source?: string;
|
|
107
112
|
}
|
|
113
|
+
/** A tool's input contract: a flat Zod shape, or a whole Zod schema validated as-is. */
|
|
114
|
+
type ToolInputSchema = Record<string, z.ZodTypeAny> | z.ZodType;
|
|
108
115
|
/** Output of definePrompt() — plain data, not yet registered */
|
|
109
116
|
interface PromptDefinition {
|
|
110
117
|
name: string;
|
|
@@ -178,6 +185,8 @@ type CrudDescriptionOverride = string | ((meta: CrudDescriptionMeta) => string);
|
|
|
178
185
|
* omit it to keep the legacy dispatch-only behavior.
|
|
179
186
|
*/
|
|
180
187
|
interface McpExecutionWiring {
|
|
188
|
+
/** Same resource budget and backend used by REST routes. */
|
|
189
|
+
readonly rateLimiter?: ResourceRateLimiter;
|
|
181
190
|
/** Shared `HookSystem` — `fastify.arc.hooks`. */
|
|
182
191
|
readonly hooks?: unknown;
|
|
183
192
|
/** Event bus decorator — `fastify.events`. */
|
|
@@ -192,6 +201,12 @@ interface McpExecutionWiring {
|
|
|
192
201
|
* on mutating CRUD tools and enables executor-level check/lock/replay.
|
|
193
202
|
*/
|
|
194
203
|
readonly idempotencyStore?: unknown;
|
|
204
|
+
/** Explicit migration escape matching the HTTP idempotency plugin. */
|
|
205
|
+
readonly allowUnfencedCompletion?: boolean;
|
|
206
|
+
/** Cached result lifetime shared with the HTTP plugin; defaults to 24 hours. */
|
|
207
|
+
readonly idempotencyTtlMs?: number;
|
|
208
|
+
/** Completion lease shared with the HTTP plugin; defaults to 30 seconds. */
|
|
209
|
+
readonly idempotencyLockTimeoutMs?: number;
|
|
195
210
|
}
|
|
196
211
|
/** Per-resource MCP configuration overrides */
|
|
197
212
|
interface McpResourceConfig {
|
|
@@ -328,7 +343,7 @@ interface McpPluginOptions {
|
|
|
328
343
|
/** Instructions for the LLM — guidance on tool usage, constraints */
|
|
329
344
|
instructions?: string;
|
|
330
345
|
/**
|
|
331
|
-
* Resources to exclude by name
|
|
346
|
+
* Resources to exclude by name. Mutually exclusive with `expose`.
|
|
332
347
|
*
|
|
333
348
|
* Drift-prone for LLM-facing surfaces: a new `defineResource()` is exposed
|
|
334
349
|
* by default and you have to remember to add it here. Prefer `expose` when
|
|
@@ -341,10 +356,8 @@ interface McpPluginOptions {
|
|
|
341
356
|
* inverse of `exclude`), matching the principle-of-least-authority that
|
|
342
357
|
* LLM-driven tool surfaces want.
|
|
343
358
|
*
|
|
344
|
-
* Mutually exclusive with `
|
|
345
|
-
* throws
|
|
346
|
-
* default would render the exclude list redundant; passing both throws
|
|
347
|
-
* with a hint to drop `exclude`.
|
|
359
|
+
* Mutually exclusive with `exclude` (the deny default makes it redundant);
|
|
360
|
+
* passing both throws with a hint to drop `exclude`.
|
|
348
361
|
*
|
|
349
362
|
* @example
|
|
350
363
|
* ```ts
|
|
@@ -482,4 +495,4 @@ interface CreateMcpServerConfig {
|
|
|
482
495
|
/** CRUD operation type */
|
|
483
496
|
type CrudOperation = "list" | "get" | "create" | "update" | "delete";
|
|
484
497
|
//#endregion
|
|
485
|
-
export { ToolDefinition as _, CrudDescriptionOverride as a, McpAuthResult as c, McpResourceConfig as d, PromptDefinition as f, ToolContext as g, ToolAnnotations as h, CrudDescriptionMeta as i, McpExecutionWiring as l, SessionEntry as m, CallToolResult as n, CrudOperation as o, PromptResult as p, CreateMcpServerConfig as r, McpAuthResolver as s, BetterAuthHandler as t, McpPluginOptions as u };
|
|
498
|
+
export { ToolDefinition as _, CrudDescriptionOverride as a, McpAuthResult as c, McpResourceConfig as d, PromptDefinition as f, ToolContext as g, ToolAnnotations as h, CrudDescriptionMeta as i, McpExecutionWiring as l, SessionEntry as m, CallToolResult as n, CrudOperation as o, PromptResult as p, CreateMcpServerConfig as r, McpAuthResolver as s, BetterAuthHandler as t, McpPluginOptions as u, ToolInputSchema as v };
|