@introspection-ai/recipes 0.13.0 → 0.14.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 (222) hide show
  1. package/README.md +45 -58
  2. package/dist/{agent-tool.d.ts → agents.d.ts} +4 -1
  3. package/dist/agents.d.ts.map +1 -0
  4. package/dist/{agent-tool.js → agents.js} +1 -1
  5. package/dist/agents.js.map +1 -0
  6. package/dist/api/extensions.d.ts +3 -0
  7. package/dist/api/extensions.d.ts.map +1 -0
  8. package/dist/api/extensions.js +2 -0
  9. package/dist/api/extensions.js.map +1 -0
  10. package/dist/api/mcp.d.ts +4 -0
  11. package/dist/api/mcp.d.ts.map +1 -0
  12. package/dist/api/mcp.js +2 -0
  13. package/dist/api/mcp.js.map +1 -0
  14. package/dist/api/session.d.ts +3 -0
  15. package/dist/api/session.d.ts.map +1 -0
  16. package/dist/api/session.js +2 -0
  17. package/dist/api/session.js.map +1 -0
  18. package/dist/child-agent.d.ts +5 -4
  19. package/dist/child-agent.d.ts.map +1 -1
  20. package/dist/child-agent.js +26 -117
  21. package/dist/child-agent.js.map +1 -1
  22. package/dist/child-session.d.ts +23 -0
  23. package/dist/child-session.d.ts.map +1 -0
  24. package/dist/child-session.js +48 -0
  25. package/dist/child-session.js.map +1 -0
  26. package/dist/extensions.d.ts +29 -0
  27. package/dist/extensions.d.ts.map +1 -0
  28. package/dist/extensions.js +119 -0
  29. package/dist/extensions.js.map +1 -0
  30. package/dist/index.d.ts +4 -13
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -13
  33. package/dist/index.js.map +1 -1
  34. package/dist/inspect.d.ts +38 -5
  35. package/dist/inspect.d.ts.map +1 -1
  36. package/dist/inspect.js +92 -41
  37. package/dist/inspect.js.map +1 -1
  38. package/dist/interactions.d.ts +18 -2
  39. package/dist/interactions.d.ts.map +1 -1
  40. package/dist/interactions.js +41 -10
  41. package/dist/interactions.js.map +1 -1
  42. package/dist/mcp-catalog.d.ts +1 -0
  43. package/dist/mcp-catalog.d.ts.map +1 -1
  44. package/dist/mcp-catalog.js +14 -6
  45. package/dist/mcp-catalog.js.map +1 -1
  46. package/dist/mcp-chunks/auth-command-ZLGYIEUY.js +273 -0
  47. package/dist/mcp-chunks/call-arguments-LU3W6D3K.js +13 -0
  48. package/dist/mcp-chunks/call-command-LKTKSYTH.js +612 -0
  49. package/dist/mcp-chunks/chunk-2U4BSDC4.js +3951 -0
  50. package/dist/mcp-chunks/chunk-2XL7MG7R.js +272 -0
  51. package/dist/mcp-chunks/chunk-3BJA27PY.js +2321 -0
  52. package/dist/mcp-chunks/chunk-4SQKWYFF.js +15 -0
  53. package/dist/mcp-chunks/chunk-5QOSCSQB.js +290 -0
  54. package/dist/mcp-chunks/chunk-6W5QFASN.js +77 -0
  55. package/dist/mcp-chunks/chunk-6XCZGU3G.js +1004 -0
  56. package/dist/mcp-chunks/chunk-7FHEBT5G.js +149 -0
  57. package/dist/mcp-chunks/chunk-7KA2VJVZ.js +114 -0
  58. package/dist/mcp-chunks/chunk-7UDVSOOF.js +138 -0
  59. package/dist/mcp-chunks/chunk-BNV3TPE4.js +66 -0
  60. package/dist/mcp-chunks/chunk-BTLAWHTA.js +129 -0
  61. package/dist/mcp-chunks/chunk-BV56DXPW.js +13 -0
  62. package/dist/mcp-chunks/chunk-BWHIA4PC.js +90 -0
  63. package/dist/mcp-chunks/chunk-BZIQOWE6.js +267 -0
  64. package/dist/mcp-chunks/chunk-D3MRAZ6H.js +16140 -0
  65. package/dist/mcp-chunks/chunk-DHBE7UBH.js +750 -0
  66. package/dist/mcp-chunks/chunk-E22DYOW5.js +251 -0
  67. package/dist/mcp-chunks/chunk-ECIVB7P4.js +139 -0
  68. package/dist/mcp-chunks/chunk-HKRJ6O36.js +1076 -0
  69. package/dist/mcp-chunks/chunk-IABRYROW.js +44 -0
  70. package/dist/mcp-chunks/chunk-J6LYIZXN.js +45 -0
  71. package/dist/mcp-chunks/chunk-L7NTQVYN.js +161 -0
  72. package/dist/mcp-chunks/chunk-LEZSACDE.js +141 -0
  73. package/dist/mcp-chunks/chunk-LKIBAYKU.js +208 -0
  74. package/dist/mcp-chunks/chunk-LNH5LAJD.js +152 -0
  75. package/dist/mcp-chunks/chunk-LQQEYD76.js +124 -0
  76. package/dist/mcp-chunks/chunk-LRKZP7DJ.js +47 -0
  77. package/dist/mcp-chunks/chunk-LS7PMWSR.js +109 -0
  78. package/dist/mcp-chunks/chunk-M3TPODXI.js +95 -0
  79. package/dist/mcp-chunks/chunk-MZ2NARG7.js +400 -0
  80. package/dist/mcp-chunks/chunk-N46NEFAF.js +45 -0
  81. package/dist/mcp-chunks/chunk-NNOEGEUZ.js +17273 -0
  82. package/dist/mcp-chunks/chunk-NRAJX5E4.js +69 -0
  83. package/dist/mcp-chunks/chunk-P3PSC54P.js +869 -0
  84. package/dist/mcp-chunks/chunk-PIIYJR44.js +6341 -0
  85. package/dist/mcp-chunks/chunk-PWYFKGKG.js +385 -0
  86. package/dist/mcp-chunks/chunk-SJCCBNZ4.js +45 -0
  87. package/dist/mcp-chunks/chunk-TATVT5IT.js +194 -0
  88. package/dist/mcp-chunks/chunk-TEUKFFQL.js +29 -0
  89. package/dist/mcp-chunks/chunk-UKYNQGNE.js +150 -0
  90. package/dist/mcp-chunks/chunk-UNKB4SBV.js +37 -0
  91. package/dist/mcp-chunks/chunk-WD6BOD24.js +138 -0
  92. package/dist/mcp-chunks/chunk-WQJZMCJN.js +73 -0
  93. package/dist/mcp-chunks/chunk-XANPGTLI.js +364 -0
  94. package/dist/mcp-chunks/chunk-XQK2JSW4.js +35 -0
  95. package/dist/mcp-chunks/chunk-YHQUTU6L.js +571 -0
  96. package/dist/mcp-chunks/chunk-YVZKMV5H.js +57 -0
  97. package/dist/mcp-chunks/cli-UV4QJZZM.js +929 -0
  98. package/dist/mcp-chunks/client-S7RQUG5U.js +13 -0
  99. package/dist/mcp-chunks/config-command-NLAGKID5.js +1101 -0
  100. package/dist/mcp-chunks/daemon-command-U242Z6VY.js +26 -0
  101. package/dist/mcp-chunks/dist-LK3SHAMX.js +6478 -0
  102. package/dist/mcp-chunks/emit-ts-command-VBXVXO6V.js +386 -0
  103. package/dist/mcp-chunks/generate-cli-runner-6CAZZA3P.js +1426 -0
  104. package/dist/mcp-chunks/inspect-cli-command-3ZORTOR7.js +111 -0
  105. package/dist/mcp-chunks/launch-YKRXHXJI.js +10 -0
  106. package/dist/mcp-chunks/lifecycle-XVKRHPH3.js +16 -0
  107. package/dist/mcp-chunks/list-command-2MEGGNFQ.js +4190 -0
  108. package/dist/mcp-chunks/output-utils-NKESLAJ6.js +12 -0
  109. package/dist/mcp-chunks/prompt-B1Yc1NPt-VGOTWJMN.js +918 -0
  110. package/dist/mcp-chunks/record-command-YXHTTTT5.js +17 -0
  111. package/dist/mcp-chunks/replay-command-25HJ6AQU.js +85 -0
  112. package/dist/mcp-chunks/resource-command-OO4NYF5C.js +97 -0
  113. package/dist/mcp-chunks/result-utils-MOHHLNM7.js +15 -0
  114. package/dist/mcp-chunks/runtime-5WJ3G25Y.js +33 -0
  115. package/dist/mcp-chunks/runtime-wrapper-RPWDIDBF.js +10 -0
  116. package/dist/mcp-chunks/serve-command-DHXJZMMN.js +3302 -0
  117. package/dist/mcp-chunks/timeouts-W2XWCCXR.js +18 -0
  118. package/dist/mcp-chunks/vault-command-PIYIUEZL.js +154 -0
  119. package/dist/mcp-daemon-client.d.ts +6 -1
  120. package/dist/mcp-daemon-client.d.ts.map +1 -1
  121. package/dist/mcp-daemon-client.js +119 -2
  122. package/dist/mcp-daemon-client.js.map +1 -1
  123. package/dist/mcp-daemon-protocol.d.ts +18 -1
  124. package/dist/mcp-daemon-protocol.d.ts.map +1 -1
  125. package/dist/mcp-daemon-protocol.js +31 -0
  126. package/dist/mcp-daemon-protocol.js.map +1 -1
  127. package/dist/mcp-daemon.js +169 -76602
  128. package/dist/mcp-daemon.js.map +1 -1
  129. package/dist/mcp-policy.d.ts +11 -0
  130. package/dist/mcp-policy.d.ts.map +1 -0
  131. package/dist/mcp-policy.js +27 -0
  132. package/dist/mcp-policy.js.map +1 -0
  133. package/dist/mcp-run-worker.js +38 -76540
  134. package/dist/mcp-tools.d.ts +39 -0
  135. package/dist/mcp-tools.d.ts.map +1 -0
  136. package/dist/mcp-tools.js +493 -0
  137. package/dist/mcp-tools.js.map +1 -0
  138. package/dist/mcp.d.ts +21 -9
  139. package/dist/mcp.d.ts.map +1 -1
  140. package/dist/mcp.js +101 -31
  141. package/dist/mcp.js.map +1 -1
  142. package/dist/model-binding.d.ts +39 -0
  143. package/dist/model-binding.d.ts.map +1 -0
  144. package/dist/model-binding.js +103 -0
  145. package/dist/model-binding.js.map +1 -0
  146. package/dist/pi-extension.d.ts +2 -22
  147. package/dist/pi-extension.d.ts.map +1 -1
  148. package/dist/pi-extension.js +296 -71
  149. package/dist/pi-extension.js.map +1 -1
  150. package/dist/recipe/resolve.d.ts +43 -20
  151. package/dist/recipe/resolve.d.ts.map +1 -1
  152. package/dist/recipe/resolve.js +215 -70
  153. package/dist/recipe/resolve.js.map +1 -1
  154. package/dist/recipe-agent.d.ts +24 -27
  155. package/dist/recipe-agent.d.ts.map +1 -1
  156. package/dist/recipe-agent.js +278 -230
  157. package/dist/recipe-agent.js.map +1 -1
  158. package/dist/recipe-check.d.ts +17 -0
  159. package/dist/recipe-check.d.ts.map +1 -0
  160. package/dist/recipe-check.js +258 -0
  161. package/dist/recipe-check.js.map +1 -0
  162. package/dist/recipe-extensions.d.ts.map +1 -1
  163. package/dist/recipe-extensions.js +0 -3
  164. package/dist/recipe-extensions.js.map +1 -1
  165. package/dist/recipe-model.d.ts +3 -1
  166. package/dist/recipe-model.d.ts.map +1 -1
  167. package/dist/recipe-model.js +15 -12
  168. package/dist/recipe-model.js.map +1 -1
  169. package/dist/recipe-package.d.ts +6 -28
  170. package/dist/recipe-package.d.ts.map +1 -1
  171. package/dist/recipe-package.js +248 -191
  172. package/dist/recipe-package.js.map +1 -1
  173. package/dist/recipe-skills.d.ts.map +1 -1
  174. package/dist/recipe-skills.js +42 -29
  175. package/dist/recipe-skills.js.map +1 -1
  176. package/dist/run-controller.d.ts +10 -9
  177. package/dist/run-controller.d.ts.map +1 -1
  178. package/dist/run-controller.js +28 -21
  179. package/dist/run-controller.js.map +1 -1
  180. package/dist/session.d.ts +40 -53
  181. package/dist/session.d.ts.map +1 -1
  182. package/dist/session.js +312 -173
  183. package/dist/session.js.map +1 -1
  184. package/dist/test-utils.d.ts +7 -7
  185. package/dist/test-utils.d.ts.map +1 -1
  186. package/dist/test-utils.js +32 -15
  187. package/dist/test-utils.js.map +1 -1
  188. package/docs/agent-composition.md +41 -35
  189. package/docs/host-api.md +201 -0
  190. package/docs/index.md +8 -14
  191. package/docs/interactions.md +12 -11
  192. package/docs/mcp-auth.md +6 -6
  193. package/docs/mcp-configuration.md +72 -24
  194. package/docs/pi-extension.md +39 -11
  195. package/docs/recipe-flow.md +9 -9
  196. package/docs/recipe-format.md +90 -41
  197. package/package.json +23 -17
  198. package/vendor/mcp-client/darwin-arm64/mcp-client +0 -0
  199. package/vendor/mcp-client/darwin-x64/mcp-client +0 -0
  200. package/vendor/mcp-client/linux-arm64/mcp-client +0 -0
  201. package/vendor/recipe-check/darwin-arm64/recipe-check +0 -0
  202. package/vendor/recipe-check/darwin-x64/recipe-check +0 -0
  203. package/vendor/recipe-check/linux-arm64/recipe-check +0 -0
  204. package/vendor/recipe-check/linux-x64/recipe-check +0 -0
  205. package/vendor/recipe-check/linux-x64-musl/recipe-check +0 -0
  206. package/vendor/recipe-check/win32-x64/recipe-check.exe +0 -0
  207. package/dist/agent-tool.d.ts.map +0 -1
  208. package/dist/agent-tool.js.map +0 -1
  209. package/dist/run.d.ts +0 -28
  210. package/dist/run.d.ts.map +0 -1
  211. package/dist/run.js +0 -84
  212. package/dist/run.js.map +0 -1
  213. package/dist/testing.d.ts +0 -25
  214. package/dist/testing.d.ts.map +0 -1
  215. package/dist/testing.js +0 -96
  216. package/dist/testing.js.map +0 -1
  217. package/docs/deployment-configuration.md +0 -65
  218. package/docs/migration.md +0 -70
  219. package/docs/python-bindings-release.md +0 -47
  220. package/docs/recipe-evals.md +0 -70
  221. package/docs/recipe-judges.md +0 -152
  222. package/docs/runtime-library.md +0 -171
@@ -1,152 +0,0 @@
1
- # Recipe judge definitions
2
-
3
- Recipe judges are optional, recipe-owned LLM grading definitions. Author them
4
- as direct children of `judges/` using a lowercase `.yaml` or `.yml` extension:
5
-
6
- ```text
7
- my-recipe/
8
- judges/
9
- helpful.yaml
10
- ```
11
-
12
- Nested files such as `judges/calibration/helpful.yaml` are not judge sources.
13
- The standalone `recipe-check` binary, `introspection check`, and in-memory
14
- bindings discover the same direct-child set and return the same validation
15
- result. Recipes without judge sources have no judge diagnostics or
16
- `resources.judges` count.
17
-
18
- ## Ownership boundary
19
-
20
- `pi-recipe-check` owns the portable authored YAML specification and its static,
21
- file-oriented diagnostics. The I/O-free `check_recipe_files` core is the common
22
- validation path used by the filesystem checker, npm CLI, serialized snapshot
23
- API, and Python binding.
24
-
25
- The Introspection judge engine owns runtime evaluation: applicability
26
- execution, conversation assembly and transcript protection, model request
27
- construction, retries, verdict normalization, and evaluation identity. Runtime
28
- implementations should consume or remain explicitly compatible with the
29
- authored specification defined here; new authored fields must land in this
30
- checker and its contract tests rather than being introduced only in a runtime
31
- parser.
32
-
33
- The Rust checker and Python binding return a `Report` containing diagnostics
34
- and, when judges exist, a `resources.judges` source count. The report does not
35
- contain a normalized judge definition, `judge_id`, `definition_hash`, or
36
- registry projection. Migrating project-scoped registry projection away from
37
- the runtime parser is a separate platform change and must not add project or
38
- tenant context to this portable API.
39
-
40
- ## Definition shape
41
-
42
- The minimal definition is:
43
-
44
- ```yaml
45
- judge: helpful
46
-
47
- instructions: |
48
- Determine whether the assistant answered the user correctly.
49
-
50
- llm:
51
- model: gpt-5
52
- ```
53
-
54
- `judge`, `instructions`, and `llm.model` are required and non-empty. Judge names
55
- must be unique across all judge files in one recipe. `llm.provider` defaults to
56
- `openai` at runtime.
57
-
58
- The canonical expanded definition is:
59
-
60
- ```yaml
61
- judge: helpful
62
- description: Did the assistant answer correctly?
63
-
64
- on:
65
- - event: message
66
- match:
67
- role: assistant
68
-
69
- instructions: |
70
- Determine whether the assistant answered the user correctly.
71
-
72
- llm:
73
- provider: openai
74
- model: gpt-5
75
- request:
76
- temperature: 0
77
- max_tokens: 1024
78
- reasoning_effort: medium
79
- transport:
80
- timeout_ms: 60000
81
- max_retries: 2
82
- max_retry_delay_ms: 5000
83
- local:
84
- base_url: https://api.openai.com/v1
85
- api_key_env: OPENAI_API_KEY
86
- ```
87
-
88
- Unknown fields are errors at every level. The obsolete top-level `model:`
89
- block is rejected.
90
-
91
- ### LLM settings
92
-
93
- - `provider` is a 1-64 byte lowercase slug containing ASCII letters, digits,
94
- and hyphens. The portable checker does not restrict it to managed platform
95
- providers because custom slugs can be used with an explicit local endpoint.
96
- - `model` is a trimmed, non-empty string of at most 255 bytes.
97
- - `request.temperature` is a finite number from 0 through 2 and defaults to 0.
98
- - `request.max_tokens` is an integer from 1 through 131072 when present;
99
- explicit `null` is treated as omitted.
100
- - `request.reasoning_effort` is a 1-64 byte lowercase slug containing ASCII
101
- letters and hyphens; explicit `null` is treated as omitted.
102
- - `transport.timeout_ms` is an integer from 1 through 600000 and defaults to
103
- 60000.
104
- - `transport.max_retries` is an integer from 0 through 10 and defaults to 0.
105
- - `transport.max_retry_delay_ms` is an integer from 0 through 60000 and
106
- defaults to 5000.
107
- - `local` requires both `base_url` and `api_key_env`. The URL must be HTTP(S),
108
- have a host, contain no embedded credentials, query, or fragment, and use
109
- HTTPS unless it targets `localhost`, `127.0.0.1`, or `::1`. `api_key_env` is
110
- an environment-variable name, not a credential value.
111
-
112
- Transport and local settings affect execution but not authored grading
113
- identity. The platform judge engine remains responsible for applying defaults,
114
- building requests, and enforcing runtime routing.
115
-
116
- ## Applicability
117
-
118
- `on` is optional. Omission, an empty mapping, or an empty list makes the judge
119
- applicable to every conversation selected for judging. Otherwise it is an
120
- OR-list of matchers. Supported events are `message`, `tool`, and `feedback`;
121
- fields within one `match` mapping are ANDed by the runtime engine.
122
-
123
- ```yaml
124
- on:
125
- - event: message
126
- match:
127
- role: user
128
- text: /refund|invoice/i
129
- - event: tool
130
- match:
131
- name: shell
132
- args.command: /pytest/i
133
- - event: feedback
134
- match:
135
- sentiment: negative
136
- ```
137
-
138
- Match keys are non-empty field paths. Regex literals use Rust regex syntax and
139
- support unique `i`, `m`, `s`, and `u` flags. `environment`, `runtime_group`, and
140
- paths ending in `pattern_id` are platform-owned and cannot appear as authored
141
- match fields. The runtime engine owns dotted-path traversal and actual gate
142
- evaluation.
143
-
144
- ## Diagnostics
145
-
146
- Invalid recipe content is reported through the normal `Report`/`Diagnostic`
147
- model. Judge diagnostics use stable `judge.*` codes, recipe-relative source
148
- paths, useful help text, and deterministic ordering. YAML syntax failures use
149
- `judge.yaml_malformed` and include a 1-based source span when the parser
150
- provides one. Invalid definitions do not raise a separate content exception in
151
- the Python binding; they return `Report(valid=False, ...)` like other recipe
152
- errors.
@@ -1,171 +0,0 @@
1
- # Runtime library
2
-
3
- The Recipes runtime library turns Recipe source into a live Pi agent. It is a
4
- library boundary, not a hosting framework.
5
-
6
- ## The embedding ladder
7
-
8
- ```text
9
- resolveRecipe() read and resolve the portable package
10
- │
11
- ▼
12
- createRecipeSession() construct the complete live Pi session
13
- │
14
- └── runRecipe() execute one turn and dispose
15
- ```
16
-
17
- Hosts should use the lowest layer that preserves their control.
18
-
19
- ## `resolveRecipe`
20
-
21
- ```ts
22
- import { resolveRecipe } from "@introspection-ai/recipes/recipe";
23
-
24
- const recipe = resolveRecipe({
25
- recipeDir,
26
- agentName,
27
- });
28
- ```
29
-
30
- The result contains the selected agent, visible subagents, model settings,
31
- tools, MCP policy, skills, prompts, extensions, and system-prompt composition.
32
- It does not create a model client or start a session.
33
-
34
- ## `createRecipeSession`
35
-
36
- ```ts
37
- import { createRecipeSession } from "@introspection-ai/recipes/session";
38
-
39
- const handle = await createRecipeSession({
40
- recipeDir,
41
- agentName,
42
- cwd: workspaceDir,
43
- credentials,
44
- modelOverride,
45
- mcpBindings,
46
- eventBus,
47
- customTools,
48
- extensionFactories,
49
- runController,
50
- agentToolOptions,
51
- settingsManager,
52
- sessionManager,
53
- additionalSkillPaths,
54
- skillPaths,
55
- systemPrompt,
56
- onDiagnostics,
57
- onEvent,
58
- otel: {
59
- tracer,
60
- meter,
61
- meta: { conversationId },
62
- runSpans: false,
63
- getParentContext: () => currentTurnContext,
64
- },
65
- });
66
- ```
67
-
68
- This is the primary host integration point. It:
69
-
70
- - resolves the Recipe and selected agent;
71
- - resolves model credentials fail-closed;
72
- - materializes required MCP bindings fail-closed;
73
- - loads Recipe skills, prompts, and extensions;
74
- - registers the shared subagent tool;
75
- - creates and binds the Pi `AgentSession`;
76
- - returns one idempotent `dispose()` boundary.
77
-
78
- The returned `RecipeSessionHandle` exposes:
79
-
80
- - `session` — Pi prompt, steer, follow-up, abort, messages, and events;
81
- - `recipe` — the resolved portable definition;
82
- - `runs` — the subagent run controller;
83
- - `dispose()` — child, session, instrumentation, and MCP cleanup.
84
-
85
- Host injection is intentional. A managed host can supply durable session state,
86
- cross-process subagent execution, inline endpoint bindings, platform
87
- extensions, its own settings, an event bus, host tools, and a
88
- gateway-decorated model without reimplementing Recipe semantics. The Recipe
89
- continues to own model configuration and tool selection; host seams replace
90
- transport and materialized resources, not the portable definition.
91
-
92
- Default MCP materialization leases the supplied `env` object until the handle
93
- is disposed and restores its prior MCP/PATH state afterward. Concurrent
94
- materialized sessions must receive separate environment objects. A host that
95
- materializes one process-wide MCP runtime instead passes `mcpMode: "inherit"`
96
- to its sessions, as runtime-agent does.
97
-
98
- ## `runRecipe`
99
-
100
- ```ts
101
- import { runRecipe } from "@introspection-ai/recipes/run";
102
-
103
- const result = await runRecipe({
104
- recipeDir,
105
- cwd: workspaceDir,
106
- prompt,
107
- timeoutMs: 120_000,
108
- });
109
- ```
110
-
111
- `runRecipe` creates one session, executes one prompt, returns the transcript and
112
- final text, and always disposes. It is suitable for tests, cron jobs, and queue
113
- workers that do not need a durable conversational host.
114
-
115
- ## Inspection
116
-
117
- ```ts
118
- import { inspectRecipe } from "@introspection-ai/recipes/inspect";
119
-
120
- const requirements = inspectRecipe(recipeDir);
121
- ```
122
-
123
- Inspection derives agents, providers, expected credential variables, required
124
- and optional MCP servers, and resource counts without creating a session.
125
-
126
- ## OpenTelemetry
127
-
128
- Pass a tracer through `otel` to attach the JS SDK's OpenTelemetry GenAI
129
- semantic-convention instrumentation to the session. Recipes derives default
130
- agent identity from the resolved package and generates a conversation id when
131
- the host does not provide one. The default in-process subagent controller
132
- inherits that conversation id while each child derives its own Recipe agent
133
- identity. Injected run controllers own their child-session instrumentation.
134
-
135
- Recipes does not create or register an OTel provider, processor, exporter, or
136
- global context manager. The host owns that pipeline and its content policy. A
137
- standalone host can therefore use the same standard OTLP exporter for
138
- Braintrust, Langfuse, an OTel Collector, or another compatible backend. A host
139
- that needs structure-only infrastructure traces can wrap that exporter with
140
- `GenAiContentScrubbingExporter` from
141
- `@introspection-sdk/introspection-pi`.
142
-
143
- Short-lived hosts must flush their own provider after `runRecipe` completes;
144
- long-lived hosts should flush and shut it down with the host lifecycle.
145
-
146
- ## Host conformance
147
-
148
- ```ts
149
- import { hostConformanceCases } from "@introspection-ai/recipes/test-utils";
150
-
151
- for (const testCase of hostConformanceCases(myHostAdapter)) {
152
- it(testCase.name, testCase.run);
153
- }
154
- ```
155
-
156
- Passing the suite means the host is using the same session construction
157
- contract as Pi and Introspection. Protocol behavior, persistence, tenancy, and
158
- deployment remain host-specific and require their own tests.
159
-
160
- ## Deliberate non-features
161
-
162
- The package does not provide:
163
-
164
- - an HTTP server or wire protocol;
165
- - a task database or task state machine;
166
- - a scheduler or queue;
167
- - sandbox or tenant isolation;
168
- - a deployment CLI;
169
- - provider-specific hosting adapters.
170
-
171
- Those layers compose above `createRecipeSession`.