@keystrokehq/cli 0.1.124 → 0.1.126

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.
@@ -350,7 +350,7 @@ Invoke/inspect commands print JSON to stdout (exit 0 on success, 1 on failure)
350
350
  1. **Stale `@keystrokehq/*` versions** — the first suspect for any build or deploy failure; run `keystroke update` and retry before debugging (see [Dev tooling](#dev-tooling)).
351
351
  2. **Action calling an action** — throws at runtime and fails lint. Compose in a workflow, or attach the integration action directly.
352
352
  3. **Bad model id** — must be exact `vendor/model-id` from the catalog; don't kebab the version. Fails at deploy, not typecheck.
353
- 4. **LLM structured output: use `.nullish()`, not `.optional()`**models emit `"field": null` for "not applicable", and Zod `.optional()` rejects `null` (the step fails). Use `.nullish()` (or `.nullable()`) for any optional field in an `outputSchema`.
353
+ 4. **LLM structured output: prefer `.nullable()` for optional fields** OpenAI/Azure strict mode requires every property key in `required`. Zod `.optional()` / `.nullish()` omit keys and the API rejects the schema before the model runs. Keystroke rewrites those wrappers to `.nullable()` on the wire, but authoring with `.nullable()` (always present, may be `null`) matches what the model returns and avoids surprises. Avoid bare `.optional()` in `outputSchema`.
354
354
  5. **Structured output + tools is vendor-specific** — Anthropic Sonnet/Opus and OpenAI/Google/xAI are reliable; z-ai GLM uses a submit tool when tools are present; Alibaba Qwen is best-effort. See [structured output with tools](/learn/agents/build-agents#structured-output-with-tools).
355
355
  6. **Silent fallbacks hide real failures** — for live config (Sheets, DBs, credentials), don't `catch` and quietly substitute fallback/empty data in production paths; a run that "completes" with empty inputs looks like success in the trace but is a silent failure. Throw when required config is missing or empty, and validate response shape, not just status.
356
356
  7. **Side effects outside steps** — they re-run on every replay. Keep them inside `.run()` / `.prompt()`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keystrokehq/cli",
3
- "version": "0.1.124",
3
+ "version": "0.1.126",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/keystrokehq/keystroke.git",
@@ -45,8 +45,8 @@
45
45
  "tsx": "^4.22.3",
46
46
  "@keystrokehq/oxlint-config": "0.0.4",
47
47
  "@keystrokehq/tsconfig": "0.0.3",
48
- "@keystrokehq/tsdown-config": "0.0.5",
49
- "@keystrokehq/vitest-config": "0.0.7"
48
+ "@keystrokehq/vitest-config": "0.0.7",
49
+ "@keystrokehq/tsdown-config": "0.0.5"
50
50
  },
51
51
  "engines": {
52
52
  "node": "^22.18.0 || >=24.0.0"