@vurb/core 3.5.0 → 3.6.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 (85) hide show
  1. package/README.md +51 -2
  2. package/dist/cli/scaffold.js +2 -0
  3. package/dist/cli/scaffold.js.map +1 -1
  4. package/dist/cli/templates/config.js +1 -1
  5. package/dist/cli/templates/config.js.map +1 -1
  6. package/dist/cli/templates/index.d.ts +1 -0
  7. package/dist/cli/templates/index.d.ts.map +1 -1
  8. package/dist/cli/templates/index.js +2 -0
  9. package/dist/cli/templates/index.js.map +1 -1
  10. package/dist/cli/templates/model.d.ts +7 -0
  11. package/dist/cli/templates/model.d.ts.map +1 -0
  12. package/dist/cli/templates/model.js +31 -0
  13. package/dist/cli/templates/model.js.map +1 -0
  14. package/dist/cli/templates/presenter.d.ts.map +1 -1
  15. package/dist/cli/templates/presenter.js +4 -9
  16. package/dist/cli/templates/presenter.js.map +1 -1
  17. package/dist/cli/templates/readme.d.ts.map +1 -1
  18. package/dist/cli/templates/readme.js +2 -0
  19. package/dist/cli/templates/readme.js.map +1 -1
  20. package/dist/core/builder/BuildPipeline.d.ts +56 -0
  21. package/dist/core/builder/BuildPipeline.d.ts.map +1 -0
  22. package/dist/core/builder/BuildPipeline.js +139 -0
  23. package/dist/core/builder/BuildPipeline.js.map +1 -0
  24. package/dist/core/builder/FluentToolBuilder.d.ts +64 -19
  25. package/dist/core/builder/FluentToolBuilder.d.ts.map +1 -1
  26. package/dist/core/builder/FluentToolBuilder.js +116 -114
  27. package/dist/core/builder/FluentToolBuilder.js.map +1 -1
  28. package/dist/core/builder/ProxyHandler.d.ts +26 -0
  29. package/dist/core/builder/ProxyHandler.d.ts.map +1 -0
  30. package/dist/core/builder/ProxyHandler.js +65 -0
  31. package/dist/core/builder/ProxyHandler.js.map +1 -0
  32. package/dist/core/builder/SemanticDefaults.d.ts +25 -0
  33. package/dist/core/builder/SemanticDefaults.d.ts.map +1 -0
  34. package/dist/core/builder/SemanticDefaults.js +16 -0
  35. package/dist/core/builder/SemanticDefaults.js.map +1 -0
  36. package/dist/core/builder/index.d.ts +2 -1
  37. package/dist/core/builder/index.d.ts.map +1 -1
  38. package/dist/core/builder/index.js +1 -0
  39. package/dist/core/builder/index.js.map +1 -1
  40. package/dist/core/middleware/AuditTrail.d.ts.map +1 -1
  41. package/dist/core/middleware/AuditTrail.js +6 -2
  42. package/dist/core/middleware/AuditTrail.js.map +1 -1
  43. package/dist/core/middleware/RateLimiter.d.ts.map +1 -1
  44. package/dist/core/middleware/RateLimiter.js +3 -1
  45. package/dist/core/middleware/RateLimiter.js.map +1 -1
  46. package/dist/fsm/StateMachineGate.d.ts +3 -0
  47. package/dist/fsm/StateMachineGate.d.ts.map +1 -1
  48. package/dist/fsm/StateMachineGate.js +12 -0
  49. package/dist/fsm/StateMachineGate.js.map +1 -1
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +3 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/model/defineModel.d.ts +167 -0
  55. package/dist/model/defineModel.d.ts.map +1 -0
  56. package/dist/model/defineModel.js +345 -0
  57. package/dist/model/defineModel.js.map +1 -0
  58. package/dist/model/index.d.ts +8 -0
  59. package/dist/model/index.d.ts.map +1 -0
  60. package/dist/model/index.js +7 -0
  61. package/dist/model/index.js.map +1 -0
  62. package/dist/observability/TelemetryBus.d.ts.map +1 -1
  63. package/dist/observability/TelemetryBus.js +14 -13
  64. package/dist/observability/TelemetryBus.js.map +1 -1
  65. package/dist/presenter/Presenter.d.ts +21 -0
  66. package/dist/presenter/Presenter.d.ts.map +1 -1
  67. package/dist/presenter/Presenter.js +17 -8
  68. package/dist/presenter/Presenter.js.map +1 -1
  69. package/dist/presenter/PresenterPipeline.d.ts +2 -0
  70. package/dist/presenter/PresenterPipeline.d.ts.map +1 -1
  71. package/dist/presenter/PresenterPipeline.js +4 -0
  72. package/dist/presenter/PresenterPipeline.js.map +1 -1
  73. package/dist/presenter/definePresenter.d.ts.map +1 -1
  74. package/dist/presenter/definePresenter.js +13 -3
  75. package/dist/presenter/definePresenter.js.map +1 -1
  76. package/dist/resource/ResourceRegistry.d.ts +3 -0
  77. package/dist/resource/ResourceRegistry.d.ts.map +1 -1
  78. package/dist/resource/ResourceRegistry.js +8 -2
  79. package/dist/resource/ResourceRegistry.js.map +1 -1
  80. package/dist/sandbox/SandboxGuard.js +7 -4
  81. package/dist/sandbox/SandboxGuard.js.map +1 -1
  82. package/dist/server/ServerAttachment.d.ts.map +1 -1
  83. package/dist/server/ServerAttachment.js +48 -9
  84. package/dist/server/ServerAttachment.js.map +1 -1
  85. package/package.json +1 -1
package/README.md CHANGED
@@ -5,8 +5,8 @@
5
5
  <img src="https://github.com/user-attachments/assets/86ae1b28-a938-4e12-af29-bfc60a55dbe8" style="border-radius:8px;background:#000000;padding:10px;border:1px solid #414141;" alt="Vurb.ts">
6
6
  </picture>
7
7
 
8
- **The MVA framework for production MCP servers.**<br>
9
- Structured perception for AI agents. Zero hallucination. Zero data leaks.
8
+ **The TypeScript Framework for MCP Servers.**<br>
9
+ Type-safe tools, structured AI perception, and built-in security. Deploy once — every AI assistant connects instantly.
10
10
 
11
11
  [![npm version](https://img.shields.io/npm/v/@vurb/core.svg?color=0ea5e9)](https://www.npmjs.com/package/@vurb/core)
12
12
  [![Downloads](https://img.shields.io/npm/dw/@vurb/core)](https://www.npmjs.com/package/@vurb/core)
@@ -20,6 +20,55 @@ Structured perception for AI agents. Zero hallucination. Zero data leaks.
20
20
 
21
21
  ---
22
22
 
23
+ ## Zero Learning Curve — Ship a SKILL.md, Not a Tutorial
24
+
25
+ Every framework you've adopted followed the same loop: read the docs, study the conventions, hit an edge case, search GitHub issues, re-read the docs. Weeks before your first production PR. Your AI coding agent does the same — it hallucinates Express patterns into your Hono project because it has no formal contract to work from.
26
+
27
+ Vurb.ts ships a **[SKILL.md](https://agentskills.io)** — a machine-readable architectural contract that your AI agent ingests before generating a single line. Not a tutorial. Not a "getting started guide" the LLM will paraphrase loosely. A **typed specification**: every Fluent API method, every builder chain, every Presenter composition rule, every middleware signature, every file-based routing convention. The agent doesn't approximate — it compiles against the spec.
28
+
29
+ **One prompt. Working server. Zero iterations:**
30
+
31
+ ```
32
+ → "Build an MCP server for patient records with Prisma.
33
+ Redact SSN and diagnosis from LLM output. Add an FSM
34
+ that gates discharge tools until attending physician signs off."
35
+ ```
36
+
37
+ The agent reads `SKILL.md` and produces:
38
+
39
+ ```typescript
40
+ // src/tools/patients/discharge.ts — generated by your AI agent
41
+ const PatientPresenter = createPresenter('Patient')
42
+ .schema({ id: t.string, name: t.string, ssn: t.string, diagnosis: t.string })
43
+ .redactPII(['ssn', 'diagnosis'])
44
+ .rules(['HIPAA: diagnosis visible in UI blocks but REDACTED in LLM output']);
45
+
46
+ const gate = f.fsm({
47
+ id: 'discharge', initial: 'admitted',
48
+ states: {
49
+ admitted: { on: { SIGN_OFF: 'cleared' } },
50
+ cleared: { on: { DISCHARGE: 'discharged' } },
51
+ discharged: { type: 'final' },
52
+ },
53
+ });
54
+
55
+ export default f.mutation('patients.discharge')
56
+ .describe('Discharge a patient')
57
+ .bindState('cleared', 'DISCHARGE')
58
+ .returns(PatientPresenter)
59
+ .handle(async (input, ctx) => ctx.db.patients.update({
60
+ where: { id: input.id }, data: { status: 'discharged' },
61
+ }));
62
+ ```
63
+
64
+ Correct Presenter with `.redactPII()`. FSM gating that makes `patients.discharge` invisible until sign-off. File-based routing. Typed handler. **First pass — no corrections.**
65
+
66
+ This works on Cursor, Claude Code, GitHub Copilot, Windsurf, Cline — any agent that can read a file. The `SKILL.md` is the single source of truth: the agent doesn't need to have been trained on Vurb.ts, it just needs to read the spec.
67
+
68
+ > **You don't learn Vurb.ts. You don't teach your agent Vurb.ts.** You hand it a 400-line contract. It writes the server. You review the PR.
69
+
70
+ ---
71
+
23
72
  ## Get Started in 5 Seconds
24
73
 
25
74
  ```bash
@@ -61,6 +61,8 @@ function buildFileList(config) {
61
61
  // ── Tools ────────────────────────────────────────────
62
62
  files.push({ path: 'src/tools/system/health.ts', content: tpl.healthToolTs() });
63
63
  files.push({ path: 'src/tools/system/echo.ts', content: tpl.echoToolTs() });
64
+ // ── Model ─────────────────────────────────────────────
65
+ files.push({ path: 'src/models/SystemModel.ts', content: tpl.systemModelTs() });
64
66
  // ── Presenter ────────────────────────────────────────
65
67
  files.push({ path: 'src/presenters/SystemPresenter.ts', content: tpl.systemPresenterTs() });
66
68
  // ── Prompts ──────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAS5C,4DAA4D;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,MAAqB;IAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,6DAA6D;QAC7D,IAAI,CAAC;YAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACxF,MAAM,GAAG,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,4DAA4D;AAE5D,SAAS,aAAa,CAAC,MAAqB;IACxC,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,wDAAwD;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE/D,yDAAyD;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE7E,wDAAwD;IACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAErE,wDAAwD;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE5E,yDAAyD;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAEhF,wDAAwD;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,OAAO,EAAE,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAE5F,wDAAwD;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAE3E,yDAAyD;IACzD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,wDAAwD;IACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,wDAAwD;IACxD,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,4DAA4D;AAE5D,SAAS,cAAc,CAAC,KAAqB,EAAE,MAAqB;IAChE,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,QAAQ;YACT,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM;QAEV,KAAK,KAAK;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM;QAEV,KAAK,SAAS;YACV,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM;QAEV,KAAK,OAAO;YACR,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACjF,MAAM;QAEV,KAAK,SAAS,CAAC;QACf;YACI,+DAA+D;YAC/D,MAAM;IACd,CAAC;AACL,CAAC"}
@@ -3,7 +3,7 @@ import { CORE_VERSION, TESTING_VERSION, MCP_SDK_VERSION, ZOD_VERSION } from './c
3
3
  export function packageJson(config) {
4
4
  const deps = {
5
5
  '@modelcontextprotocol/sdk': MCP_SDK_VERSION,
6
- 'vurb': CORE_VERSION,
6
+ '@vurb/core': CORE_VERSION,
7
7
  'zod': ZOD_VERSION,
8
8
  };
9
9
  if (config.vector === 'prisma') {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/templates/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/templates/config.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  export { packageJson, tsconfig, gitignore, envExample } from './config.js';
8
8
  export { vurbTs, contextTs, serverTs } from './core.js';
9
9
  export { healthToolTs, echoToolTs } from './tools.js';
10
+ export { systemModelTs } from './model.js';
10
11
  export { systemPresenterTs } from './presenter.js';
11
12
  export { greetPromptTs } from './prompt.js';
12
13
  export { authMiddlewareTs } from './middleware.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -10,6 +10,8 @@ export { packageJson, tsconfig, gitignore, envExample } from './config.js';
10
10
  export { vurbTs, contextTs, serverTs } from './core.js';
11
11
  // Tools
12
12
  export { healthToolTs, echoToolTs } from './tools.js';
13
+ // Model
14
+ export { systemModelTs } from './model.js';
13
15
  // Presenter
14
16
  export { systemPresenterTs } from './presenter.js';
15
17
  // Prompt
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3E,+CAA+C;AAC/C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3E,+CAA+C;AAC/C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Model Template — MVA Domain Layer (defineModel)
3
+ * @module
4
+ */
5
+ /** Generate `src/models/SystemModel.ts` */
6
+ export declare function systemModelTs(): string;
7
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,wBAAgB,aAAa,IAAI,MAAM,CAwBtC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Model Template — MVA Domain Layer (defineModel)
3
+ * @module
4
+ */
5
+ /** Generate `src/models/SystemModel.ts` */
6
+ export function systemModelTs() {
7
+ return `/**
8
+ * System Model — MVA Domain Layer (defineModel)
9
+ *
10
+ * Defines the shape of system health data using defineModel().
11
+ * The Model provides:
12
+ * - Field types with m.string(), m.number(), etc.
13
+ * - .describe() annotations that become JIT system rules
14
+ * - Validation and casting for the domain entity
15
+ *
16
+ * The Presenter references this Model instead of raw z.object(),
17
+ * keeping a single source of truth for the data shape.
18
+ */
19
+ import { defineModel } from '@vurb/core';
20
+
21
+ export const SystemModel = defineModel('SystemHealth', m => {
22
+ m.casts({
23
+ status: m.string('Server operational status'),
24
+ uptime: m.number('Uptime in seconds since process start'),
25
+ version: m.string('Server version string'),
26
+ timestamp: m.string('ISO 8601 timestamp of this check'),
27
+ });
28
+ });
29
+ `;
30
+ }
31
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/cli/templates/model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,MAAM,UAAU,aAAa;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/presenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,wBAAgB,iBAAiB,IAAI,MAAM,CAuC1C"}
1
+ {"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/presenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,wBAAgB,iBAAiB,IAAI,MAAM,CAkC1C"}
@@ -9,27 +9,22 @@ export function systemPresenterTs() {
9
9
  ' * System Presenter — MVA View Layer (Egress Firewall)',
10
10
  ' *',
11
11
  ' * Defines how the Agent perceives system health data.',
12
- ' * The Zod schema acts as a field whitelist — undeclared',
12
+ ' * The Model schema acts as a field whitelist — undeclared',
13
13
  ' * fields are physically stripped in RAM before they',
14
14
  ' * reach the LLM context window.',
15
15
  ' *',
16
16
  ' * Features demonstrated:',
17
- ' * - definePresenter() with Zod schema',
17
+ ' * - definePresenter() with Model schema (not raw z.object)',
18
18
  ' * - .describe() auto-rules (JIT — travel with data, not in global prompt)',
19
19
  ' * - ui.markdown() server-rendered UI blocks',
20
20
  ' * - suggestActions() for HATEOAS-style affordances',
21
21
  ' */',
22
22
  "import { definePresenter, ui } from '@vurb/core';",
23
- "import { z } from 'zod';",
23
+ "import { SystemModel } from '../models/SystemModel.js';",
24
24
  '',
25
25
  'export const SystemPresenter = definePresenter({',
26
26
  " name: 'SystemHealth',",
27
- ' schema: z.object({',
28
- " status: z.string().describe('Server operational status'),",
29
- " uptime: z.number().describe('Uptime in seconds since process start'),",
30
- " version: z.string().describe('Server version string'),",
31
- " timestamp: z.string().describe('ISO 8601 timestamp of this check'),",
32
- ' }),',
27
+ ' schema: SystemModel,',
33
28
  ' // autoRules: true (default) — .describe() annotations become system rules',
34
29
  ' ui: (data) => [',
35
30
  ' ui.markdown(',
@@ -1 +1 @@
1
- {"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../../src/cli/templates/presenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,MAAM,UAAU,iBAAiB;IAC7B,OAAO;QACH,KAAK;QACL,wDAAwD;QACxD,IAAI;QACJ,wDAAwD;QACxD,0DAA0D;QAC1D,sDAAsD;QACtD,kCAAkC;QAClC,IAAI;QACJ,2BAA2B;QAC3B,wCAAwC;QACxC,4EAA4E;QAC5E,8CAA8C;QAC9C,qDAAqD;QACrD,KAAK;QACL,mDAAmD;QACnD,0BAA0B;QAC1B,EAAE;QACF,kDAAkD;QAClD,2BAA2B;QAC3B,wBAAwB;QACxB,mEAAmE;QACnE,+EAA+E;QAC/E,gEAAgE;QAChE,6EAA6E;QAC7E,SAAS;QACT,gFAAgF;QAChF,qBAAqB;QACrB,sBAAsB;QACtB,uGAAuG;QACvG,YAAY;QACZ,QAAQ;QACR,yDAAyD;QACzD,kFAAkF;QAClF,eAAe;QACf,KAAK;QACL,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../../src/cli/templates/presenter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,MAAM,UAAU,iBAAiB;IAC7B,OAAO;QACH,KAAK;QACL,wDAAwD;QACxD,IAAI;QACJ,wDAAwD;QACxD,4DAA4D;QAC5D,sDAAsD;QACtD,kCAAkC;QAClC,IAAI;QACJ,2BAA2B;QAC3B,6DAA6D;QAC7D,4EAA4E;QAC5E,8CAA8C;QAC9C,qDAAqD;QACrD,KAAK;QACL,mDAAmD;QACnD,yDAAyD;QACzD,EAAE;QACF,kDAAkD;QAClD,2BAA2B;QAC3B,0BAA0B;QAC1B,gFAAgF;QAChF,qBAAqB;QACrB,sBAAsB;QACtB,uGAAuG;QACvG,YAAY;QACZ,QAAQ;QACR,yDAAyD;QACzD,kFAAkF;QAClF,eAAe;QACf,KAAK;QACL,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/readme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8DAA8D;AAC9D,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4FpD"}
1
+ {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/readme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8DAA8D;AAC9D,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8FpD"}
@@ -39,6 +39,8 @@ src/
39
39
  │ └── system/
40
40
  │ ├── health.ts # Health check with Presenter
41
41
  │ └── echo.ts # Echo for connectivity testing
42
+ ├── models/ # MVA Model Layer (defineModel)
43
+ │ └── SystemModel.ts
42
44
  ├── presenters/ # MVA View Layer (Egress Firewall)
43
45
  │ └── SystemPresenter.ts
44
46
  ├── prompts/ # MCP Prompt Engine
@@ -1 +1 @@
1
- {"version":3,"file":"readme.js","sourceRoot":"","sources":["../../../src/cli/templates/readme.ts"],"names":[],"mappings":"AAMA,8DAA8D;AAC9D,MAAM,UAAU,MAAM,CAAC,MAAqB;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK;QAC1C,CAAC,CAAC,EAAE,GAAG,EAAE,2BAA2B,EAAE;QACtC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,UAAU,EAAE;YACR,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW;SAC7B;KACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEZ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK;QACtC,CAAC,CAAC,2HAA2H;QAC7H,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,KAAK,MAAM,CAAC,IAAI;;;;;;;;;;EAUzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;;CAMlB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BJ,OAAO;;;;;;;EAOP,YAAY;;EAEZ,mBAAmB,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyB5B,CAAC;AACF,CAAC;AAED,qCAAqC;AACrC,SAAS,mBAAmB,CAAC,MAAqB;IAC9C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBlB,CAAC;QACM,KAAK,KAAK;YACN,OAAO;;;;;;;;;;;CAWlB,CAAC;QACM,KAAK,SAAS;YACV,OAAO;;;;;;;;;;;CAWlB,CAAC;QACM,KAAK,OAAO;YACR,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuBlB,CAAC;QACM;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"readme.js","sourceRoot":"","sources":["../../../src/cli/templates/readme.ts"],"names":[],"mappings":"AAMA,8DAA8D;AAC9D,MAAM,UAAU,MAAM,CAAC,MAAqB;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK;QAC1C,CAAC,CAAC,EAAE,GAAG,EAAE,2BAA2B,EAAE;QACtC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,UAAU,EAAE;YACR,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW;SAC7B;KACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEZ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK;QACtC,CAAC,CAAC,2HAA2H;QAC7H,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,KAAK,MAAM,CAAC,IAAI;;;;;;;;;;EAUzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;;CAMlB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BJ,OAAO;;;;;;;EAOP,YAAY;;EAEZ,mBAAmB,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyB5B,CAAC;AACF,CAAC;AAED,qCAAqC;AACrC,SAAS,mBAAmB,CAAC,MAAqB;IAC9C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBlB,CAAC;QACM,KAAK,KAAK;YACN,OAAO;;;;;;;;;;;CAWlB,CAAC;QACM,KAAK,SAAS;YACV,OAAO;;;;;;;;;;;CAWlB,CAAC;QACM,KAAK,OAAO;YACR,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuBlB,CAAC;QACM;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * BuildPipeline — Compiles FluentToolBuilder state into a GroupedToolBuilder.
3
+ *
4
+ * Extracts the `_build()` pipeline from FluentToolBuilder into a
5
+ * standalone function for SRP compliance. Handles:
6
+ * - Name parsing (`domain.action`)
7
+ * - Description compilation (instructions + sandbox prompting)
8
+ * - Semantic defaults resolution
9
+ * - Handler wrapping (implicit `success()`)
10
+ * - GroupedToolBuilder assembly + middleware propagation
11
+ *
12
+ * @module
13
+ */
14
+ import { type ZodObject, type ZodRawShape } from 'zod';
15
+ import { GroupedToolBuilder } from './GroupedToolBuilder.js';
16
+ import { type ToolResponse, type MiddlewareFn } from '../types.js';
17
+ import { type Presenter } from '../../presenter/Presenter.js';
18
+ import { type ConcurrencyConfig } from '../execution/ConcurrencyGuard.js';
19
+ import { type SandboxConfig } from '../../sandbox/SandboxEngine.js';
20
+ import { type SemanticDefaults } from './SemanticDefaults.js';
21
+ /**
22
+ * Configuration object assembled from FluentToolBuilder state.
23
+ * Passed to `buildToolFromFluent()` to produce a `GroupedToolBuilder`.
24
+ */
25
+ export interface FluentBuildConfig<TContext, TCtx> {
26
+ name: string;
27
+ description: string | undefined;
28
+ instructions: string | undefined;
29
+ withParams: Record<string, import('zod').ZodType>;
30
+ inputSchema?: ZodObject<ZodRawShape>;
31
+ tags: string[];
32
+ middlewares: MiddlewareFn<TContext>[];
33
+ returns: Presenter<unknown> | undefined;
34
+ semanticDefaults: SemanticDefaults;
35
+ readOnly: boolean | undefined;
36
+ destructive: boolean | undefined;
37
+ idempotent: boolean | undefined;
38
+ toonMode: boolean;
39
+ annotations: Record<string, unknown> | undefined;
40
+ invalidatesPatterns: string[];
41
+ cacheControl: 'no-store' | 'immutable' | undefined;
42
+ concurrency: ConcurrencyConfig | undefined;
43
+ egressMaxBytes: number | undefined;
44
+ sandboxConfig: SandboxConfig | undefined;
45
+ fsmStates: string[] | undefined;
46
+ fsmTransition: string | undefined;
47
+ handler: (input: Record<string, unknown>, ctx: TCtx) => Promise<ToolResponse | unknown>;
48
+ }
49
+ /**
50
+ * Compile FluentToolBuilder state into a GroupedToolBuilder.
51
+ *
52
+ * @param config - Assembled configuration from builder state
53
+ * @returns A `GroupedToolBuilder` ready for registration
54
+ */
55
+ export declare function buildToolFromFluent<TContext, TCtx>(config: FluentBuildConfig<TContext, TCtx>): GroupedToolBuilder<TContext>;
56
+ //# sourceMappingURL=BuildPipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildPipeline.d.ts","sourceRoot":"","sources":["../../../src/core/builder/BuildPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,QAAQ,EAAE,IAAI;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACnD,WAAW,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,CACL,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,IAAI,KACR,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC;CACxC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAC9C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAC1C,kBAAkB,CAAC,QAAQ,CAAC,CA4H9B"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * BuildPipeline — Compiles FluentToolBuilder state into a GroupedToolBuilder.
3
+ *
4
+ * Extracts the `_build()` pipeline from FluentToolBuilder into a
5
+ * standalone function for SRP compliance. Handles:
6
+ * - Name parsing (`domain.action`)
7
+ * - Description compilation (instructions + sandbox prompting)
8
+ * - Semantic defaults resolution
9
+ * - Handler wrapping (implicit `success()`)
10
+ * - GroupedToolBuilder assembly + middleware propagation
11
+ *
12
+ * @module
13
+ */
14
+ import {} from 'zod';
15
+ import { z } from 'zod';
16
+ import { GroupedToolBuilder } from './GroupedToolBuilder.js';
17
+ import {} from '../types.js';
18
+ import { success, TOOL_RESPONSE_BRAND } from '../response.js';
19
+ import {} from '../../presenter/Presenter.js';
20
+ import {} from '../execution/ConcurrencyGuard.js';
21
+ import {} from '../../sandbox/SandboxEngine.js';
22
+ import { SANDBOX_SYSTEM_INSTRUCTION } from '../../sandbox/index.js';
23
+ import {} from './SemanticDefaults.js';
24
+ /**
25
+ * Compile FluentToolBuilder state into a GroupedToolBuilder.
26
+ *
27
+ * @param config - Assembled configuration from builder state
28
+ * @returns A `GroupedToolBuilder` ready for registration
29
+ */
30
+ export function buildToolFromFluent(config) {
31
+ // Build accumulated with* params into ZodObject
32
+ let inputSchema;
33
+ if (Object.keys(config.withParams).length > 0) {
34
+ inputSchema = z.object(config.withParams);
35
+ }
36
+ // Parse name: 'domain.action' → tool='domain', action='action'
37
+ const dotIndex = config.name.indexOf('.');
38
+ // Bug #109 fix: reject multi-dot names early with a clear error.
39
+ if (dotIndex > 0 && config.name.indexOf('.', dotIndex + 1) !== -1) {
40
+ throw new Error(`Tool name '${config.name}' has too many dot-separated segments. ` +
41
+ `Only one dot is allowed (e.g. 'group.action'). Use f.router() for nested prefixes.`);
42
+ }
43
+ const toolName = dotIndex > 0 ? config.name.slice(0, dotIndex) : config.name;
44
+ const actionName = dotIndex > 0 ? config.name.slice(dotIndex + 1) : 'default';
45
+ // Compile description: instructions + description
46
+ const descParts = [];
47
+ if (config.instructions) {
48
+ descParts.push(`[INSTRUCTIONS] ${config.instructions}`);
49
+ }
50
+ if (config.description) {
51
+ descParts.push(config.description);
52
+ }
53
+ // HATEOAS Auto-Prompting: teach the LLM about sandbox capability
54
+ if (config.sandboxConfig) {
55
+ descParts.push(SANDBOX_SYSTEM_INSTRUCTION.trim());
56
+ }
57
+ const compiledDescription = descParts.length > 0 ? descParts.join('\n\n') : undefined;
58
+ // Resolve semantic defaults + overrides
59
+ const readOnly = config.readOnly ?? config.semanticDefaults.readOnly;
60
+ const destructive = config.destructive ?? config.semanticDefaults.destructive;
61
+ const idempotent = config.idempotent ?? config.semanticDefaults.idempotent;
62
+ // Wrap handler: (input, ctx) → (ctx, args)
63
+ const resolvedHandler = config.handler;
64
+ const wrappedHandler = async (ctx, args) => {
65
+ const result = await resolvedHandler(args, ctx);
66
+ // Guard: void/null handlers → safe fallback (Bug #41)
67
+ if (result === undefined || result === null) {
68
+ return success('OK');
69
+ }
70
+ // Auto-wrap non-ToolResponse results (implicit success)
71
+ // Primary: check brand symbol stamped by success()/error()/toolError() helpers.
72
+ // Fallback: shape-based heuristic for manually constructed ToolResponse objects.
73
+ if (typeof result === 'object' && result !== null) {
74
+ // Brand check — reliable, no false positives (Bug #127)
75
+ if (TOOL_RESPONSE_BRAND in result) {
76
+ return result;
77
+ }
78
+ // Shape heuristic — backward compat for manually constructed ToolResponse
79
+ if ('content' in result &&
80
+ Array.isArray(result.content) &&
81
+ result.content.length > 0 &&
82
+ result.content[0]?.type === 'text' &&
83
+ typeof result.content[0]?.text === 'string' &&
84
+ Object.keys(result).every(k => k === 'content' || k === 'isError')) {
85
+ return result;
86
+ }
87
+ }
88
+ // Implicit success() — the dev just returns raw data!
89
+ return success(result);
90
+ };
91
+ // Build via GroupedToolBuilder for consistency with existing pipeline
92
+ const builder = new GroupedToolBuilder(toolName);
93
+ if (compiledDescription)
94
+ builder.description(compiledDescription);
95
+ if (config.tags.length > 0)
96
+ builder.tags(...config.tags);
97
+ if (config.toonMode)
98
+ builder.toonDescription();
99
+ if (config.annotations)
100
+ builder.annotations(config.annotations);
101
+ // Propagate state sync hints
102
+ if (config.invalidatesPatterns.length > 0) {
103
+ builder.invalidates(...config.invalidatesPatterns);
104
+ }
105
+ if (config.cacheControl) {
106
+ config.cacheControl === 'immutable' ? builder.cached() : builder.stale();
107
+ }
108
+ // Propagate runtime guards
109
+ if (config.concurrency) {
110
+ builder.concurrency(config.concurrency);
111
+ }
112
+ if (config.egressMaxBytes !== undefined) {
113
+ builder.maxPayloadBytes(config.egressMaxBytes);
114
+ }
115
+ // Propagate sandbox config
116
+ if (config.sandboxConfig) {
117
+ builder.sandbox(config.sandboxConfig);
118
+ }
119
+ // Propagate FSM state gate
120
+ if (config.fsmStates) {
121
+ builder.bindState(config.fsmStates, config.fsmTransition);
122
+ }
123
+ // Apply middleware
124
+ for (const mw of config.middlewares) {
125
+ builder.use(mw);
126
+ }
127
+ // Register the single action
128
+ builder.action({
129
+ name: actionName,
130
+ handler: wrappedHandler,
131
+ ...(inputSchema ? { schema: inputSchema } : {}),
132
+ ...(readOnly !== undefined ? { readOnly } : {}),
133
+ ...(destructive !== undefined ? { destructive } : {}),
134
+ ...(idempotent !== undefined ? { idempotent } : {}),
135
+ ...(config.returns ? { returns: config.returns } : {}),
136
+ });
137
+ return builder;
138
+ }
139
+ //# sourceMappingURL=BuildPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildPipeline.js","sourceRoot":"","sources":["../../../src/core/builder/BuildPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoC,MAAM,KAAK,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAwC,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAA0B,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAsB,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAyB,MAAM,uBAAuB,CAAC;AAkC9D;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAC/B,MAAyC;IAEzC,gDAAgD;IAChD,IAAI,WAA+C,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAyB,CAAC,CAAC;IAC7D,CAAC;IAED,+DAA+D;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,iEAAiE;IACjE,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACX,cAAc,MAAM,CAAC,IAAI,yCAAyC;YAClE,oFAAoF,CACvF,CAAC;IACN,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7E,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,kDAAkD;IAClD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IACD,iEAAiE;IACjE,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,wCAAwC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC;IAC9E,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC;IAE3E,2CAA2C;IAC3C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC;IACvC,MAAM,cAAc,GAAG,KAAK,EAAE,GAAa,EAAE,IAA6B,EAAyB,EAAE;QACjG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAa,EAAE,GAAY,CAAC,CAAC;QAElE,sDAAsD;QACtD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,wDAAwD;QACxD,gFAAgF;QAChF,iFAAiF;QACjF,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAChD,wDAAwD;YACxD,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAAC;gBAChC,OAAO,MAAiC,CAAC;YAC7C,CAAC;YACD,0EAA0E;YAC1E,IACI,SAAS,IAAI,MAAM;gBACnB,KAAK,CAAC,OAAO,CAAE,MAA+B,CAAC,OAAO,CAAC;gBACtD,MAAiD,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACpE,MAAiD,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM;gBAC9E,OAAQ,MAAiD,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ;gBACvF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,EACpE,CAAC;gBACC,OAAO,MAAsB,CAAC;YAClC,CAAC;QACL,CAAC;QAED,sDAAsD;QACtD,OAAO,OAAO,CAAC,MAAyB,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,sEAAsE;IACtE,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAW,QAAQ,CAAC,CAAC;IAE3D,IAAI,mBAAmB;QAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEhE,6BAA6B;IAC7B,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7E,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,MAAM,CAAC;QACX,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,cAAc;QACvB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACnB,CAAC"}
@@ -26,27 +26,15 @@
26
26
  * @module
27
27
  */
28
28
  import { type ZodType, type ZodObject, type ZodRawShape } from 'zod';
29
+ import { type Model } from '../../model/defineModel.js';
29
30
  import { GroupedToolBuilder } from './GroupedToolBuilder.js';
30
31
  import { type ToolResponse, type MiddlewareFn } from '../types.js';
31
32
  import { type Presenter } from '../../presenter/Presenter.js';
32
33
  import { type ConcurrencyConfig } from '../execution/ConcurrencyGuard.js';
33
34
  import { type SandboxConfig } from '../../sandbox/SandboxEngine.js';
34
35
  import { type MiddlewareDefinition } from '../middleware/ContextDerivation.js';
35
- /**
36
- * Semantic defaults applied by each verb.
37
- * @internal
38
- */
39
- export interface SemanticDefaults {
40
- readonly readOnly?: boolean;
41
- readonly destructive?: boolean;
42
- readonly idempotent?: boolean;
43
- }
44
- /** Defaults for `f.query()` — read-only, no side effects */
45
- export declare const QUERY_DEFAULTS: SemanticDefaults;
46
- /** Defaults for `f.mutation()` — destructive, irreversible */
47
- export declare const MUTATION_DEFAULTS: SemanticDefaults;
48
- /** Defaults for `f.action()` — neutral, no assumptions */
49
- export declare const ACTION_DEFAULTS: SemanticDefaults;
36
+ import { type SemanticDefaults } from './SemanticDefaults.js';
37
+ export { type SemanticDefaults, QUERY_DEFAULTS, MUTATION_DEFAULTS, ACTION_DEFAULTS } from './SemanticDefaults.js';
50
38
  /**
51
39
  * Fluent builder that accumulates types at each step.
52
40
  *
@@ -54,13 +42,14 @@ export declare const ACTION_DEFAULTS: SemanticDefaults;
54
42
  * @typeParam TInput - Accumulated input type (built by `with*()` methods)
55
43
  * @typeParam TCtx - Accumulated context type (enriched by `.use()`)
56
44
  */
57
- export declare class FluentToolBuilder<TContext, TInput = void, TCtx = TContext> {
45
+ export declare class FluentToolBuilder<TContext, TInput = Record<string, never>, TCtx = TContext> {
58
46
  /** @internal */ readonly _name: string;
59
47
  /** @internal */ _description?: string;
60
48
  /** @internal */ _instructions?: string;
61
49
  /** @internal */ _inputSchema?: ZodObject<ZodRawShape>;
62
50
  /** @internal */ _withParams: Record<string, ZodType>;
63
51
  /** @internal */ _tags: string[];
52
+ /** @internal */ _modelRef?: Model;
64
53
  /**
65
54
  * @internal Bug #118 fix: reject duplicate parameter names.
66
55
  * All `withXxx()` methods delegate to this instead of assigning directly.
@@ -411,6 +400,27 @@ export declare class FluentToolBuilder<TContext, TInput = void, TCtx = TContext>
411
400
  withOptionalArrays<I extends 'string' | 'number' | 'boolean', R extends Record<string, string>>(itemType: I, fields: R): FluentToolBuilder<TContext, TInput & {
412
401
  [K in keyof R & string]?: (I extends 'string' ? string : I extends 'number' ? number : boolean)[] | undefined;
413
402
  }, TCtx>;
403
+ /**
404
+ * Derive tool input parameters from a Model's fillable profile.
405
+ *
406
+ * Reads the specified operation from `model.input` (fillable profiles),
407
+ * then adds each field as a parameter using the type and description from
408
+ * the Model's casts. For `create`, fields respect their schema optionality.
409
+ * For `update` and `filter`, all fields become optional.
410
+ *
411
+ * @param model - A `Model` from `defineModel()`
412
+ * @param operation - The fillable profile name (e.g. `'create'`, `'update'`, `'filter'`)
413
+ * @returns Builder with additional parameters from the Model
414
+ *
415
+ * @example
416
+ * ```typescript
417
+ * f.mutation('task.create')
418
+ * .fromModel(TaskModel, 'create')
419
+ * .withStrings({ company_slug: '...', project_slug: '...' })
420
+ * .handle(async (input, ctx) => { ... });
421
+ * ```
422
+ */
423
+ fromModel<M extends Model>(model: M, operation: string): FluentToolBuilder<TContext, TInput & Record<string, any>, TCtx>;
414
424
  /**
415
425
  * Add context-derivation middleware (tRPC-style).
416
426
  *
@@ -456,7 +466,7 @@ export declare class FluentToolBuilder<TContext, TInput = void, TCtx = TContext>
456
466
  * @param presenter - A Presenter instance
457
467
  * @returns `this` for chaining
458
468
  */
459
- returns(presenter: Presenter<unknown>): FluentToolBuilder<TContext, TInput, TCtx>;
469
+ returns(presenter: Presenter<any>): FluentToolBuilder<TContext, TInput, TCtx>;
460
470
  /**
461
471
  * Add capability tags for selective tool exposure.
462
472
  *
@@ -593,13 +603,48 @@ export declare class FluentToolBuilder<TContext, TInput = void, TCtx = TContext>
593
603
  * });
594
604
  * ```
595
605
  */
596
- handle(handler: (input: TInput extends void ? Record<string, unknown> : TInput, ctx: TCtx) => Promise<ToolResponse | unknown>): GroupedToolBuilder<TContext>;
606
+ handle(handler: (input: [TInput] extends [Record<string, never>] ? Record<string, any> : TInput, ctx: TCtx) => Promise<ToolResponse | unknown>): GroupedToolBuilder<TContext>;
607
+ /**
608
+ * Auto-generate a handler that proxies to `ctx.client` HTTP methods.
609
+ *
610
+ * Eliminates boilerplate by deriving the HTTP method from the semantic
611
+ * verb (`query` → GET, `mutation` → POST) and passing model input
612
+ * directly as query params or request body.
613
+ *
614
+ * For tools with non-trivial logic (data transformation, multi-step
615
+ * calls, conditional behavior), use `.handle()` instead.
616
+ *
617
+ * @param endpoint - API path (e.g. `'companies/standup/summary'`)
618
+ * @param options - Optional overrides
619
+ * @param options.method - Force HTTP method (`'GET'`, `'POST'`, `'PUT'`, `'DELETE'`)
620
+ * @param options.unwrap - Auto-unwrap `response.data` (default: `true`)
621
+ * @returns A `GroupedToolBuilder` ready for registration
622
+ *
623
+ * @example
624
+ * ```typescript
625
+ * const pulse = analytics.query('pulse')
626
+ * .fromModel(AnalyticsModel, 'query')
627
+ * .proxy('companies/manager-dashboard/pulse');
628
+ *
629
+ * const create = note.mutation('create')
630
+ * .fromModel(NoteModel, 'create')
631
+ * .proxy('notes');
632
+ *
633
+ * const update = note.mutation('update')
634
+ * .fromModel(NoteModel, 'update')
635
+ * .proxy('notes/:uuid', { method: 'PUT' });
636
+ * ```
637
+ */
638
+ proxy(endpoint: string, options?: {
639
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
640
+ unwrap?: boolean;
641
+ }): GroupedToolBuilder<TContext>;
597
642
  /**
598
643
  * Alias for `.handle()` — for backward compatibility.
599
644
  * @internal
600
645
  */
601
646
  resolve(handler: (args: {
602
- input: TInput extends void ? Record<string, unknown> : TInput;
647
+ input: [TInput] extends [Record<string, never>] ? Record<string, any> : TInput;
603
648
  ctx: TCtx;
604
649
  }) => Promise<ToolResponse | unknown>): GroupedToolBuilder<TContext>;
605
650
  /** @internal */