@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.
- package/assets/docs/app-backend/deploy.md +36 -1
- package/assets/docs/cli/connectors/add.md +18 -3
- package/assets/docs/cli/connectors/category-b-function-bridge.md +111 -11
- package/assets/docs/cli/connectors/index.md +8 -4
- package/assets/docs/cli/connectors/inspect.md +34 -1
- package/assets/docs/cli/connectors/invoke.md +4 -0
- package/assets/docs/cli/connectors/search.md +4 -0
- package/assets/docs/cli/environment-variables.md +2 -1
- package/assets/docs/cli/functions/deploy.md +13 -1
- package/assets/docs/cli/functions/dev-apply.md +8 -2
- package/assets/docs/cli/functions/index.md +4 -2
- package/assets/docs/cli/functions/init.md +7 -1
- package/assets/docs/cli/index.md +20 -7
- package/assets/docs/cli/secrets.md +18 -8
- package/assets/docs/functions/connections/add-ado.md +8 -4
- package/assets/docs/functions/connections/add-azure-resource.md +17 -131
- package/assets/docs/functions/connections/add-fabric-resource.md +31 -61
- package/assets/docs/functions/connections/add-foundry.md +11 -4
- package/assets/docs/functions/connections/get-fabric-info.md +7 -25
- package/assets/docs/functions/connections/index.md +127 -22
- package/assets/docs/functions/index.md +39 -1
- package/assets/docs/functions/secrets.md +39 -11
- package/assets/docs/functions/writing-functions.md +27 -23
- package/assets/docs/getting-started/project-structure.md +3 -1
- package/assets/docs/preview/local-dev-docker.md +2 -1
- package/package.json +1 -1
- 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
|
-
|
|
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:
|
|
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`
|
|
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
|
|
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 | `
|
|
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
|
-
|
|
28
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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`
|
|
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
|
|
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`
|
|
41
|
-
| **Auth** | `delegated` or configured per project |
|
|
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`;
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
package/assets/docs/cli/index.md
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
|
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.
|