@retinue/agentkit 0.2.0 → 0.3.1
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/README.md +1 -1
- package/dist/adapters/audio/openai.d.ts +36 -0
- package/dist/adapters/audio/openai.js +136 -0
- package/dist/adapters/bullmq/lock.d.ts +26 -2
- package/dist/adapters/memory/connections.d.ts +10 -0
- package/dist/adapters/memory/connections.js +87 -0
- package/dist/adapters/memory/graph.d.ts +17 -0
- package/dist/adapters/memory/graph.js +267 -0
- package/dist/adapters/memory/index.d.ts +3 -0
- package/dist/adapters/memory/index.js +3 -0
- package/dist/adapters/memory/rate-limit.d.ts +14 -0
- package/dist/adapters/memory/rate-limit.js +28 -0
- package/dist/adapters/memory/runtime.js +0 -0
- package/dist/adapters/postgres/connections.d.ts +15 -0
- package/dist/adapters/postgres/connections.js +134 -0
- package/dist/adapters/postgres/graph.d.ts +24 -0
- package/dist/adapters/postgres/graph.js +325 -0
- package/dist/adapters/postgres/index.d.ts +2 -0
- package/dist/adapters/postgres/index.js +2 -0
- package/dist/adapters/postgres/migrations.js +198 -0
- package/dist/adapters/postgres/run-store.js +26 -2
- package/dist/adapters/postgres/schema.d.ts +61 -2
- package/dist/adapters/postgres/schema.js +95 -10
- package/dist/adapters/redis/index.d.ts +1 -0
- package/dist/adapters/redis/index.js +1 -0
- package/dist/adapters/redis/rate-limit.d.ts +46 -0
- package/dist/adapters/redis/rate-limit.js +55 -0
- package/dist/adapters/supabase/index.d.ts +15 -0
- package/dist/adapters/supabase/index.js +15 -0
- package/dist/adapters/supabase/rls.js +33 -0
- package/dist/agents/agent.d.ts +78 -1
- package/dist/agents/agent.js +118 -5
- package/dist/agents/define.js +24 -4
- package/dist/agents/engine.d.ts +20 -0
- package/dist/agents/engine.js +177 -6
- package/dist/audio/index.d.ts +151 -0
- package/dist/audio/index.js +183 -0
- package/dist/connections/cipher.d.ts +103 -0
- package/dist/connections/cipher.js +141 -0
- package/dist/connections/index.d.ts +156 -0
- package/dist/connections/index.js +72 -0
- package/dist/connections/oauth/client.d.ts +84 -0
- package/dist/connections/oauth/client.js +141 -0
- package/dist/connections/oauth/index.d.ts +166 -0
- package/dist/connections/oauth/index.js +226 -0
- package/dist/connections/oauth/service.d.ts +90 -0
- package/dist/connections/oauth/service.js +132 -0
- package/dist/connections/pause.d.ts +68 -0
- package/dist/connections/pause.js +97 -0
- package/dist/connections/resolver.d.ts +59 -0
- package/dist/connections/resolver.js +138 -0
- package/dist/connections/resume.d.ts +64 -0
- package/dist/connections/resume.js +99 -0
- package/dist/connections/vault-cipher.d.ts +95 -0
- package/dist/connections/vault-cipher.js +206 -0
- package/dist/core/content-parts.d.ts +18 -2
- package/dist/core/content-parts.js +1 -0
- package/dist/core/context.d.ts +25 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.js +15 -0
- package/dist/core/events.d.ts +44 -2
- package/dist/core/events.js +31 -2
- package/dist/core/validation.js +19 -0
- package/dist/entries/connections.d.ts +10 -0
- package/dist/entries/connections.js +10 -0
- package/dist/entries/knowledge.d.ts +8 -0
- package/dist/entries/knowledge.js +8 -0
- package/dist/entries/mcp-server.d.ts +9 -0
- package/dist/entries/mcp-server.js +9 -0
- package/dist/entries/runtime.d.ts +10 -0
- package/dist/entries/runtime.js +8 -0
- package/dist/entries/testing.d.ts +28 -0
- package/dist/entries/testing.js +28 -0
- package/dist/graphql/resolvers.d.ts +3 -1
- package/dist/graphql/resolvers.js +14 -0
- package/dist/knowledge/communities.d.ts +166 -0
- package/dist/knowledge/communities.js +377 -0
- package/dist/knowledge/graph-global.d.ts +153 -0
- package/dist/knowledge/graph-global.js +246 -0
- package/dist/knowledge/graph-retrieval.d.ts +150 -0
- package/dist/knowledge/graph-retrieval.js +303 -0
- package/dist/knowledge/graph.d.ts +223 -0
- package/dist/knowledge/graph.js +369 -0
- package/dist/knowledge/index.d.ts +24 -0
- package/dist/knowledge/index.js +36 -1
- package/dist/knowledge/retrieval.d.ts +26 -1
- package/dist/knowledge/retrieval.js +77 -1
- package/dist/mcp-server/index.d.ts +168 -0
- package/dist/mcp-server/index.js +175 -0
- package/dist/models/extraction.d.ts +73 -0
- package/dist/models/extraction.js +118 -0
- package/dist/models/index.d.ts +40 -1
- package/dist/models/index.js +22 -1
- package/dist/models/pricing.d.ts +2 -0
- package/dist/models/pricing.js +17 -1
- package/dist/models/provider-factory.js +9 -7
- package/dist/models/streaming.d.ts +89 -0
- package/dist/models/streaming.js +179 -2
- package/dist/persistence/index.d.ts +230 -0
- package/dist/persistence/index.js +2 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +12 -0
- package/dist/runtime/worker.d.ts +36 -1
- package/dist/runtime/worker.js +37 -4
- package/dist/security/checklist.js +46 -0
- package/dist/server/bin.d.ts +72 -0
- package/dist/server/bin.js +304 -0
- package/dist/server/boot.d.ts +20 -2
- package/dist/server/boot.js +29 -3
- package/dist/server/cli-worker.js +6 -3
- package/dist/server/cli.d.ts +13 -0
- package/dist/server/cli.js +10 -5
- package/dist/server/config.d.ts +11 -1
- package/dist/server/config.js +18 -0
- package/dist/server/doctor.d.ts +85 -0
- package/dist/server/doctor.js +280 -0
- package/dist/server/pool.d.ts +47 -0
- package/dist/server/pool.js +73 -0
- package/dist/skills/context.d.ts +61 -0
- package/dist/skills/context.js +107 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +1 -0
- package/dist/telemetry/spans.js +5 -0
- package/dist/testing/conformance/artifact-exports.d.ts +20 -0
- package/dist/testing/conformance/artifact-exports.js +172 -0
- package/dist/testing/conformance/artifacts.d.ts +11 -0
- package/dist/testing/conformance/artifacts.js +316 -0
- package/dist/testing/conformance/audio.d.ts +38 -0
- package/dist/testing/conformance/audio.js +145 -0
- package/dist/testing/conformance/capability.d.ts +23 -0
- package/dist/testing/conformance/capability.js +27 -0
- package/dist/testing/conformance/checkpoint-store.d.ts +15 -0
- package/dist/testing/conformance/checkpoint-store.js +72 -0
- package/dist/testing/conformance/connections.d.ts +14 -0
- package/dist/testing/conformance/connections.js +171 -0
- package/dist/testing/conformance/conversation-store.d.ts +10 -0
- package/dist/testing/conformance/conversation-store.js +60 -0
- package/dist/testing/conformance/evaluation.d.ts +10 -0
- package/dist/testing/conformance/evaluation.js +295 -0
- package/dist/testing/conformance/files.d.ts +19 -0
- package/dist/testing/conformance/files.js +454 -0
- package/dist/testing/conformance/flows.d.ts +16 -0
- package/dist/testing/conformance/flows.js +193 -0
- package/dist/testing/conformance/graph.d.ts +22 -0
- package/dist/testing/conformance/graph.js +500 -0
- package/dist/testing/conformance/hitl.d.ts +25 -0
- package/dist/testing/conformance/hitl.js +523 -0
- package/dist/testing/conformance/index.d.ts +163 -0
- package/dist/testing/conformance/index.js +321 -0
- package/dist/testing/conformance/invariants.d.ts +23 -0
- package/dist/testing/conformance/invariants.js +80 -0
- package/dist/testing/conformance/knowledge.d.ts +41 -0
- package/dist/testing/conformance/knowledge.js +592 -0
- package/dist/testing/conformance/parents.d.ts +50 -0
- package/dist/testing/conformance/parents.js +39 -0
- package/dist/testing/conformance/rate-limit.d.ts +25 -0
- package/dist/testing/conformance/rate-limit.js +71 -0
- package/dist/testing/conformance/records.d.ts +36 -0
- package/dist/testing/conformance/records.js +400 -0
- package/dist/testing/conformance/rollups.d.ts +30 -0
- package/dist/testing/conformance/rollups.js +425 -0
- package/dist/testing/conformance/run-coordinator.d.ts +27 -0
- package/dist/testing/conformance/run-coordinator.js +150 -0
- package/dist/testing/conformance/run-event-log.d.ts +9 -0
- package/dist/testing/conformance/run-event-log.js +138 -0
- package/dist/testing/conformance/run-store.d.ts +12 -0
- package/dist/testing/conformance/run-store.js +294 -0
- package/dist/testing/conformance/session-state.d.ts +38 -0
- package/dist/testing/conformance/session-state.js +198 -0
- package/dist/testing/conformance/usage-limits.d.ts +10 -0
- package/dist/testing/conformance/usage-limits.js +309 -0
- package/dist/testing/conformance.d.ts +8 -0
- package/dist/testing/conformance.js +8 -0
- package/dist/testing/memory-backend.d.ts +39 -0
- package/dist/testing/memory-backend.js +41 -0
- package/dist/testing/pglite.d.ts +55 -0
- package/dist/testing/pglite.js +78 -0
- package/dist/testing/stub-model.d.ts +58 -0
- package/dist/testing/stub-model.js +71 -0
- package/dist/testing/supabase-storage-double.d.ts +35 -0
- package/dist/testing/supabase-storage-double.js +101 -0
- package/dist/toolkit/http.d.ts +27 -0
- package/dist/toolkit/http.js +48 -0
- package/dist/toolkit/index.d.ts +27 -1
- package/dist/toolkit/index.js +24 -1
- package/dist/toolkit/mime.d.ts +97 -0
- package/dist/toolkit/mime.js +233 -0
- package/dist/toolkit/ssrf.d.ts +139 -0
- package/dist/toolkit/ssrf.js +349 -0
- package/dist/toolkit/vendor.d.ts +91 -0
- package/dist/toolkit/vendor.js +153 -0
- package/dist/tools/credentials.d.ts +265 -6
- package/dist/tools/credentials.js +318 -3
- package/dist/tools/define.d.ts +14 -0
- package/dist/tools/define.js +3 -0
- package/dist/tools/index.d.ts +21 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/library/audio.d.ts +63 -0
- package/dist/tools/library/audio.js +148 -0
- package/dist/tools/library/index.d.ts +8 -0
- package/dist/tools/library/index.js +7 -0
- package/dist/tools/registry.d.ts +33 -0
- package/dist/tools/registry.js +72 -2
- package/dist/usage/index.d.ts +21 -0
- package/dist/usage/index.js +1 -0
- package/dist/usage/rate-limit.d.ts +122 -0
- package/dist/usage/rate-limit.js +131 -0
- package/dist/usage/recorder.js +3 -0
- package/package.json +29 -2
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-tenant rate limiting at run admission — REQ-058 (#246), task #248.
|
|
3
|
+
*
|
|
4
|
+
* Cost quotas already gate admission and work well: reservations, `UsageCeiling`, refusal before a provider call
|
|
5
|
+
* (`quota.ts`). **Rate is a different axis and nothing bounded it.** A thousand runs a second, each costing a
|
|
6
|
+
* fraction of a cent, passes every check that existed — `grep -ril "rate limit"` found the phrase only in
|
|
7
|
+
* `runtime/retry.ts`, handling a *provider's* 429, and in the load-test scenario.
|
|
8
|
+
*
|
|
9
|
+
* The two fail differently, which is why this is not a dimension of the quota guard:
|
|
10
|
+
*
|
|
11
|
+
* - A cost ceiling stops a tenant **spending too much over a period**. It is answered from a rollup.
|
|
12
|
+
* - A rate limit stops a tenant **consuming a deployment's capacity right now**. It is answered from a counter
|
|
13
|
+
* that has to be correct across every process in the fleet.
|
|
14
|
+
*
|
|
15
|
+
* ## Why this lives in `usage/`
|
|
16
|
+
*
|
|
17
|
+
* It is not usage, and it sits here anyway: it is an *admission guard*, it is called on the same line as the
|
|
18
|
+
* quota guard, a deployment configures both in the same place, and putting it in its own module would add a
|
|
19
|
+
* published subpath for one port. The alternative was worse than the mild misfiling.
|
|
20
|
+
*
|
|
21
|
+
* ## Fixed window, and what that costs
|
|
22
|
+
*
|
|
23
|
+
* The window is identified by its **start, truncated to the period** — the same decision `bucketStartFor` makes
|
|
24
|
+
* for rollups, for the same reason: two processes asking "which window does T belong to" must agree, and they do
|
|
25
|
+
* because truncation is a pure function of T rather than a range someone chooses. It also means the Redis key is
|
|
26
|
+
* deterministic, so a key can never be created without an expiry and strand a tenant.
|
|
27
|
+
*
|
|
28
|
+
* The cost is the boundary burst: a tenant may send `max` at the end of one window and `max` at the start of the
|
|
29
|
+
* next, so the true worst case over a sliding window is 2×`max`. A sliding-log implementation would fix that and
|
|
30
|
+
* costs a sorted set per tenant with a member per request. Not worth it: the point is to stop a runaway client
|
|
31
|
+
* saturating a fleet, and 2× the intended rate for one window boundary does not.
|
|
32
|
+
*
|
|
33
|
+
* ## Two axes deliberately not implemented — AC-1
|
|
34
|
+
*
|
|
35
|
+
* **Concurrent runs per tenant.** This is a real gap: `startOrEnqueueRun` serialises runs *within* a
|
|
36
|
+
* conversation, and `serialization.ts` says outright that a conversation-less run's concurrency is "bounded
|
|
37
|
+
* where it should be: the worker's own limits, and quotas" — which is a per-process setting and a spend limit,
|
|
38
|
+
* neither of which stops one tenant occupying every slot in the fleet. It is left out because a *correct*
|
|
39
|
+
* implementation must be crash-safe, and a counter incremented at admission and decremented at completion leaks
|
|
40
|
+
* a permanent unit every time a worker dies mid-run. The right home is the existing run **lease**, which already
|
|
41
|
+
* has a TTL and a heartbeat — so this belongs with the lease rather than beside it, and doing it here would mean
|
|
42
|
+
* shipping the leaky version first.
|
|
43
|
+
*
|
|
44
|
+
* **Tool executions per run per interval.** `ExecutionLimits.maxToolCalls` already bounds the *count* and
|
|
45
|
+
* `wallClockTimeoutMs` bounds a tight loop, so a rate would need a clock threaded through the tool path to
|
|
46
|
+
* constrain something already constrained twice.
|
|
47
|
+
*/
|
|
48
|
+
import { AgentPlatformError } from "../core/errors.js";
|
|
49
|
+
/** The window a moment belongs to. Pure, so every process agrees without coordinating. */
|
|
50
|
+
export const windowStartMs = (atMs, windowSeconds) => {
|
|
51
|
+
if (!Number.isFinite(atMs))
|
|
52
|
+
throw new AgentPlatformError({ code: "invalid_input", message: "rate limit: `at` must be a finite number of milliseconds", retryable: false });
|
|
53
|
+
if (!Number.isInteger(windowSeconds) || windowSeconds <= 0)
|
|
54
|
+
throw new AgentPlatformError({
|
|
55
|
+
code: "invalid_input",
|
|
56
|
+
message: `rate limit: windowSeconds must be a positive integer, got ${windowSeconds}`,
|
|
57
|
+
retryable: false,
|
|
58
|
+
});
|
|
59
|
+
const span = windowSeconds * 1_000;
|
|
60
|
+
return Math.floor(atMs / span) * span;
|
|
61
|
+
};
|
|
62
|
+
export const createRateLimitGuard = (deps) => {
|
|
63
|
+
const now = deps.now ?? Date.now;
|
|
64
|
+
return {
|
|
65
|
+
async admit(context) {
|
|
66
|
+
const policy = await deps.policyFor(context);
|
|
67
|
+
/**
|
|
68
|
+
* Unlimited, and this is the branch that matters most on the day this ships — AC-7.
|
|
69
|
+
*
|
|
70
|
+
* No policy, or a `max` of zero, means unlimited rather than deny-everything. A deployment that upgrades
|
|
71
|
+
* into this feature and has configured nothing must keep working; the alternative is an outage caused by
|
|
72
|
+
* adding a safety feature, which is how safety features get removed.
|
|
73
|
+
*/
|
|
74
|
+
if (policy === undefined || policy.max <= 0)
|
|
75
|
+
return { admitted: true, remaining: Number.POSITIVE_INFINITY, resetsAt: new Date(now()).toISOString() };
|
|
76
|
+
const at = now();
|
|
77
|
+
const start = windowStartMs(at, policy.windowSeconds);
|
|
78
|
+
const resetsAtMs = start + policy.windowSeconds * 1_000;
|
|
79
|
+
const resetsAt = new Date(resetsAtMs).toISOString();
|
|
80
|
+
const used = await deps.store.consume({
|
|
81
|
+
tenantId: context.tenantId,
|
|
82
|
+
windowStartMs: start,
|
|
83
|
+
windowSeconds: policy.windowSeconds,
|
|
84
|
+
});
|
|
85
|
+
if (used <= policy.max)
|
|
86
|
+
return { admitted: true, remaining: policy.max - used, resetsAt };
|
|
87
|
+
const refusal = {
|
|
88
|
+
admitted: false,
|
|
89
|
+
limit: policy.max,
|
|
90
|
+
windowSeconds: policy.windowSeconds,
|
|
91
|
+
used,
|
|
92
|
+
resetsAt,
|
|
93
|
+
// At least a millisecond: a window that has just closed must not tell a client to retry in zero, which
|
|
94
|
+
// reads as "immediately" and puts it straight back into the same refusal.
|
|
95
|
+
retryAfterMs: Math.max(1, resetsAtMs - at),
|
|
96
|
+
message: `This workspace has used ${used} of ${policy.max} runs allowed per ${policy.windowSeconds}s. ` +
|
|
97
|
+
`It resets at ${resetsAt}.`,
|
|
98
|
+
};
|
|
99
|
+
await deps.observer?.onRefusal(context, refusal);
|
|
100
|
+
return refusal;
|
|
101
|
+
},
|
|
102
|
+
/** Throws the refusal, for a caller that would rather not branch. Same decision, different ergonomics. */
|
|
103
|
+
async assertAdmitted(context) {
|
|
104
|
+
const decision = await this.admit(context);
|
|
105
|
+
if (!decision.admitted)
|
|
106
|
+
throw new AgentPlatformError({
|
|
107
|
+
code: "admission_rate_limited",
|
|
108
|
+
message: decision.message,
|
|
109
|
+
/**
|
|
110
|
+
* Retryable, and `retryAfterMs` is what makes that honest.
|
|
111
|
+
*
|
|
112
|
+
* The window resets, so a client that treated this as permanent would give up on a workspace that is
|
|
113
|
+
* fine in a second. What must **not** happen is the engine's retry loop absorbing it — and it cannot:
|
|
114
|
+
* this is thrown at admission, before a run exists, so `decideRetry` never sees it. The distinct error
|
|
115
|
+
* code is what keeps it that way if the call site ever moves.
|
|
116
|
+
*/
|
|
117
|
+
retryable: true,
|
|
118
|
+
retryAfterMs: decision.retryAfterMs,
|
|
119
|
+
details: {
|
|
120
|
+
retryAfter: decision.resetsAt,
|
|
121
|
+
retryAfterMs: decision.retryAfterMs,
|
|
122
|
+
limit: decision.limit,
|
|
123
|
+
used: decision.used,
|
|
124
|
+
windowSeconds: decision.windowSeconds,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
return decision;
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=rate-limit.js.map
|
package/dist/usage/recorder.js
CHANGED
|
@@ -49,6 +49,9 @@ export const createUsageRecorder = (config) => {
|
|
|
49
49
|
return computeModelCostMinorUnits(pricing, {
|
|
50
50
|
inputTokens: estimate.inputTokens,
|
|
51
51
|
outputTokens: estimate.maxOutputTokens,
|
|
52
|
+
// Cache-aware when the caller said so — task #247. Absent means assume none, which over-reserves; that is
|
|
53
|
+
// the safe direction for a spend limit and is what this always did.
|
|
54
|
+
...(estimate.cachedInputTokens === undefined ? {} : { cachedInputTokens: estimate.cachedInputTokens }),
|
|
52
55
|
});
|
|
53
56
|
};
|
|
54
57
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@retinue/agentkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "A provider-neutral, durable AI agent runtime for TypeScript: agents, tools, approvals, context, knowledge and persistence behind ports.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -47,14 +47,26 @@
|
|
|
47
47
|
"types": "./dist/entries/usage.d.ts",
|
|
48
48
|
"default": "./dist/entries/usage.js"
|
|
49
49
|
},
|
|
50
|
+
"./connections": {
|
|
51
|
+
"types": "./dist/entries/connections.d.ts",
|
|
52
|
+
"default": "./dist/entries/connections.js"
|
|
53
|
+
},
|
|
50
54
|
"./mcp": {
|
|
51
55
|
"types": "./dist/entries/mcp.d.ts",
|
|
52
56
|
"default": "./dist/entries/mcp.js"
|
|
53
57
|
},
|
|
58
|
+
"./mcp-server": {
|
|
59
|
+
"types": "./dist/entries/mcp-server.d.ts",
|
|
60
|
+
"default": "./dist/entries/mcp-server.js"
|
|
61
|
+
},
|
|
54
62
|
"./observability": {
|
|
55
63
|
"types": "./dist/entries/observability.d.ts",
|
|
56
64
|
"default": "./dist/entries/observability.js"
|
|
57
65
|
},
|
|
66
|
+
"./testing": {
|
|
67
|
+
"types": "./dist/entries/testing.d.ts",
|
|
68
|
+
"default": "./dist/entries/testing.js"
|
|
69
|
+
},
|
|
58
70
|
"./providers": {
|
|
59
71
|
"types": "./dist/entries/providers.d.ts",
|
|
60
72
|
"default": "./dist/entries/providers.js"
|
|
@@ -137,7 +149,10 @@
|
|
|
137
149
|
"graphql": "^16.9.0",
|
|
138
150
|
"graphql-yoga": "^5.10.0",
|
|
139
151
|
"ioredis": "^6.0.0",
|
|
140
|
-
"pg": "^8.23.0"
|
|
152
|
+
"pg": "^8.23.0",
|
|
153
|
+
"vitest": "^3.0.0 || ^4.0.0",
|
|
154
|
+
"@electric-sql/pglite": "^0.2.0 || ^0.3.0",
|
|
155
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
141
156
|
},
|
|
142
157
|
"peerDependenciesMeta": {
|
|
143
158
|
"pg": {
|
|
@@ -175,6 +190,15 @@
|
|
|
175
190
|
},
|
|
176
191
|
"@whatwg-node/server": {
|
|
177
192
|
"optional": true
|
|
193
|
+
},
|
|
194
|
+
"vitest": {
|
|
195
|
+
"optional": true
|
|
196
|
+
},
|
|
197
|
+
"@electric-sql/pglite": {
|
|
198
|
+
"optional": true
|
|
199
|
+
},
|
|
200
|
+
"@modelcontextprotocol/sdk": {
|
|
201
|
+
"optional": true
|
|
178
202
|
}
|
|
179
203
|
},
|
|
180
204
|
"sideEffects": false,
|
|
@@ -187,5 +211,8 @@
|
|
|
187
211
|
"homepage": "https://github.com/Rise-Experts/retinue#readme",
|
|
188
212
|
"bugs": {
|
|
189
213
|
"url": "https://github.com/Rise-Experts/retinue/issues"
|
|
214
|
+
},
|
|
215
|
+
"bin": {
|
|
216
|
+
"retinue": "./dist/server/bin.js"
|
|
190
217
|
}
|
|
191
218
|
}
|