@microsoft/rayfin-guide 1.36.0-alpha.1756 → 1.36.0-alpha.1917

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 (27) hide show
  1. package/assets/docs/app-backend/deploy.md +36 -1
  2. package/assets/docs/cli/connectors/add.md +18 -3
  3. package/assets/docs/cli/connectors/category-b-function-bridge.md +111 -11
  4. package/assets/docs/cli/connectors/index.md +8 -4
  5. package/assets/docs/cli/connectors/inspect.md +34 -1
  6. package/assets/docs/cli/connectors/invoke.md +4 -0
  7. package/assets/docs/cli/connectors/search.md +4 -0
  8. package/assets/docs/cli/environment-variables.md +2 -1
  9. package/assets/docs/cli/functions/deploy.md +13 -1
  10. package/assets/docs/cli/functions/dev-apply.md +8 -2
  11. package/assets/docs/cli/functions/index.md +4 -2
  12. package/assets/docs/cli/functions/init.md +7 -1
  13. package/assets/docs/cli/index.md +20 -7
  14. package/assets/docs/cli/secrets.md +18 -8
  15. package/assets/docs/functions/connections/add-ado.md +8 -4
  16. package/assets/docs/functions/connections/add-azure-resource.md +17 -131
  17. package/assets/docs/functions/connections/add-fabric-resource.md +31 -61
  18. package/assets/docs/functions/connections/add-foundry.md +11 -4
  19. package/assets/docs/functions/connections/get-fabric-info.md +7 -25
  20. package/assets/docs/functions/connections/index.md +127 -22
  21. package/assets/docs/functions/index.md +39 -1
  22. package/assets/docs/functions/secrets.md +39 -11
  23. package/assets/docs/functions/writing-functions.md +27 -23
  24. package/assets/docs/getting-started/project-structure.md +3 -1
  25. package/assets/docs/preview/local-dev-docker.md +2 -1
  26. package/package.json +1 -1
  27. package/assets/docs/functions/connections/add-work-iq.md +0 -39
@@ -62,6 +62,41 @@ npx rayfin up
62
62
 
63
63
  If you are not signed in, the CLI launches an interactive login flow automatically.
64
64
 
65
+ ### Prepare Fabric capacity
66
+
67
+ Before creating the Rayfin item, `rayfin up` checks whether the target workspace already has Fabric capacity.
68
+ If the workspace reports an assigned capacity, Rayfin uses it without changing or reevaluating the assignment.
69
+
70
+ On a first interactive deployment without a workspace target or `--capacity-id`, Rayfin asks you to choose:
71
+
72
+ 1. `Use new workspace [Recommended]` runs workspace and capacity readiness.
73
+ 2. `Select existing workspace` skips capacity readiness and opens the accessible-workspace picker.
74
+
75
+ Explicit workspace options and recorded deployments continue directly to their existing targeting flow without showing this choice.
76
+ Dry-run invocations do not show the choice.
77
+ An interactive invocation with `--capacity-id <id>` automatically prepares a new workspace and assigns that capacity without showing the workspace choice.
78
+ An untargeted non-interactive invocation automatically prepares a new workspace without prompting.
79
+ Pass `--capacity-id <id>` to use a specific capacity for that new workspace.
80
+ Pass an existing workspace target to deploy there instead.
81
+
82
+ When the workspace needs capacity, an interactive deployment asks for confirmation before assigning the selected or trial capacity.
83
+ Pass `--yes` to approve a deterministic capacity assignment without the prompt:
84
+
85
+ ```bash
86
+ npx rayfin up --yes
87
+ ```
88
+
89
+ To select a specific existing capacity, pass its Fabric capacity ID.
90
+ This explicitly approves assigning that capacity:
91
+
92
+ ```bash
93
+ npx rayfin up --capacity-id <capacity-guid>
94
+ ```
95
+
96
+ Do not combine `--capacity-id` with `--workspace`, `--workspace-id`, or `--workspace-uri`.
97
+ If multiple premium capacities are available, select one explicitly with `--capacity-id`.
98
+ An existing recorded deployment keeps its current workspace capacity and ignores a newly supplied capacity ID.
99
+
65
100
  ### Choose a unique Fabric item name
66
101
 
67
102
  By default, `rayfin up` uses the project ID from `rayfin.yml` as the Fabric item name.
@@ -84,7 +119,7 @@ npx rayfin up \
84
119
  --output json
85
120
  ```
86
121
 
87
- Do not pass `--yes` unless reusing an existing same-named item is intentional.
122
+ The `--yes` option also approves reuse of an existing same-named item, so use it only when both automatic capacity assignment and item reuse are acceptable.
88
123
 
89
124
  ### What `rayfin up` does
90
125
 
@@ -5,10 +5,14 @@ sidebar_position: 2
5
5
  # connector add
6
6
 
7
7
  ```bash
8
- npx rayfin connector add --type <type> --workspace-id <ws-id> --item-id <item-id> [--name <name>] [--operations <ops>]
8
+ npx rayfin connector add --type <type> --workspace-id <ws-id> --item-id <item-id> [--name <name>] [--operations <ops>] [--auth <type>]
9
9
  ```
10
10
 
11
11
  > **`kusto` authoring is held in this release**, so `connector add --type kusto` refuses before writing anything. Kusto examples below describe the authoring path for when it ships. See [Connectors](./index.md) for what a project that already declares Kusto can still do.
12
+ >
13
+ > **`fabric-dataagent` authoring is held in this release** too.
14
+ > `connector add --type fabric-dataagent` refuses before writing a YAML entry or scaffold directory, even with `--yes` or `--operations`.
15
+ > The connector remains experimental; its existing configuration and runtime contract are preserved.
12
16
 
13
17
  `connector add` declares a connector in `rayfin/rayfin.yml` and scaffolds its supporting files.
14
18
 
@@ -25,9 +29,19 @@ If you do not already know the workspace and item IDs, run [`connector search`](
25
29
  | `--item-id <id>` | yes (Fabric) | Fabric item or artifact ID. Must be a literal. |
26
30
  | `--name <name>` | no | Connector name. Derived from the item display name when omitted. |
27
31
  | `--operations <ops>` | no | Comma-separated subset of the type's allowed operations, for example `read,update`. Narrows the emitted `operations:` at add time. Omit for all allowed operations. Each value must be in the type's catalog allowlist. |
32
+ | `--auth <type>` | no | Identity each call runs as: `delegated` (the signed-in caller) or `application` (the app owner). Omit to use the connector type's catalog default. Must be in the type's allowed auth types. |
28
33
  | `-y, --yes` | no | Auto-accept overwrite and confirmation prompts (non-interactive). |
29
34
  | `-v, --verbose` | no | Verbose diagnostics. |
30
35
 
36
+ ## Authentication
37
+
38
+ `connector add` writes `auth.type: application` for Category A connectors: `fabric-sqlanalytics`, `fabric-warehouse`, and `fabric-sqldatabase`.
39
+ The connector accesses the data source with the app's identity rather than the signed-in end user's identity.
40
+ For per-user data-source access, explicitly set `auth.type: delegated` in `rayfin.yml` before deploying.
41
+
42
+ Category B connectors continue to require `auth.type: delegated`.
43
+ Existing declarations are not migrated, and omitting `auth.type` remains a validation error.
44
+
31
45
  ## Scoping operations
32
46
 
33
47
  Without `--operations`, `connector add` writes **every** operation the catalog allows for the type. Prefer scoping at add time over hand-editing YAML afterwards:
@@ -46,7 +60,7 @@ connectors:
46
60
  workspaceId: ${WS_ID}
47
61
  itemId: ${ITEM_ID}
48
62
  auth:
49
- type: delegated
63
+ type: application
50
64
  operations:
51
65
  - name: read
52
66
  - name: update
@@ -63,7 +77,7 @@ Rules:
63
77
  For `kusto` and `fabric-semanticmodel`, `connector add` writes the `rayfin.yml` entry and generates a complete typed `schema.ts`, but there are no GraphQL entities to discover, so no entity files are generated and no row-level security applies:
64
78
 
65
79
  - `fabric-semanticmodel` allows `executeQuery`; `kusto` allows `executeQuery` and `executeCommand`. Check `rayfin connector types --json` for the current set.
66
- - `auth.type` must be `delegated`.
80
+ - `auth.type` is `delegated` for `fabric-semanticmodel` and `application` for `kusto` — see [Category B](./category-b-function-bridge.md). Set it with `--auth`.
67
81
  - The connector is pinned to an adapter version.
68
82
  - There is no `metadata.json` entity list to generate from.
69
83
 
@@ -97,6 +111,7 @@ With `--json`, the same information is available under `install`:
97
111
 
98
112
  Running `connector add` against a name already in `rayfin.yml` refreshes the declaration.
99
113
  It prompts before overwriting, or requires `--yes` when non-interactive.
114
+ This rewrites `auth.type` to the catalog default, so reapply an explicit `delegated` setting for a Category A connector after re-adding it if needed.
100
115
 
101
116
  Your generated entity files under `rayfin/connectors/<name>/` are **preserved**.
102
117
  Only `metadata.json` is rewritten, by schema discovery.
@@ -4,15 +4,20 @@ sidebar_position: 6
4
4
 
5
5
  # Category B — function-bridge connectors
6
6
 
7
- Reference for `fabric-semanticmodel` (Power BI semantic model) and the experimental `kusto` (the **Eventhouse** connector — a Fabric Eventhouse KQL Database).
7
+ Reference for `fabric-semanticmodel` (Power BI semantic model), the experimental `fabric-dataagent` (Fabric Data Agent), and the experimental `kusto` (the **Eventhouse** connector — a Fabric Eventhouse KQL Database).
8
8
  Eventhouse is the Fabric product name; `kusto` is the type id you pass to `--type`, and KQL is its query language.
9
9
 
10
10
  > **`kusto` authoring is held in this release**, so `connector add --type kusto` refuses and search omits KQL databases. Everything below about `kusto` stays accurate for a project that **already declares** one — which still validates, deploys and invokes — and describes the authoring path for when it ships. Only `fabric-semanticmodel` can be added today. See [Connectors](./index.md).
11
+ >
12
+ > **`fabric-dataagent` authoring is held in this release**, and the connector remains experimental, not generally available.
13
+ > `connector add --type fabric-dataagent` refuses before writing files; `connector types` and `connector search` omit it.
14
+ > Data Agent examples describe the contract for existing configurations and the authoring path for when it is released, not an available setup flow.
15
+ > The hold does not disable existing validation, deployment, or invocation paths; live use still requires the backend adapter.
11
16
 
12
17
  A Category B connector is a named-operation surface backed by a small, platform-owned function (UDF).
13
18
  The Builder never writes or sees the function code.
14
19
 
15
- The Builder declares the connector and calls a typed method; the Fabric app backend injects connector configuration and delegated authentication before forwarding to the function.
20
+ The Builder declares the connector and calls a typed method; the Fabric app backend injects connector configuration and authentication before forwarding to the function.
16
21
  There are no GraphQL entities, so do **not** generate entity files, `@role` policies, or `metadata.json` entities for these connector types.
17
22
 
18
23
  For the entity-generating types (`fabric-sqlanalytics`, `fabric-warehouse`, `fabric-sqldatabase`), read the package-owned Category A docs in `@microsoft/rayfin-connector-fabric-graphql` (`rayfin docs search` / `search_docs`) instead.
@@ -22,10 +27,17 @@ For the entity-generating types (`fabric-sqlanalytics`, `fabric-warehouse`, `fab
22
27
  | Type | Operations | Query language | Auth |
23
28
  | --- | --- | --- | --- |
24
29
  | `fabric-semanticmodel` | `executeQuery` | DAX | `delegated` only |
25
- | `kusto` (**experimental**) | `executeQuery`, `executeCommand` | KQL | `delegated` only |
30
+ | `kusto` (**experimental**) | `executeQuery`, `executeCommand` | KQL | `application` only |
31
+ | `fabric-dataagent` (**experimental**) | `getInfo`, `startTask`, `getTask`, `getTaskResult`, `cancelTask` | Natural language (MCP) | `delegated` only |
26
32
 
27
- Both are pinned to an adapter version (`version: '1'` today).
28
- Delegated authentication runs every call as the signed-in user through the on-behalf-of flow.
33
+ All three are pinned to an adapter version (`version: '1'` today).
34
+ `delegated` runs every call as the signed-in user through the on-behalf-of flow; `application` runs it as the app owner.
35
+
36
+ Kusto's adapter authorizes as the app owner and rejects a delegated caller token, so it takes `application` only — `auth.type: delegated` is refused at validation rather than failing at the data plane. Row-level security is therefore evaluated against the owner, not the caller.
37
+
38
+ The experimental `fabric-dataagent` SDK package also provides an `ask` helper.
39
+ `ask` is a client-side convenience composed from the task operations, not a connector operation, so it never appears in `rayfin.yml`.
40
+ See [Calling a Data Agent connector](#calling-a-data-agent-connector).
29
41
 
30
42
  ## Add the connector
31
43
 
@@ -37,7 +49,7 @@ rayfin connector add \
37
49
  --name telemetry
38
50
  ```
39
51
 
40
- `--item-id` identifies the Fabric item to query: a KQL Database for `kusto`, a semantic model for `fabric-semanticmodel`.
52
+ `--item-id` identifies the Fabric item to query: a KQL Database for `kusto`, a semantic model for `fabric-semanticmodel`, a published Data Agent for experimental `fabric-dataagent`.
41
53
  Omit `--name` to derive the connector name from the Fabric item's display name.
42
54
 
43
55
  The CLI verifies the item, writes the `rayfin.yml` entry, and scaffolds `rayfin/connectors/<name>/schema.ts`.
@@ -53,21 +65,22 @@ connectors:
53
65
  workspaceId: <ws-id>
54
66
  itemId: <kql-database-item-id>
55
67
  auth:
56
- type: delegated
68
+ type: application
57
69
  operations:
58
70
  - name: executeQuery
59
71
  - name: executeCommand
60
72
  ```
61
73
 
62
74
  The `config` block is the single source of truth for what to query and is not sent on the client wire.
63
- `kusto` allows `executeQuery` and `executeCommand`; `fabric-semanticmodel` allows `executeQuery`.
64
- In every case `auth.type` must be `delegated`.
75
+ `kusto` allows `executeQuery` and `executeCommand`; `fabric-semanticmodel` allows `executeQuery`; experimental `fabric-dataagent` allows `getInfo`, `startTask`, `getTask`, `getTaskResult` and `cancelTask`.
76
+ `auth.type` is `application` for `kusto` and `delegated` for the other two.
65
77
 
66
78
  ## The generated schema.ts
67
79
 
68
80
  `connector add` writes `rayfin/connectors/<name>/schema.ts` with a `// @generated — do not edit.` banner.
69
81
  Do not hand-edit it.
70
- Regenerate it by removing and re-adding the connector (`rayfin connector remove <name>`, then `rayfin connector add ...`).
82
+ For released types, regenerate it by removing and re-adding the connector (`rayfin connector remove <name>`, then `rayfin connector add ...`).
83
+ Do not remove a held connector to regenerate its files: `connector add` will refuse to recreate it.
71
84
 
72
85
  For `fabric-semanticmodel` the file exports the typed marker plus a generic runtime config:
73
86
 
@@ -110,6 +123,19 @@ If the resolved values look wrong, re-add the connector rather than editing the
110
123
 
111
124
  The Eventhouse scaffold imports both its marker and `KustoConnectorConfig` from `@microsoft/rayfin-connector-kusto`, so it does not import `@microsoft/rayfin-connectors` at all.
112
125
 
126
+ ### The experimental Data Agent scaffold uses the generic config shape
127
+
128
+ Experimental `fabric-dataagent` needs no client-side routing values.
129
+ An existing `schema.ts` uses the generic `ConnectorConfig` shape shown for semantic models above, and a marker whose type argument is the operations declared in `rayfin.yml`:
130
+
131
+ ```ts
132
+ import type { FabricDataAgent } from '@microsoft/rayfin-connector-fabric-dataagent';
133
+
134
+ export type SalesAgentSchema = FabricDataAgent<'getInfo' | 'startTask' | 'getTask' | 'getTaskResult' | 'cancelTask'>;
135
+ ```
136
+
137
+ The AppBackend resolves the workspace and Data Agent item from `rayfin.yml`; app code and `fabricDataAgent()` never supply an MCP endpoint.
138
+
113
139
  ## Install the packages the generated file imports
114
140
 
115
141
  `connector add` scaffolds files but installs nothing. It prints the exact pinned command — copy it from that output, or rebuild it from the `packages` array in `rayfin connector types --json`, which carries both the package names and the version:
@@ -122,6 +148,9 @@ npm install @microsoft/rayfin-connector-kusto@1.35.0-alpha
122
148
 
123
149
  # fabric-semanticmodel
124
150
  npm install @microsoft/rayfin-connector-fabric-semanticmodel@1.35.0-alpha @microsoft/rayfin-connectors@1.35.0-alpha
151
+
152
+ # fabric-dataagent (experimental, authoring held) — existing configurations only
153
+ npm install @microsoft/rayfin-connector-fabric-dataagent@1.35.0-alpha @microsoft/rayfin-connectors@1.35.0-alpha
125
154
  ```
126
155
 
127
156
  **Always pin the version.** Connector packages ship in lockstep with the CLI, but their npm `latest` and `preview` tags lag behind, so an unversioned install pulls an older release and its own mismatched `@microsoft/rayfin-data`.
@@ -136,6 +165,7 @@ This is not optional: the runtime is what injects the generated routing and deco
136
165
 
137
166
  - `kusto()` merges the generated `queryServiceUri` and `databaseName` into the outbound payload. Without it, `executeQuery` and `executeCommand` cannot route to the cluster.
138
167
  - `fabricSemanticModel()` decodes the Arrow response. Without it, `executeQuery` results cannot be read.
168
+ - `fabricDataAgent()` (experimental) normalizes each operation's result and supplies the client-side `ask` helper. Without it, results arrive as raw, un-normalized payloads and `client.connectors.<name>.ask(...)` is posted to the host as an operation it does not know.
139
169
 
140
170
  Key the runtime map by the same connector name, and call the factory once per connector:
141
171
 
@@ -261,6 +291,69 @@ Exceeding it fails the query with an `'overflow'` error, so a truncated result a
261
291
 
262
292
  Run `rayfin docs search "resultSetRowCountLimit"` for version-locked details, since this behavior is owned by the connector package rather than the CLI.
263
293
 
294
+ ## Calling a Data Agent connector
295
+
296
+ > **Experimental; new authoring is held.**
297
+ > The API below describes an already-configured connector, not a currently available `connector add` flow.
298
+ > It may change substantially in a future release.
299
+
300
+ A Data Agent answers natural-language questions over the data sources its publisher configured.
301
+ Questions can take minutes, so the Data Agent MCP endpoint runs them as tasks.
302
+ The connector exposes that lifecycle as named operations — `startTask`, `getTask`, `getTaskResult`, `cancelTask` — plus `getInfo` for the agent's metadata.
303
+
304
+ Use the `ask` helper for the common case.
305
+ `ask` is a client-side convenience, not a connector operation: it calls `startTask`, polls `getTask` while reporting progress, honours cancellation, applies an overall deadline (5 minutes by default), and returns `getTaskResult`.
306
+ It is only typed on `client.connectors.<name>` when the connector allows `startTask`, `getTask`, `getTaskResult` and `cancelTask`.
307
+
308
+ ```ts
309
+ import { FabricDataAgentError } from '@microsoft/rayfin-connector-fabric-dataagent';
310
+
311
+ const controller = new AbortController();
312
+
313
+ try {
314
+ const answer = await client.connectors.salesAgent.ask({
315
+ question: 'What were sales by region last quarter?',
316
+ onProgress: (p) => setStatus(p.statusMessage ?? p.status),
317
+ signal: controller.signal,
318
+ });
319
+ render(answer.text);
320
+ if (answer.deepLinkUrl) showLink('Open in Data Agent', answer.deepLinkUrl);
321
+ } catch (err) {
322
+ if (err instanceof FabricDataAgentError && err.code === 'DATA_AGENT_FORBIDDEN') {
323
+ showAccessRequest();
324
+ } else {
325
+ throw err;
326
+ }
327
+ }
328
+ ```
329
+
330
+ `answer.text` joins the text blocks; `answer.content`, `answer.structuredContent`, and `answer.meta` preserve everything the server returned.
331
+ `onProgress` and `signal` never leave the browser — the SDK consumes them.
332
+
333
+ Read the agent's name, description, and tool contract with `getInfo()`; the result is cached per client for five minutes.
334
+
335
+ Call the task operations directly when the app needs to own the task lifecycle, for example to resume polling after a page reload:
336
+
337
+ ```ts
338
+ const started = await client.connectors.salesAgent.startTask({ question });
339
+ if (started.kind === 'answer') {
340
+ render(started.answer.text);
341
+ } else {
342
+ const { taskId } = started.task;
343
+ // Persist taskId, then later:
344
+ const status = await client.connectors.salesAgent.getTask({ taskId });
345
+ if (status.status === 'completed') {
346
+ const answer = await client.connectors.salesAgent.getTaskResult({ taskId });
347
+ render(answer.text);
348
+ }
349
+ }
350
+ ```
351
+
352
+ Every operation throws `FabricDataAgentError` with a stable `code` (`DATA_AGENT_FORBIDDEN`, `DATA_AGENT_NOT_PUBLISHED`, `DATA_AGENT_TIMEOUT`, `DATA_AGENT_THROTTLED`, ...), a `retryable` flag, a `category` of `user` or `system`, and a `correlationId` when the service supplied one.
353
+
354
+ The endpoint is stateless.
355
+ To give the agent context from earlier turns, pass them in `history`; the app owns any persisted chat transcript.
356
+
264
357
  ## Exercising a Category B connector from the CLI
265
358
 
266
359
  `rayfin connector invoke <name> <operation>` is the loop for Category B.
@@ -268,6 +361,9 @@ See [`connector invoke`](./invoke.md) for payload input, transports, token handl
268
361
 
269
362
  - `connector inspect` supports `fabric-semanticmodel` but **not** experimental `kusto` — a `kusto` connector errors with `Unsupported connector type: kusto`.
270
363
  There is no ad-hoc query path for Kusto connectors today.
364
+ - `connector inspect` does not support experimental `fabric-dataagent` either.
365
+ Use `rayfin connector invoke <name> getInfo` to read the agent's metadata.
366
+ `connector invoke` accepts the connector's named operations only; `ask` is a client-side SDK helper, so it is not an operation `invoke` can call.
271
367
  - `connector invoke` on `fabric-semanticmodel` calls Fabric/Power BI directly under the developer's identity, so it works with or without `rayfin up`.
272
368
  Every other type, including experimental `kusto`, POSTs to the deployed item and requires a prior `rayfin up`.
273
369
  - `connector invoke` on `fabric-semanticmodel` returns an already-normalized result, because that connector normalizes inside its `invoke` middleware.
@@ -288,8 +384,12 @@ A real `executeQuery` requires `rayfin up`.
288
384
  | `connector inspect` errors with `Unsupported connector type: kusto` | `connector inspect` has no Kusto path | Use `rayfin connector invoke <name> executeQuery` instead. |
289
385
  | `Cannot find module '@microsoft/rayfin-connector-kusto'` | `connector add` scaffolds but does not install | Run the pinned `npm install` command `connector add` printed; never install unversioned. |
290
386
  | The generated `schema.ts` has `queryServiceUri` / `databaseName` you did not expect | Expected — Kusto cluster routing is resolved at add time and baked in | Do not edit the file. Re-add the connector to re-resolve. |
291
- | `rayfin up` rejects `auth.type: application` | Category B connectors are delegated-only | Set `auth.type: delegated`. |
387
+ | `rayfin up` rejects `auth.type: application` on `fabric-semanticmodel` | `fabric-semanticmodel` is delegated-only | Set `auth.type: delegated`. |
388
+ | A Kusto query returns the app owner's data instead of the caller's | Kusto is application-only, so the call runs as the owner and row-level security is evaluated against them | Expected. Enforce per-user access in your app. |
292
389
  | A Kusto query fails to reach the cluster, or the request carries no `queryServiceUri` | The runtime map was omitted, so nothing injected the generated routing | Pass `{ <name>: kusto() }` as the client's second constructor argument. |
293
390
  | A semantic-model `executeQuery` result cannot be read or decoded | `fabricSemanticModel()` was not registered, so the Arrow response is never decoded | Pass `{ <name>: fabricSemanticModel() }` as the client's second constructor argument. |
391
+ | `client.connectors.<name>.ask` is not typed on an experimental `fabric-dataagent` connector | The connector does not allow every operation `ask` is composed from | Allow `startTask`, `getTask`, `getTaskResult` and `cancelTask` in `rayfin.yml`, and list them in the generated marker's type argument. |
392
+ | `client.connectors.<name>.ask` fails with an unknown or unsupported operation | `fabricDataAgent()` was not registered, so `ask` was posted to the host instead of being composed client-side | Pass `{ <name>: fabricDataAgent() }` as the client's second constructor argument. |
393
+ | `ask` throws `DATA_AGENT_NOT_PUBLISHED` | The Data Agent has a draft but no published configuration | Publish the Data Agent in Fabric, then retry. |
294
394
  | `client.connectors.<name>` is not typed | Connector key differs between `rayfin.yml`, `AppConnectorsSchema`, and the `connectors` option | Use the `rayfin.yml` `name` in all three. |
295
395
  | A Category B call works locally under `rayfin dev` | It does not — `rayfin dev` only parses the block | Deploy with `rayfin up` and retest. |
@@ -13,6 +13,10 @@ It can read SQL-visible tables and views, but it cannot directly open files from
13
13
  This connector is read-only; the Warehouse and SQL Database connectors also support write operations.
14
14
 
15
15
  > **`kusto` authoring is held in this release.** `connector types` and `connector search` omit it, and `connector add --type kusto` refuses it. A project that **already declares** a Kusto connector is unaffected: it still validates, deploys through `rayfin up`, and answers `connector invoke`. Kusto material in these docs describes that preserved runtime contract and the authoring path for when it ships.
16
+ >
17
+ > **`fabric-dataagent` authoring is held in this release**, and the connector remains experimental, not generally available.
18
+ > `connector types` and `connector search` omit it, and `connector add --type fabric-dataagent` refuses before writing files.
19
+ > Existing configurations remain valid and retain their deployment and invocation paths; live use still requires the Data Agent backend adapter.
16
20
 
17
21
  Each command has its own reference page:
18
22
 
@@ -24,7 +28,7 @@ Each command has its own reference page:
24
28
  Each category has its own contract page — read the one that matches your connector type, not both:
25
29
 
26
30
  - [Category A — GraphQL entity connectors](./category-a-entities.md) — now **package-owned**; the full reference (entity generation, `@role` policies, the aggregate schema, and the per-dialect read/write matrix) ships in `@microsoft/rayfin-connector-fabric-graphql` (`rayfin docs search` / `search_docs`).
27
- - [Category B — function-bridge connectors](./category-b-function-bridge.md) — the `fabric-semanticmodel` and experimental `kusto` contract, including the Kusto cluster routing baked into the generated `schema.ts`.
31
+ - [Category B — function-bridge connectors](./category-b-function-bridge.md) — the `fabric-semanticmodel`, experimental `fabric-dataagent` and experimental `kusto` contract, including the Kusto cluster routing baked into the generated `schema.ts`.
28
32
  - [Eventhouse (`kusto`) usage guide](./eventhouse.md) — the experimental `kusto` supplement, now **package-owned**; when to reach for the type, its streaming model, shaping KQL, safe query construction, and reading results all ship in `@microsoft/rayfin-connector-kusto` (`rayfin docs search` / `search_docs`).
29
33
 
30
34
  A typical loop is search → add → inspect (Category A) or search → add → invoke (Category B).
@@ -35,10 +39,10 @@ The commands available to a connector, and the code you write against it, depend
35
39
 
36
40
  | | Category A — GraphQL entity connectors | Category B — function-bridge connectors |
37
41
  | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
38
- | **Types** | `fabric-sqlanalytics`, `fabric-warehouse`, `fabric-sqldatabase`, `fabric-graphql` | `fabric-semanticmodel`; `kusto` (**experimental**) |
42
+ | **Types** | `fabric-sqlanalytics`, `fabric-warehouse`, `fabric-sqldatabase` | `fabric-semanticmodel`; `fabric-dataagent` (**experimental**); `kusto` (**experimental**) |
39
43
  | **App surface** | Generated entity files with typed CRUD through the data client | Named operations carrying raw queries |
40
- | **Operations** | `read` only for `fabric-sqlanalytics` (Lakehouse SQL endpoints are read-only); `read`, `create`, `update`, `delete` for `fabric-warehouse` and `fabric-sqldatabase` (narrowable) | `executeQuery` only |
41
- | **Auth** | `delegated` or configured per project | Must be `delegated` |
44
+ | **Operations** | `read` only for `fabric-sqlanalytics` (Lakehouse SQL endpoints are read-only); `read`, `create`, `update`, `delete` for `fabric-warehouse` and `fabric-sqldatabase` (narrowable) | `executeQuery`; experimental `fabric-dataagent` uses named task operations instead |
45
+ | **Auth** | `delegated` or configured per project | `application` for `kusto`; `delegated` for the others |
42
46
  | **Entity files and `@role` policies** | Yes | No |
43
47
  | **`metadata.json` entities** | Yes | No |
44
48
  | **`connector inspect`** | Supported | `fabric-semanticmodel` only — experimental `kusto` is not supported |
@@ -54,11 +54,44 @@ Applies to `--entity` mode only.
54
54
 
55
55
  Applies to `--entity` and `--query` modes.
56
56
 
57
- - **SQL** — must start with `SELECT` or `WITH`; must be a single statement (a trailing `;` is fine, an embedded one is not); rejects `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `CREATE`, `ALTER`, `DROP`, `TRUNCATE`, `EXEC`/`EXECUTE`, and `INTO` anywhere outside a string literal.
57
+ - **SQL** — must start with `SELECT` or `WITH`; an embedded `;` is rejected while a trailing `;` is allowed; rejects `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `CREATE`, `ALTER`, `DROP`, `TRUNCATE`, `EXEC`/`EXECUTE`, and `INTO` anywhere outside a string literal.
58
+ - **SQL result contract** — the query must produce one result set. If Tedious emits a second result set, inspection rejects the query instead of combining rows with a different column contract.
58
59
  - **DAX** — must start with `EVALUATE`.
59
60
  - `--query <path>` must resolve to a `.sql` or `.dax` file inside the project root; paths outside it are rejected. The project root is the directory containing `rayfin/rayfin.yml` when one is found. Direct mode (no `--name`) falls back to the current working directory if no `rayfin.yml` exists, so `--query` never requires a Rayfin project.
60
61
  - `--rows <n>` caps the sample size — maximum 100. The default is mode-specific: entity listing (neither `--entity` nor `--query`) defaults to **100**, while `--entity` and `--query` sampling default to **10**. The result reports `truncated: true` when the source had more rows than the cap; inspect fetches one row beyond the cap to detect that, then discards it.
61
62
 
63
+ ## SQL column types and values
64
+
65
+ SQL inspection reads column types from Tedious result metadata, including when a query returns zero rows.
66
+ It never guesses a column type from row values.
67
+ Plain output lists each column as `name (type)` before populated or empty results.
68
+ If the contract exceeds the terminal width, it folds between column entries.
69
+
70
+ The `columns[].type` field in JSON uses this normalized vocabulary:
71
+
72
+ | Normalized type | Tedious metadata types |
73
+ | ------------------ | ------------------------------------------------------------------------ |
74
+ | `integer` | `TinyInt`, `SmallInt`, `Int`, `BigInt`, `IntN` |
75
+ | `decimal` | `Decimal`, `Numeric`, money types, and their nullable forms |
76
+ | `floating-point` | `Real`, `Float`, `FloatN` |
77
+ | `text` | Character and Unicode text types, plus `Xml` |
78
+ | `boolean` | `Bit`, `BitN` |
79
+ | `date` | `Date` |
80
+ | `time` | `Time` |
81
+ | `datetime` | `SmallDateTime`, `DateTime`, `DateTimeN`, `DateTime2`, `DateTimeOffset` |
82
+ | `uniqueidentifier` | `UniqueIdentifier` |
83
+ | `binary` | `Binary`, `VarBinary`, `Image` |
84
+ | `unknown` | `Null`, `Variant`, `UDT`, `TVP`, and unrecognized or custom types |
85
+
86
+ Plain output renders SQL `date` values as `YYYY-MM-DD`, so the calendar value does not shift with the local time zone.
87
+ SQL `time` values render as the UTC time portion `HH:mm:ss.sss`, without Tedious' internal 1970 date anchor.
88
+ SQL `datetime` and `datetime2` are timezone-naive values that Tedious represents using a JavaScript `Date`; plain and JSON output therefore use an ISO value with `Z` by driver convention.
89
+ SQL `datetimeoffset` is also returned as a JavaScript `Date`, so its original offset is not preserved.
90
+ SQL `bigint` row values are strings, while decimal and numeric row values are JavaScript numbers and can carry JavaScript precision limitations.
91
+ Binary and buffer-backed custom values render as terminal-safe `0x` hexadecimal in plain output and use the existing column-width truncation marker when needed.
92
+ JSON row serialization is unchanged: JavaScript `Date` values remain ISO strings, while `columns[].type` now reports the metadata-derived normalized type instead of `unknown`.
93
+ Queries that produce a second SQL result set are rejected when the driver emits its second column contract, including newline-separated batches without semicolons.
94
+
62
95
  ## Examples
63
96
 
64
97
  ```bash
@@ -33,6 +33,10 @@ Two transports, chosen by connector type:
33
33
  - **Every other type, including `kusto`** — POSTs to the deployed item at `<remote-endpoint>/__private/connectors/<name>/invoke`, so it requires a prior `npx rayfin up`.
34
34
 
35
35
  > `kusto` authoring is held in this release, but invocation is deliberately preserved: a project that already declares a Kusto connector can still invoke it. Only `connector add`, `types` and `search` withdraw the type. See [Connectors](./index.md).
36
+ >
37
+ > Experimental `fabric-dataagent` follows the same authoring-only hold.
38
+ > An existing configuration can still invoke its named operations, such as `getInfo`; the hold does not bypass backend availability, authentication, or operation checks.
39
+ > `ask` is an SDK helper, not a CLI-invokable operation.
36
40
 
37
41
  `--transport deployed` overrides the type-based choice and forces the deployed route. That route authenticates the **app**, not the developer, so it needs an app-session token in `RAYFIN_TOKEN`; `npx rayfin login` cannot mint one.
38
42
 
@@ -9,6 +9,10 @@ npx rayfin connector search [query] [--workspace-id <id> --type <types> | --all-
9
9
  ```
10
10
 
11
11
  > **`kusto` authoring is held in this release**, so search does not return KQL databases and `--type kusto` is not accepted. Search exists to feed `connector add`, which would refuse the type — surfacing a source the Builder could not then attach. See [Connectors](./index.md).
12
+ >
13
+ > **`fabric-dataagent` authoring is held in this release** too.
14
+ > Search omits Data Agent items, and an explicit `--type fabric-dataagent` is rejected before authentication or discovery.
15
+ > The connector remains experimental and cannot be added yet.
12
16
 
13
17
  `connector search` finds Fabric data sources — warehouses, SQL databases, Lakehouses, and semantic models — that the signed-in identity can add as connectors, before you know exact workspace or item IDs.
14
18
 
@@ -56,6 +56,7 @@ Set `RAYFIN_WORKSPACE_ID` to target a specific workspace; otherwise the active r
56
56
  The CLI starts `npm run dev:frontend` when that script exists and falls back to `npm run dev` for existing projects.
57
57
  This lets bundled templates expose `npm run dev` as the complete session without recursively starting the CLI.
58
58
  When migrating an existing project to `"dev": "rayfin dev"`, also add a non-recursive child such as `"dev:frontend": "vite"`; otherwise the CLI fails with an actionable recursion error.
59
+ `rayfin init` does this automatically for a from-scratch scaffold, when `@microsoft/rayfin-cli` is installed or already declared as a dependency.
59
60
  Scripts are resolved from `services.staticHosting.path` when configured, otherwise from the project root.
60
61
  For a nested frontend package, declare `dev:frontend` (or the legacy `dev` fallback) in that package's `package.json`.
61
62
 
@@ -73,7 +74,7 @@ The proxy is reachable wherever the Vite dev server is reachable, so keep Vite b
73
74
  The local functions setup makes these workspace changes:
74
75
 
75
76
  - Merges backend coordinates and the Node inspector argument into the configured functions package's `local.settings.json`.
76
- - Adds a `Functions: Attach` configuration to the root `.vscode/launch.json` after the Functions host becomes ready.
77
+ - Adds a `Functions: Attach` configuration to the root `.vscode/launch.json` after the Functions host becomes ready. If the entry already exists and the inspector moved to another port, only its `port` is updated.
77
78
  - Leaves JSON-with-comments launch files unchanged and reports that the attach configuration must be added manually.
78
79
  - Patches recognized existing `src/services/rayfinClient.ts` and `src/services/bootstrap.ts` files once so non-adapter projects read `VITE_RAYFIN_FUNCTIONS_URL` only during Vite development.
79
80
  - Regenerates the framework `.env.local` file unless `--no-emit-env` is set.
@@ -14,6 +14,10 @@ npx rayfin up functions deploy [-v | --verbose] [--skip-build] [--json]
14
14
 
15
15
  `npx rayfin up` already deploys functions as part of a full deployment. Use `up functions deploy` when you want to run **only** the functions step — for example to retry after a functions deploy failed, or to push a functions-only change without redeploying the rest of the app.
16
16
 
17
+ This standalone command uploads function code; it does not validate or apply `services.functions.auth.type` from YAML or migrate the remote Functions auth mode.
18
+ After setting `services.functions.auth.type: application` for an existing app, run a full `npx rayfin up` to apply project settings.
19
+ See [Application authentication](../../functions/index.md#application-authentication).
20
+
17
21
  ## Prerequisites
18
22
 
19
23
  Run `npx rayfin up` at least once first. This command deploys to an existing remote item, so a remote endpoint must already exist. If there is no active deployment, run a full `npx rayfin up`.
@@ -31,8 +35,16 @@ Run `npx rayfin up` at least once first. This command deploys to an existing rem
31
35
  1. Builds and packages the functions project (unless `--skip-build`).
32
36
  2. Deploys the package to the remote Rayfin item resolved from your active deployment.
33
37
 
38
+ ## Troubleshooting
39
+
40
+ ### `404` on deploy
41
+
42
+ A `404` from the deploy endpoint usually means Functions are not enabled on the **remote** item, not that the endpoint is unavailable.
43
+ The workload hides every Functions route behind the deployed project's `services.functions.enabled` setting, and this command uploads code without applying project settings.
44
+ If you enabled Functions (for example by running `npx rayfin functions init`) after your last full deployment, run `npx rayfin up` once to sync `rayfin.yml`, then retry.
45
+
34
46
  ## Related
35
47
 
36
48
  - [`functions init`](./init.md) — scaffold and enable functions.
37
49
  - [`dev functions apply`](./dev-apply.md) — run and debug functions locally before deploying.
38
- - [Managing Secrets](../secrets.md) — push secrets that deployed functions read via `ctx.getSecret`.
50
+ - [Managing Secrets](../secrets.md) — push secrets that deployed functions read via `ctx.Secrets`.
@@ -42,6 +42,11 @@ This command does not start the frontend.
42
42
  Run the Vite frontend separately to invoke local functions through `/.rayfin/api/<name>`, or use `npx rayfin dev` to start both together.
43
43
  If the local Functions host is unavailable, the Vite adapter returns HTTP 502 instead of invoking deployed function code.
44
44
 
45
+ This standalone command does not validate or apply the project's Functions auth setting.
46
+ Full `npx rayfin up` and normal `npx rayfin dev` perform that validation when applying project settings.
47
+ Run a full `npx rayfin up` to apply [`services.functions.auth.type: application`](../../functions/index.md#application-authentication) to the remote app.
48
+ For local token identity, see [Local development](../../functions/connections/index.md#local-development).
49
+
45
50
  ## Automatic recompilation
46
51
 
47
52
  Both `npx rayfin dev functions apply` and `npx rayfin dev` build the functions package once, then run its `build:watch` script alongside the local Functions host if the script is configured.
@@ -63,11 +68,11 @@ If the response remains stale after compilation finishes, restart the dev sessio
63
68
 
64
69
  ## Debugging
65
70
 
66
- With debugging enabled (default), attach your debugger to the inspector port (`9229` by default) using the generated **"Functions: Attach"** launch configuration in VS Code. Pass `--no-debug` to run without the inspector.
71
+ With debugging enabled (default), attach your debugger to the inspector port (`9229` by default) using the generated **"Functions: Attach"** launch configuration in VS Code. If you pass a different `--inspect-port`, the existing configuration's port is updated to match. Pass `--no-debug` to run without the inspector.
67
72
 
68
73
  ## Secrets in local development
69
74
 
70
- Locally there is no deployed secret bag, so `ctx.getSecret(name)` falls back to `process.env`. To provide a secret, add it under `Values` in `rayfin/functions/local.settings.json`; the functions host loads those entries into `process.env`. See [Managing Secrets](../secrets.md#using-secrets-in-local-development).
75
+ Locally there is no deployed secret bag, so `ctx.Secrets.<NAME>` falls back to `process.env`. To provide a secret, add it under `Values` in `rayfin/functions/local.settings.json`; the functions host loads those entries into `process.env`. See [Managing Secrets](../secrets.md#using-secrets-in-local-development).
71
76
 
72
77
  ## Next step
73
78
 
@@ -80,3 +85,4 @@ npx rayfin up functions deploy
80
85
  ```
81
86
 
82
87
  See [`up functions deploy`](./deploy.md).
88
+ The standalone deployment uploads function code; it does not apply YAML auth settings or migrate the remote Functions auth mode.
@@ -7,6 +7,8 @@ sidebar_position: 4
7
7
  Rayfin functions are server-side user-defined functions (UDFs) that run in the Fabric runtime and are invocable from your frontend through `RayfinClient`. Use them for logic that must run on the backend — secrets and API keys, privileged data access, server-side validation, and anything that should not be exposed or tampered with in client code.
8
8
 
9
9
  The functions project lives at `rayfin/functions/` and is enabled by the `services.functions.enabled` flag in `rayfin.yml` (set for you the first time you run [`functions init`](./init.md)).
10
+ Enabled Functions also require explicit `services.functions.auth.type: application`, which new scaffolds set.
11
+ See [Application authentication](../../functions/index.md#application-authentication) for existing-app configuration and downstream resource permissions.
10
12
 
11
13
  Each command has its own reference page:
12
14
 
@@ -34,8 +36,8 @@ functions init → write UDFs in src/function_app.ts → dev functions apply
34
36
  - `rayfin/functions/src/function_app.ts` — where you register UDFs with `udf.func()`.
35
37
  - `rayfin/functions/src/types.ts` — auto-generated `AppFunctionsSchema`; regenerated by `functions init` (one-shot) and by the watcher inside `dev functions apply`.
36
38
  - `rayfin/functions/{package.json,host.json,tsconfig.json,local.settings.json}` — the functions app manifest, host config, TypeScript project references, and local settings.
37
- - `rayfin.yml` — the `services.functions` block (`enabled`, `buildCommand`).
39
+ - `rayfin.yml` — the `services.functions` block (`enabled`, `auth.type`, `buildCommand`).
38
40
 
39
41
  ## Secrets
40
42
 
41
- Functions read secrets at runtime with `ctx.getSecret(name)`, backed by the host secret bag with a `process.env` fallback. Manage remote secrets with `npx rayfin secret set` — or bulk-set them from a file with `npx rayfin secret set --env-file` — see [Managing Secrets](../secrets.md).
43
+ Functions read secrets at runtime as typed properties on `ctx.Secrets`, backed by the host secret bag with a `process.env` fallback. Manage remote secrets with `npx rayfin secret set` — or bulk-set them from a file with `npx rayfin secret set --env-file` — see [Managing Secrets](../secrets.md).
@@ -24,12 +24,15 @@ Run this from a directory that already contains a `rayfin/` project (i.e. you ha
24
24
  ## What it does
25
25
 
26
26
  1. **Scaffolds** `rayfin/functions/` with a starter function app, `host.json`, `tsconfig.json`, `package.json`, and `local.settings.json`.
27
- 2. **Enables the service** in `rayfin.yml` by setting `services.functions.enabled: true` and `services.functions.buildCommand: 'npm run build'`.
27
+ 2. **Enables the scaffolded service** in `rayfin.yml` by setting `services.functions.enabled: true`, `services.functions.auth.type: application`, and `services.functions.buildCommand: 'npm run build'`.
28
28
  3. **Installs dependencies** for the functions project.
29
29
  4. **Builds** the project.
30
30
  5. **Generates types** — runs a one-shot typegen to produce `rayfin/functions/src/types.ts` (the `AppFunctionsSchema`).
31
31
  6. **Installs AI agent files** so assistants understand the functions surface.
32
32
 
33
+ Enabled Functions require explicit application authentication.
34
+ For existing apps, see [Application authentication](../../functions/index.md#application-authentication) for the configuration and full-deployment requirement.
35
+
33
36
  ## Runtime version
34
37
 
35
38
  Fresh and forced scaffolds pin `@microsoft/fabric-user-data-functions` to the exact version of the running Rayfin CLI, matching connector scaffolding.
@@ -60,6 +63,9 @@ rayfin/
60
63
  - **Without `--force`** on an existing project, it preserves your `function_app.ts` and only refreshes dependencies, build, and generated types.
61
64
  - **With `--force`**, it overwrites the scaffold (a warning is shown before your files are replaced).
62
65
 
66
+ Re-running without `--force` does not rewrite the existing Functions auth setting.
67
+ Set `services.functions.auth.type: application` explicitly in an existing app rather than relying on a re-run to migrate it.
68
+
63
69
  ## Next step
64
70
 
65
71
  Start the local host and typegen watcher:
@@ -89,7 +89,7 @@ Connectors let a Rayfin app read from — and, for some types, write to — Micr
89
89
 
90
90
  ### Secrets
91
91
 
92
- Secrets are encrypted values stored on your deployed Rayfin item and read at runtime — for example by [functions](./functions/index.md) via `ctx.getSecret`. See [Managing Secrets](./secrets.md) for the full guide.
92
+ Secrets are encrypted values stored on your deployed Rayfin item and read at runtime — for example by [functions](./functions/index.md) via `ctx.Secrets`. See [Managing Secrets](./secrets.md) for the full guide.
93
93
 
94
94
  | Command | Description |
95
95
  | --- | --- |
@@ -129,18 +129,31 @@ export RAYFIN_TELEMETRY_OPTOUT=1
129
129
 
130
130
  ## Diagnostic logs
131
131
 
132
- `npx rayfin up` and workflow-based `npx rayfin dev` record detailed diagnostics under `~/.rayfin/logs/` even when `--verbose` is absent, including when using `--json` or `--output json`.
132
+ `npx rayfin up`, workflow-based `npx rayfin dev`, and `npx rayfin dev functions apply` record detailed diagnostics under `~/.rayfin/logs/` even when `--verbose` is absent, including when using `--json` or `--output json`.
133
133
  After a failure, open the file identified by `Diagnostic log:` to inspect the original invocation without rerunning it.
134
134
  JSON failures include the same path in the `diagnosticLog` field of the single result object.
135
135
  `dev` JSON failures also include a `hint` with recovery guidance, including provider/configuration preflight errors and unexpected failures.
136
136
 
137
- Adding `--verbose` also mirrors diagnostic records to stderr while `up` or `dev` runs.
137
+ Adding `--verbose` also mirrors diagnostic records to stderr while these commands run.
138
138
  The CLI rejects combining `--verbose` with `--json` or `--output json`; detailed diagnostics are still recorded in the log file without `--verbose`.
139
- This capability applies to workflow-based `up` and `dev` sessions, not standalone subcommands or Docker maintenance flags such as `dev --stop`.
140
-
141
- `dev` preserves normal frontend and Functions terminal output and flushes its log after cleanup on Ctrl-C, runtime failure, or normal completion.
139
+ Other standalone subcommands and Docker maintenance flags such as `dev --stop` do not record these logs.
140
+
141
+ Local Functions sessions show function endpoints, the debugger address, application output, and warnings or errors by default.
142
+ Recognized host startup and configuration detail, HTTP request metadata, and successful initial build output are kept in diagnostics; use `--verbose` to mirror that detail to the terminal.
143
+ When the host restarts after a watched file change, such as `node_modules` updates after an install, the terminal shows a single `Functions host restarted.` line and the debugger address only when it changes.
144
+ When the initial build fails, human output includes a bounded tail of compiler output, and JSON errors include it in `buildOutput`.
145
+ The tail retains up to 100 complete lines and 64 KiB, with an explicit marker when earlier output is omitted.
146
+ Verbose mode does not replay the same compiler output a second time.
147
+ Terminal output preserves stack-frame paths and line numbers, while masking credentials and email addresses.
148
+ Application lines up to 16 KiB are preserved; oversized lines are replaced with an explicit truncation marker.
149
+ Persistent diagnostic logs continue to apply their separate privacy and size limits.
150
+ Failed HTTP responses show their status and, when request metadata is available, the method and path without query strings.
151
+ Unrecognized output remains visible.
152
+ Frontend output is unchanged.
153
+ Both `dev` and `dev functions apply` flush their logs after cleanup on Ctrl-C, runtime failure, or normal completion.
142
154
  Piped runtime and build output is captured with a 1 MiB limit per stream.
143
- Interactive runtimes that inherit the terminal keep their keyboard and TTY behavior; their console output is not captured, and the log records that limitation alongside lifecycle events.
155
+ Interactive Functions sessions keep standard input attached for keyboard interaction, while stdout and stderr are piped for filtering and diagnostic capture.
156
+ Other interactive runtimes that inherit the terminal keep their keyboard and TTY behavior; their console output is not captured, and the log records that limitation alongside lifecycle events.
144
157
 
145
158
  Logs stay on your machine and are independent of telemetry opt-out.
146
159
  The log directory is shared across projects on your machine, so the retention limits below apply across all projects using it.