@jaypie/mcp 0.8.189 → 0.8.191

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/assets.js CHANGED
@@ -55,11 +55,11 @@ function getMcpAssetPaths() {
55
55
  */
56
56
  function getMcpBuildInfo() {
57
57
  return {
58
- commit: "5569d996"
58
+ commit: "f88048b4"
59
59
  ,
60
- version: "0.8.189"
60
+ version: "0.8.191"
61
61
  ,
62
- versionString: "@jaypie/mcp@0.8.189#5569d996"
62
+ versionString: "@jaypie/mcp@0.8.191#f88048b4"
63
63
  ,
64
64
  };
65
65
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/mcp",
3
- "version": "0.8.189",
3
+ "version": "0.8.191",
4
4
  "description": "Jaypie MCP",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,37 @@
1
+ ---
2
+ version: 1.2.91
3
+ date: 2026-10-14
4
+ summary: WAF rate limit exempt IPs; Agent permission set stops granting code execution under service roles
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - **`waf.rateLimit`** on `JaypieDistribution` and `JaypieWebDeploymentBucket`
10
+ takes `{ exemptIps, perIp }` (#589). `exemptIps` lists IPv4 and IPv6 CIDRs
11
+ the `RateLimitPerIp` rule neither counts nor blocks. The construct creates
12
+ one `AWS::WAFv2::IPSet` per address family and scopes the rate-based
13
+ statement down to everyone outside them. `rateLimitPerIp` keeps working;
14
+ setting it with `rateLimit.perIp` throws `ConfigurationError`, as does an
15
+ invalid CIDR.
16
+ - **`JaypieSsoPermissions` Agent set** no longer grants actions that run code
17
+ under a service execution role (#570): `iam:PassRole`, Lambda invoke, code,
18
+ configuration, version, alias, and event-source-mapping writes, ECS task
19
+ definition, run, start, and service updates, `ecr:PutImage` and layer
20
+ uploads, `states:StartExecution`, `states:StartSyncExecution`, and
21
+ `pipes:StartPipe`.
22
+ - The Agent set also drops account-wide `secretsmanager:GetSecretValue`,
23
+ `ssm:PutParameter`, and `s3:PutObject`.
24
+ - `AgentDenyPrivilegedPassRole` stays, so a linked policy granting
25
+ `iam:PassRole` still cannot pass the SSO, organization, or CDK roles.
26
+
27
+ ## Upgrade
28
+
29
+ - Agent sessions that invoke or update Lambdas, run ECS tasks, start Step
30
+ Functions executions, read secrets, write parameters, or put objects now
31
+ receive `AccessDenied`. Restore a specific workload with a customer managed
32
+ policy linked to the Agent set, scoped to that workload's ARNs. Nothing
33
+ denies these actions, so such a grant takes effect.
34
+ - Consumers appending a local `DenyAgentExecutionRoleEscalation` statement can
35
+ remove it.
36
+ - `rateLimitPerIp` alone synthesizes the same rule as before; no template
37
+ change without `rateLimit`.
@@ -0,0 +1,10 @@
1
+ ---
2
+ version: 0.4.3
3
+ date: 2026-10-14
4
+ summary: Lint cleanup with no behavior change
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Removes an unused `ConfigurationError` import from `Fabricator`
10
+ - Acknowledges the intentional `console.warn` in `uuidFrom` for lint
@@ -0,0 +1,9 @@
1
+ ---
2
+ version: 1.2.124
3
+ date: 2026-10-14
4
+ summary: Pulls @jaypie/llm 1.3.65
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - **`@jaypie/llm` 1.3.65**: `operate()` streams provider transport internally on Anthropic, OpenAI, xAI, Meta, Google, and Mistral, lifting the 16,384 non-streaming output cap.
@@ -0,0 +1,18 @@
1
+ ---
2
+ version: 1.3.65
3
+ date: 2026-10-14
4
+ summary: operate() streams provider transport internally on Anthropic, OpenAI, xAI, Meta, Google, and Mistral, lifting the 16,384 non-streaming output cap
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - `operate()` consumes the provider stream internally and still returns one settled `LlmOperateResponse` on Anthropic, OpenAI, xAI, Meta, Google, and Mistral (#603). Each adapter accumulates stream events back into the payload its non-streaming request returns, so parsing, tool calls, history, structured output, and stop reasons are unchanged.
10
+ - Output budgets resolve to the model maximum instead of 16,384. Gemini 2.5/3.x reaches 65,536; Mistral reaches its 32,768 cap, which stays because it bounds degenerate restating.
11
+ - `timeout` becomes an idle timeout on these providers: the deadline resets on every stream event, so a stall fails over sooner and a long active generation is not cut off. Fireworks, OpenRouter, and Bedrock keep the non-streaming request and a whole-attempt deadline.
12
+ - Parameter-rejection retries (temperature, `reasoning_effort`, `response_format`, schema and output-format rejections) behave the same on both transports.
13
+ - A provider error event inside a stream classifies like the matching HTTP status; a stream that closes before settling is retried as a 500.
14
+
15
+ ## Upgrade
16
+
17
+ - Long responses that previously stopped at 16,384 tokens with `MAX_TOKENS` now run to the model maximum. Cost and latency grow with them; set `maxTokens` to keep a ceiling.
18
+ - A `timeout` sized for the slowest whole non-streaming response can shrink to the longest expected pause between events.
@@ -0,0 +1,11 @@
1
+ ---
2
+ version: 0.8.190
3
+ date: 2026-10-14
4
+ summary: Skills agree on packages/cdk as the CDK package directory
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - **Skills**: `monorepo`, `cdk`, `cicd-actions`, `cicd-deploy`, `dynamodb`, and `jaypie` name `packages/cdk` as the single location for the CDK package (#623)
10
+ - **`monorepo`**: drops `stacks` as a workspace directory name; limits `workspaces/` to repositories whose `packages/` publish to npm; notes that the root `package.json` and vitest globs cover `packages/*` only
11
+ - **`cicd-actions`**: `cdk-deploy` defaults `working-directory` to `packages/cdk`; `web-deploy` defaults to `packages/cdk/cdk-outputs.json` and `packages/web/dist`
@@ -0,0 +1,11 @@
1
+ ---
2
+ version: 0.8.191
3
+ date: 2026-10-14
4
+ summary: WAF skills document waf.rateLimit exemptIps; llm skill documents the streamed operate transport
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - **`waf`**: example for `rateLimit: { exemptIps, perIp }`, exempting known CIDRs from the per-IP rate rule (#589)
10
+ - **`cdk`**: lists `rateLimit` among the WAF configuration props
11
+ - **`llm`**: Default Output Token Limits and timeout notes reflect `operate()` streaming internally on Anthropic, OpenAI, xAI, Meta, Google, and Mistral (#603)
@@ -0,0 +1,9 @@
1
+ ---
2
+ version: 0.2.7
3
+ date: 2026-10-14
4
+ summary: Incomplete markdown conversion warns through the logger only
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - `MarkdownPage` drops a `console.warn` that duplicated `log.warn` for incomplete JSON-to-markdown conversion; the warning still logs once through the Jaypie logger
package/skills/cdk.md CHANGED
@@ -107,10 +107,10 @@ new JaypieSesIntake(this, "Intake", {
107
107
 
108
108
  ## Stack Structure
109
109
 
110
- Organize stacks in the `workspaces/` directory:
110
+ The CDK package lives at `packages/cdk`, alongside every other workspace (see `skill("monorepo")`):
111
111
 
112
112
  ```
113
- workspaces/
113
+ packages/
114
114
  ├── cdk/
115
115
  │ ├── src/
116
116
  │ │ ├── app.ts # CDK app entry
@@ -439,7 +439,7 @@ new JaypieDistribution(this, "Dist", {
439
439
  KnownBadInputsRuleSet, IP rate limiting, and WAF logging to S3 with Datadog
440
440
  forwarding.
441
441
 
442
- See **`skill("waf")`** for configuration: `rateLimitPerIp`, `webAclArn`,
442
+ See **`skill("waf")`** for configuration: `rateLimit` (`perIp`, `exemptIps`), `rateLimitPerIp`, `webAclArn`,
443
443
  `logBucket`, `logRetention`, `managedRuleOverrides`, `managedRuleScopeDowns`,
444
444
  `redactedFields`, `redactedHeaders`, the `allow` path-scoped relaxation prop,
445
445
  and the rule-name ↔ label casing trap.
@@ -194,7 +194,6 @@ runs:
194
194
  path: |
195
195
  node_modules
196
196
  packages/*/node_modules
197
- workspaces/*/node_modules
198
197
  key: ${{ runner.os }}-node-${{ inputs.node-version }}-${{ hashFiles('**/package-lock.json') }}
199
198
  restore-keys: |
200
199
  ${{ runner.os }}-node-${{ inputs.node-version }}-
@@ -205,8 +204,7 @@ runs:
205
204
  with:
206
205
  path: |
207
206
  packages/*/dist
208
- workspaces/*/dist
209
- workspaces/*/.open-next
207
+ packages/*/.open-next
210
208
  key: ${{ runner.os }}-build-${{ github.sha }}
211
209
  restore-keys: |
212
210
  ${{ runner.os }}-build-
@@ -262,7 +260,7 @@ inputs:
262
260
  working-directory:
263
261
  description: 'Working directory for CDK commands'
264
262
  required: false
265
- default: 'workspaces/cdk'
263
+ default: 'packages/cdk'
266
264
  require-approval:
267
265
  description: 'CDK approval mode (never, any-change, broadening)'
268
266
  required: false
@@ -310,7 +308,7 @@ inputs:
310
308
  outputs-file:
311
309
  description: 'Path to cdk-outputs.json produced by cdk deploy'
312
310
  required: false
313
- default: 'workspaces/cdk/cdk-outputs.json'
311
+ default: 'packages/cdk/cdk-outputs.json'
314
312
  prefix:
315
313
  description: 'Output name prefix when exportOutputs({ prefix }) was used (e.g., "App")'
316
314
  required: false
@@ -318,7 +316,7 @@ inputs:
318
316
  source:
319
317
  description: 'Directory of built assets to sync'
320
318
  required: false
321
- default: 'workspaces/web/dist'
319
+ default: 'packages/web/dist'
322
320
  region:
323
321
  description: 'AWS region'
324
322
  required: false
@@ -261,7 +261,7 @@ jobs:
261
261
 
262
262
  CDK provisions a `JaypieWebDeploymentBucket`; it does not fill it. Jaypie avoids `s3deploy.BucketDeployment`, so shipping content is a workflow step:
263
263
 
264
- 1. `cdk-deploy` deploys the bucket, distribution, and deploy role, and writes `workspaces/cdk/cdk-outputs.json`.
264
+ 1. `cdk-deploy` deploys the bucket, distribution, and deploy role, and writes `packages/cdk/cdk-outputs.json`.
265
265
  2. `web-deploy` reads `DestinationBucketName`, `DestinationBucketDeployRoleArn`, and `DistributionId` from that file.
266
266
  3. `web-deploy` assumes the deploy role, syncs the built assets, and invalidates the distribution.
267
267
 
@@ -278,7 +278,7 @@ See `skill("cicd-actions")` for the `web-deploy` action body and `skill("web")`
278
278
  `JaypieStack` names every stack `cdk-{PROJECT_SPONSOR}-{PROJECT_KEY}-{PROJECT_ENV}-{PROJECT_NONCE}[-{key}]` and resolves the account and region (see `skill("cdk")`). Do not compose stack names in `app.ts`:
279
279
 
280
280
  ```typescript
281
- // workspaces/cdk/src/app.ts
281
+ // packages/cdk/src/app.ts
282
282
  import { App } from "aws-cdk-lib";
283
283
  import { JaypieAppStack } from "@jaypie/constructs";
284
284
 
@@ -550,7 +550,7 @@ registerModel({ model: "session", indexes: [fabricIndex()], ttl: "30 days" });
550
550
  ```
551
551
 
552
552
  ```typescript
553
- // workspaces/cdk/lib/data-stack.ts
553
+ // packages/cdk/lib/data-stack.ts
554
554
  import "@project/models"; // registers models
555
555
  import { JaypieDynamoDb } from "@jaypie/constructs";
556
556
  import { getAllRegisteredIndexes } from "@jaypie/fabric";
package/skills/jaypie.md CHANGED
@@ -50,11 +50,10 @@ Jaypie projects use npm workspaces:
50
50
 
51
51
  ```
52
52
  project/
53
- ├── packages/ # npm packages
53
+ ├── packages/ # npm workspaces
54
54
  │ ├── api/ # Express API
55
+ │ ├── cdk/ # CDK app
55
56
  │ └── lib/ # Shared library
56
- ├── workspaces/ # CDK infrastructure
57
- │ └── cdk/ # CDK app
58
57
  └── package.json # Root workspace config
59
58
  ```
60
59
 
package/skills/llm.md CHANGED
@@ -916,7 +916,8 @@ const response = await llm.operate(input, {
916
916
  - A timeout is never an `LlmAbortError`: the caller's `signal` still owns cancellation.
917
917
  - An entry's own `timeout` replaces the call's for that entry; `false` disables it.
918
918
  - `stream()` treats `timeout` as an idle timeout: it restarts with every chunk and pauses while the consumer holds one. A stall after partial output yields an error chunk.
919
- - No default applies; unset means no deadline. Size it above the slowest legitimate non-streaming response (long reasoning runs take minutes).
919
+ - `operate()` on Anthropic, Google, Mistral, OpenAI, xAI, and Meta streams its transport internally, so `timeout` is an idle timeout there too: it restarts with every event the provider sends, catching a stall without cutting off a long generation that is still producing. On Bedrock, Fireworks, and OpenRouter `operate()` sends non-streaming requests and `timeout` bounds the whole attempt.
920
+ - No default applies; unset means no deadline. On the non-streaming providers, size it above the slowest legitimate response (long reasoning runs take minutes).
920
921
  - `Llm.ocr` keeps `timeout` as the LlamaParse job deadline.
921
922
  - A timeout that hands off to the next model logs at `debug` (`API call timed out after 60000ms; not retrying`, then `Provider openai failed; failing over`). Only the failure that reaches the caller logs at `warn`. The report tally counts it under `failures` and `fallbacks`.
922
923
 
@@ -1359,14 +1360,21 @@ Google merges them into the generation config.
1359
1360
 
1360
1361
  ### Default Output Token Limits
1361
1362
 
1362
- Anthropic and Google requests resolve a default output-token limit from the
1363
- model's documented maximum output, so long generations do not silently
1364
- truncate:
1363
+ Anthropic, Google, and Mistral requests resolve a default output-token limit
1364
+ from the model's documented maximum output, so long generations do not
1365
+ silently truncate:
1365
1366
 
1366
- - **Non-streaming** (`operate()`, `send()`): capped at 16,384 tokens —
1367
- larger non-streaming responses risk HTTP timeouts (stream instead)
1368
- - **Streaming** (`stream()`): the model maximum — e.g., 128,000 for current
1369
- Claude models (64,000 for Haiku 4.5), 65,536 for Gemini 2.5/3.x
1367
+ - **Streamed transport** (`stream()`, and `operate()` on Anthropic, Google,
1368
+ Mistral, OpenAI, xAI, and Meta): the model maximum — e.g., 128,000 for
1369
+ current Claude models (64,000 for Haiku 4.5), 65,536 for Gemini 2.5/3.x
1370
+ - **Non-streaming**: an adapter request built without the streamed
1371
+ transport is capped at 16,384 (larger non-streaming responses risk HTTP
1372
+ timeouts). The deprecated `send()` on Anthropic sends 16,384 as well
1373
+
1374
+ `operate()` consumes the provider stream internally and still returns one
1375
+ settled response (same `content`, tool calls, history, stop reason, and
1376
+ usage), so streaming there is a transport detail with no caller-facing change.
1377
+ Bedrock, Fireworks, and OpenRouter keep non-streaming `operate()` requests.
1370
1378
 
1371
1379
  Override per model with `modelOptions`:
1372
1380
 
@@ -1383,19 +1391,19 @@ await Llm.operate(input, {
1383
1391
 
1384
1392
  OpenAI, xAI, and Meta leave the limit unset (their defaults do not truncate early).
1385
1393
  A chain that mixes them with Anthropic, Google, or Mistral therefore mixes
1386
- output budgets: a Gemini primary resolves to 16,384 non-streaming while an
1394
+ output budgets: a Gemini primary resolves to its 65,536 model maximum while an
1387
1395
  OpenAI fallback sends no ceiling, so swapping the primary moves the effective
1388
1396
  budget with nothing at the call site changing. Reasoning tokens count against
1389
1397
  the ceiling. Set `maxOutputTokens` (Google) or `max_tokens` (Anthropic,
1390
1398
  Mistral) in `modelOptions` to pin it per model.
1391
- Mistral is capped (32,768 streaming / 16,384 non-streaming) despite publishing
1392
- no low ceiling: a Mistral model can degenerate into restating its answer when
1399
+ Mistral is capped at 32,768 on every transport despite publishing no low
1400
+ ceiling: a Mistral model can degenerate into restating its answer when
1393
1401
  `format` and tools are combined, and an uncapped completion turns that into a
1394
1402
  multi-minute request. Override with `modelOptions: { mistral: { max_tokens } }`.
1395
1403
  OpenRouter varies by routed model; pass `max_tokens` via `modelOptions`
1396
1404
  when needed. A truncated response settles `status: "incomplete"` with
1397
1405
  `stopReason: "max_tokens"` and moves a fallback chain to its next entry;
1398
- raise the limit or switch to `stream()`.
1406
+ raise the limit through `modelOptions`.
1399
1407
 
1400
1408
  ## See Also
1401
1409
 
@@ -135,8 +135,12 @@ npm install --save-dev @jaypie/eslint @jaypie/repokit @jaypie/testkit eslint vit
135
135
 
136
136
  | Directory | Purpose |
137
137
  |-----------|---------|
138
- | `packages/` | npm packages (default workspace) |
139
- | `workspaces/` | CDK-deployed infrastructure and sites |
138
+ | `packages/` | Default for every workspace: npm packages, the CDK package (`packages/cdk`), and sites (`packages/web`) |
139
+ | `workspaces/` | Only in a repository whose `packages/` publish to npm: the unpublished workspaces that manage them (`workspaces/cdk`, `workspaces/documentation`) |
140
+
141
+ Use `packages/cdk` unless the repository publishes its packages to npm. The Jaypie repository itself is the `workspaces/` case: `packages/` holds the published libraries and `workspaces/` holds the CDK app and documentation site that deploy around them.
142
+
143
+ `packages/cdk` is the default the `cdk`, `cicd-actions`, and `cicd-deploy` skills assume. The root `package.json` scripts and the vitest `test.projects` glob cover `packages/*` only, so a repository that adds `workspaces/` must pass `workspaces/cdk` to the `cdk-deploy` and `web-deploy` inputs, and its workspaces fall out of `build`, `clean`, `format:package`, `test`, and `typecheck` until every one of those globs names it.
140
144
 
141
145
  ## Scripts Reference
142
146
 
@@ -164,10 +168,9 @@ npm install --save-dev @jaypie/eslint @jaypie/repokit @jaypie/testkit eslint vit
164
168
  - etc: configurations
165
169
  - lib: usually within a src directory, modules of encapsulated logic that could be refactored out later
166
170
  - LOCAL: human local scratch directory, include in gitignore
167
- - packages: default and preferred name for NPM workspaces; always use for packages publishing to NPM
168
- - stacks: allowed name for NPM workspaces that publish via CDK
171
+ - packages: default directory for NPM workspaces, including the CDK package (`packages/cdk`); always use for packages publishing to NPM
169
172
  - templates: usually CloudFormation
170
- - workspaces: allowed name for NPM workspace that do not publish
173
+ - workspaces: unpublished workspaces (CDK, sites) in a repository whose packages publish to NPM
171
174
  - var: agent and machine local scratch directory, include in gitignore
172
175
 
173
176
  ### Discouraged Folder Names
package/skills/waf.md CHANGED
@@ -26,6 +26,16 @@ new JaypieDistribution(this, "Dist", {
26
26
  waf: { name: "api", rateLimitPerIp: 500 },
27
27
  });
28
28
 
29
+ // Exempt known source CIDRs (a partner's backfill server) from the per-IP
30
+ // rate rule. Everyone else is still limited at perIp per 5 minutes.
31
+ new JaypieDistribution(this, "Dist", {
32
+ handler,
33
+ waf: {
34
+ name: "api",
35
+ rateLimit: { exemptIps: ["203.0.113.10/32", "2001:db8::/48"], perIp: 2000 },
36
+ },
37
+ });
38
+
29
39
  // Multiple distributions in one env — set a unique waf.name on each to
30
40
  // avoid WebACL/S3 bucket name collisions between stacks.
31
41
  new JaypieDistribution(this, "Api", { handler: api, waf: { name: "api" } });