@axonflow/sdk 9.1.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +238 -22
- package/dist/cjs/adapters/langgraph.d.ts.map +1 -1
- package/dist/cjs/adapters/langgraph.js +20 -0
- package/dist/cjs/adapters/langgraph.js.map +1 -1
- package/dist/cjs/authzen.d.ts +353 -0
- package/dist/cjs/authzen.d.ts.map +1 -0
- package/dist/cjs/authzen.js +901 -0
- package/dist/cjs/authzen.js.map +1 -0
- package/dist/cjs/client.d.ts +135 -9
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +397 -30
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/heartbeat.d.ts +55 -4
- package/dist/cjs/heartbeat.d.ts.map +1 -1
- package/dist/cjs/heartbeat.js +86 -7
- package/dist/cjs/heartbeat.js.map +1 -1
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +55 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/read-identity.d.ts +267 -0
- package/dist/cjs/read-identity.d.ts.map +1 -0
- package/dist/cjs/read-identity.js +329 -0
- package/dist/cjs/read-identity.js.map +1 -0
- package/dist/cjs/telemetry.d.ts +176 -13
- package/dist/cjs/telemetry.d.ts.map +1 -1
- package/dist/cjs/telemetry.js +403 -37
- package/dist/cjs/telemetry.js.map +1 -1
- package/dist/cjs/types/authzen.gen.d.ts +407 -0
- package/dist/cjs/types/authzen.gen.d.ts.map +1 -0
- package/dist/cjs/types/authzen.gen.js +804 -0
- package/dist/cjs/types/authzen.gen.js.map +1 -0
- package/dist/cjs/types/config.d.ts +43 -1
- package/dist/cjs/types/config.d.ts.map +1 -1
- package/dist/cjs/types/hitl.js +1 -1
- package/dist/cjs/types/hitl.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/adapters/langgraph.d.ts.map +1 -1
- package/dist/esm/adapters/langgraph.js +20 -0
- package/dist/esm/adapters/langgraph.js.map +1 -1
- package/dist/esm/authzen.d.ts +353 -0
- package/dist/esm/authzen.d.ts.map +1 -0
- package/dist/esm/authzen.js +886 -0
- package/dist/esm/authzen.js.map +1 -0
- package/dist/esm/client.d.ts +135 -9
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +397 -30
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/heartbeat.d.ts +55 -4
- package/dist/esm/heartbeat.d.ts.map +1 -1
- package/dist/esm/heartbeat.js +85 -7
- package/dist/esm/heartbeat.js.map +1 -1
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/read-identity.d.ts +267 -0
- package/dist/esm/read-identity.d.ts.map +1 -0
- package/dist/esm/read-identity.js +320 -0
- package/dist/esm/read-identity.js.map +1 -0
- package/dist/esm/telemetry.d.ts +176 -13
- package/dist/esm/telemetry.d.ts.map +1 -1
- package/dist/esm/telemetry.js +397 -37
- package/dist/esm/telemetry.js.map +1 -1
- package/dist/esm/types/authzen.gen.d.ts +407 -0
- package/dist/esm/types/authzen.gen.d.ts.map +1 -0
- package/dist/esm/types/authzen.gen.js +779 -0
- package/dist/esm/types/authzen.gen.js.map +1 -0
- package/dist/esm/types/config.d.ts +43 -1
- package/dist/esm/types/config.d.ts.map +1 -1
- package/dist/esm/types/hitl.js +1 -1
- package/dist/esm/types/hitl.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
> **Upgrade strongly recommended.** AxonFlow ships substantial monthly security and quality hardening; staying on the latest major is the security-supported release line. [Latest release](https://github.com/getaxonflow/axonflow-sdk-typescript/releases/latest) · [Security advisories](https://github.com/getaxonflow/axonflow-sdk-typescript/security/advisories)
|
|
9
9
|
|
|
10
|
-
> **
|
|
10
|
+
> **Taking a sponsored workflow to production?**
|
|
11
11
|
>
|
|
12
12
|
> Choose the path that fits:
|
|
13
13
|
> - **Self-serve:** free 90-day [Evaluation License](https://getaxonflow.com/evaluation-license?utm_source=readme_sdk_typescript_eval)
|
|
14
|
-
> - **
|
|
14
|
+
> - **Paid production program:** [Design Partner or Confidential Pilot](https://getaxonflow.com/design-partner?utm_source=readme_sdk_typescript) - one scoped workflow over 60 or 75 days, founder-led rollout support, upfront conversion pricing, and a fixed decision date; public track from $2,000 or confidential track from $4,000
|
|
15
15
|
>
|
|
16
|
-
>
|
|
16
|
+
> The paid program requires a dated forcing event, written controls, an executive sponsor, and a technical owner. Prices are subject to eligibility and a signed agreement.
|
|
17
17
|
|
|
18
18
|
> **Questions or feedback?**
|
|
19
19
|
>
|
|
@@ -29,11 +29,11 @@ A deployed AxonFlow platform (self-hosted or cloud) is required for end-to-end A
|
|
|
29
29
|
|
|
30
30
|
### See AxonFlow in Action
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Videos covering different angles of the platform:
|
|
33
33
|
|
|
34
|
-
- **[
|
|
35
|
-
- **[
|
|
36
|
-
- **[Architecture
|
|
34
|
+
- **[Product demos: Platform + Fraud & Risk](https://getaxonflow.com/demo/?utm_source=github&utm_medium=readme&utm_campaign=product_demo&utm_content=axonflow-sdk-typescript)** - runtime enforcement, HITL approvals, audit evidence, cost visibility, and agentic payment controls
|
|
35
|
+
- **[Community Quickstart walkthrough (2 min)](https://youtu.be/BSqU1z0xxCo)** - governed calls, PII blocking, Gateway Mode with LangChain/CrewAI, and MAP from YAML
|
|
36
|
+
- **[Architecture deep dive (12 min)](https://youtu.be/Q2CZ1qnquhg)** - how the control plane works, policy enforcement flow, and multi-agent planning
|
|
37
37
|
|
|
38
38
|
## Installation
|
|
39
39
|
|
|
@@ -67,7 +67,7 @@ Concurrent executions applies to MAP and WCP executions per tenant. Pending exec
|
|
|
67
67
|
|
|
68
68
|
> **Note:** Evidence export and policy simulation are licensed AxonFlow platform capabilities available alongside the SDK on your deployed platform — not language-specific SDK helpers. Access them via the platform API or customer portal. The SDK row is included to show what your licensed deployment unlocks at each tier.
|
|
69
69
|
|
|
70
|
-
[Get a free Evaluation license](https://getaxonflow.com/evaluation-license?utm_source=readme_sdk_typescript_eval) · [
|
|
70
|
+
[Get a free Evaluation license](https://getaxonflow.com/evaluation-license?utm_source=readme_sdk_typescript_eval) · [Run a paid production program](https://getaxonflow.com/design-partner?utm_source=readme_sdk_typescript_eval) · [Full feature matrix](https://docs.getaxonflow.com/docs/features/community-vs-enterprise?utm_source=readme_sdk_typescript_eval)
|
|
71
71
|
|
|
72
72
|
## Try Without Installing
|
|
73
73
|
|
|
@@ -461,6 +461,85 @@ export default async function handler(req, res) {
|
|
|
461
461
|
}
|
|
462
462
|
```
|
|
463
463
|
|
|
464
|
+
## AuthZEN-Native Authorization
|
|
465
|
+
|
|
466
|
+
`axonflow.evaluate` asks the gateway an AuthZEN question - may this subject perform this action on this resource? - over `POST /api/v1/access/evaluation`. It is the surface to write **new** integrations against: at v11 the engine behind it becomes AxonFlow's new Policy Decision Point with no wire change, so an integration written here migrates once rather than twice. Nothing is deprecated by it today; `decide` and the gateway/proxy methods are wire-stable through all of v11.
|
|
467
|
+
|
|
468
|
+
```typescript
|
|
469
|
+
import { AuthZENRefusal, AxonFlow } from '@axonflow/sdk';
|
|
470
|
+
|
|
471
|
+
const decision = await axonflow.evaluate({
|
|
472
|
+
subject: { type: 'gateway', id: 'llm-gateway-01' },
|
|
473
|
+
action: { name: 'llm.completion' },
|
|
474
|
+
resource: { type: 'llm', id: 'llm' },
|
|
475
|
+
context: { args: { query: userPrompt } },
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
if (!decision.allowed) {
|
|
479
|
+
throw new Error(`blocked: ${decision.state} (${decision.reason})`);
|
|
480
|
+
}
|
|
481
|
+
for (const obligation of decision.mandatoryObligations) {
|
|
482
|
+
// an allow you cannot discharge is not an allow
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
Several preconditions of **one** operation go in a bulk envelope, which returns **one** decision - a denied entry denies the operation, so a caller cannot act on the entry it liked:
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
const decision = await axonflow.evaluateAll({
|
|
490
|
+
subject: { type: 'gateway', id: 'llm-gateway-01' },
|
|
491
|
+
action: { name: 'tool.call' },
|
|
492
|
+
context: { args: { query: userPrompt } },
|
|
493
|
+
evaluations: [
|
|
494
|
+
{ resource: { type: 'tool', id: 'jira/move_issue' } },
|
|
495
|
+
{ resource: { type: 'tool', id: 'jira/update_project' } },
|
|
496
|
+
],
|
|
497
|
+
});
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Known gotchas
|
|
501
|
+
|
|
502
|
+
**A refusal is not a denial.** This surface refuses anything it cannot evaluate rather than evaluating around it - send a subject property or an unrecognised context member and you get an `AuthZENRefusal` naming the exact member, not a decision computed without it. Treating every error as a deny fails closed, which is safe, but blocks traffic that would be allowed once the request is corrected.
|
|
503
|
+
|
|
504
|
+
```typescript
|
|
505
|
+
try {
|
|
506
|
+
const decision = await axonflow.evaluate(request);
|
|
507
|
+
} catch (err) {
|
|
508
|
+
if (err instanceof AuthZENRefusal) {
|
|
509
|
+
err.code; // e.g. 'unevaluable_attribute' - a closed, generated set
|
|
510
|
+
err.pointer; // '/evaluation/subject/properties' - the member to fix
|
|
511
|
+
err.refusedBy; // 'client' (this SDK) or 'gateway'
|
|
512
|
+
err.retryable; // only a gateway dependency failure is
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
`AuthZENProtocolError` is separate and means something else: the gateway answered `200` with a body this build cannot safely act on - no profile context, a profile it cannot read, or a decision boolean that disagrees with its operational state. It is always fail-closed, and the fix is an upgrade or an operator, not a corrected request. A `401` surfaces as the SDK's ordinary `AuthenticationError`, because the gateway answers authentication before this route runs.
|
|
518
|
+
|
|
519
|
+
**`decision.allowed`, never `decision.decision`.** The bare boolean is AuthZEN 1.0's collapsed rendering; `allowed` additionally requires the operational state to be `ALLOW`, so a `CHALLENGE` or an `ERROR` can never be read as permission.
|
|
520
|
+
|
|
521
|
+
**Three states, not two.** `undefined` cannot express the difference between "the source established there is no value" and "the source could not be reached", and collapsing them is how an attribute nobody resolved gets recorded as one that was weighed. Attributes inside the `context` and `properties` bags may be explicit:
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
import { AUTHZEN_UNKNOWN_RESOLUTION_FAILED, AuthZENAttribute } from '@axonflow/sdk';
|
|
525
|
+
|
|
526
|
+
const context = {
|
|
527
|
+
args: { query: userPrompt },
|
|
528
|
+
correlation: {
|
|
529
|
+
session_id: AuthZENAttribute.absent(), // a fact: omitted, request sent
|
|
530
|
+
trace_id: AuthZENAttribute.unknown(AUTHZEN_UNKNOWN_RESOLUTION_FAILED), // refused locally
|
|
531
|
+
},
|
|
532
|
+
};
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
The tri-state applies to attribute **data**, not to the structural members (`subject.id`, `action.name`, …): those are the identity of the question being asked, and an identity you cannot resolve is not an attribute whose absence a policy could evaluate - there is no request to make.
|
|
536
|
+
|
|
537
|
+
**Wire member names are `snake_case`, not `camelCase`.** These interfaces ARE the wire documents - they are serialised verbatim - so `source_policy`, `decision_id` and `schema_version` keep the names the server uses. That is deliberate: a server refusal's JSON Pointer names a member, and the pointer is this surface's whole diagnosis, so it has to name a member the caller can find in their own code.
|
|
538
|
+
|
|
539
|
+
**Today's mapping is deliberately narrow.** `subject.type` must be `'gateway'` (an end-user subject needs the identity plane, which activates at v11); an `llm` or `agent` resource id must be the stage name itself, not a provider/model pair, because nothing on the serving path reads a provider or a model; a `tool` resource id is `'server/tool'`, because both halves ARE read. Everything else is refused by name.
|
|
540
|
+
|
|
541
|
+
The wire types AND their runtime validators are **generated** from the platform's canonical contract artifact (`scripts/gen-authzen-types/generate.js`); CI fails if the committed module is not what the artifact produces. A TypeScript interface is erased at runtime, so the validators are what actually refuses a body this build cannot interpret. Runnable example: [`examples/authzen/index.ts`](examples/authzen/index.ts). Migration notes: [`docs/AUTHZEN_MIGRATION_DRAFT.md`](docs/AUTHZEN_MIGRATION_DRAFT.md).
|
|
542
|
+
|
|
464
543
|
## Configuration Options
|
|
465
544
|
|
|
466
545
|
```typescript
|
|
@@ -554,6 +633,85 @@ AxonFlow automatically:
|
|
|
554
633
|
- **Logs** all requests for compliance audit trails
|
|
555
634
|
- **Monitors** costs and usage patterns
|
|
556
635
|
|
|
636
|
+
## Reading decisions: who is asking decides what comes back
|
|
637
|
+
|
|
638
|
+
`explainDecision` and `listDecisions` — and the audit reads — are scoped to the
|
|
639
|
+
**per-user identity** you present, not to the tenant credential. Since platform
|
|
640
|
+
#2922:
|
|
641
|
+
|
|
642
|
+
| What you present | What an enterprise stack returns |
|
|
643
|
+
|---|---|
|
|
644
|
+
| a tenant-wide role (`admin`, `owner`, `policy_admin`) | the whole tenant |
|
|
645
|
+
| any other identity (`developer`, `viewer`) | only the rows attributed to it |
|
|
646
|
+
| **no identity** | **nothing at all** — every list is empty, every explain is not-found |
|
|
647
|
+
|
|
648
|
+
`clientId`/`clientSecret` authenticate the **organization**. They do not say who
|
|
649
|
+
is asking, so on their own they land in the third row. Community and
|
|
650
|
+
Community-SaaS deployments are single-operator and read tenant-wide with no
|
|
651
|
+
identity needed.
|
|
652
|
+
|
|
653
|
+
```typescript
|
|
654
|
+
const client = new AxonFlow({
|
|
655
|
+
endpoint: 'http://localhost:8080',
|
|
656
|
+
clientId: process.env.AXONFLOW_CLIENT_ID,
|
|
657
|
+
clientSecret: process.env.AXONFLOW_CLIENT_SECRET,
|
|
658
|
+
userToken: process.env.AXONFLOW_USER_TOKEN, // <- the per-user identity
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
// Per call:
|
|
662
|
+
const exp = await client.explainDecision(decisionId, { userToken: usersToken });
|
|
663
|
+
|
|
664
|
+
// Or, for a process acting on behalf of several people, derive a client bound
|
|
665
|
+
// to one person. Unlike the per-call option, which only the read methods
|
|
666
|
+
// accept, this reaches EVERY method.
|
|
667
|
+
const rows = await client.asUser(alicesToken).listDecisions();
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
The token is a per-user JWT — minted by the customer portal's user-token API, or
|
|
671
|
+
for local testing by `scripts/generate-jwt.sh --kind user`. It is **not** the
|
|
672
|
+
tenant JWT and not `clientSecret`. It is sent as `X-User-Token`, is never
|
|
673
|
+
logged, never reaches telemetry, and is never sent to any origin but the
|
|
674
|
+
configured endpoint.
|
|
675
|
+
|
|
676
|
+
### Telling the outcomes apart
|
|
677
|
+
|
|
678
|
+
"Not found", "not yours" and "no identity resolved" used to arrive as the same
|
|
679
|
+
`404`, and an unscoped list arrived as an ordinary empty page. Both now carry a
|
|
680
|
+
cause:
|
|
681
|
+
|
|
682
|
+
```typescript
|
|
683
|
+
import { ReadScopeError } from '@axonflow/sdk';
|
|
684
|
+
|
|
685
|
+
try {
|
|
686
|
+
const decisions = await client.listDecisions();
|
|
687
|
+
} catch (err) {
|
|
688
|
+
if (err instanceof ReadScopeError && err.identityMissing) {
|
|
689
|
+
// The platform resolved no identity, so it returned zero rows by
|
|
690
|
+
// construction. The empty answer was never evidence about your data.
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
`explainDecision` is where the other scope shows up. Under `own-rows` the
|
|
696
|
+
platform answers "not attributed to you" and "not there at all" with the **same
|
|
697
|
+
404**, deliberately, so that a miss cannot be used to probe for another user's
|
|
698
|
+
rows — the error reports the scope the read ran under, never a claim about what
|
|
699
|
+
exists.
|
|
700
|
+
|
|
701
|
+
> **A valid token can still resolve to nobody.** The platform reserves the whole
|
|
702
|
+
> of `@axonflow.local` and `@axonflow.internal` for *shared* identities and
|
|
703
|
+
> censuses them to nothing before scoping. A correctly-signed developer token
|
|
704
|
+
> minted at `demo-user@axonflow.local` — which is `generate-jwt.sh`'s own
|
|
705
|
+
> default — reads zero rows and reports `identityMissing`, exactly like no token
|
|
706
|
+
> at all. Mint per-user identities at a real domain.
|
|
707
|
+
|
|
708
|
+
> **Setting `userToken` affects more than reads.** The header rides every
|
|
709
|
+
> request and the agent validates it on every route it proxies — not just the
|
|
710
|
+
> scoped reads. A stale or rotated token therefore turns `listConnectors`,
|
|
711
|
+
> `installConnector` and policy CRUD into `401`s rather than merely unscoping a
|
|
712
|
+
> read. That is the correct, fail-closed direction, but it puts this value in
|
|
713
|
+
> the same rotation story as `clientSecret`.
|
|
714
|
+
|
|
557
715
|
## Error Handling
|
|
558
716
|
|
|
559
717
|
```typescript
|
|
@@ -716,16 +874,16 @@ connectors.forEach(conn => {
|
|
|
716
874
|
|
|
717
875
|
```typescript
|
|
718
876
|
await axonflow.installConnector({
|
|
719
|
-
connector_id: '
|
|
720
|
-
name: '
|
|
877
|
+
connector_id: 'redis-cache',
|
|
878
|
+
name: 'redis-cache',
|
|
721
879
|
tenant_id: 'your-tenant-id',
|
|
722
880
|
options: {
|
|
723
|
-
|
|
881
|
+
// Host/port as seen from the platform (orchestrator), not from this
|
|
882
|
+
// process — 'redis' on the docker-compose stack.
|
|
883
|
+
host: 'redis',
|
|
884
|
+
port: 6379
|
|
724
885
|
},
|
|
725
|
-
credentials: {
|
|
726
|
-
api_key: process.env.AMADEUS_API_KEY,
|
|
727
|
-
api_secret: process.env.AMADEUS_API_SECRET
|
|
728
|
-
}
|
|
886
|
+
credentials: {}
|
|
729
887
|
});
|
|
730
888
|
|
|
731
889
|
console.log('Connector installed successfully!');
|
|
@@ -734,19 +892,18 @@ console.log('Connector installed successfully!');
|
|
|
734
892
|
### Query a Connector
|
|
735
893
|
|
|
736
894
|
```typescript
|
|
737
|
-
// Query the
|
|
895
|
+
// Query the Redis connector. Redis connector queries are command
|
|
896
|
+
// statements (GET / EXISTS / TTL / KEYS) with the key in params.
|
|
738
897
|
const resp = await axonflow.queryConnector(
|
|
739
|
-
'
|
|
740
|
-
'
|
|
898
|
+
'redis-cache',
|
|
899
|
+
'GET',
|
|
741
900
|
{
|
|
742
|
-
|
|
743
|
-
destination: 'AMS',
|
|
744
|
-
date: '2025-12-15'
|
|
901
|
+
key: 'user:123:preferences'
|
|
745
902
|
}
|
|
746
903
|
);
|
|
747
904
|
|
|
748
905
|
if (resp.success) {
|
|
749
|
-
console.log('
|
|
906
|
+
console.log('Redis data:', resp.data);
|
|
750
907
|
} else {
|
|
751
908
|
console.error('Query failed:', resp.error);
|
|
752
909
|
}
|
|
@@ -1028,6 +1185,65 @@ distinguishable from production heartbeat).
|
|
|
1028
1185
|
|
|
1029
1186
|
`AXONFLOW_TELEMETRY=off` disables the anonymous SDK heartbeat (version, OS, architecture). On **self-hosted** and **in-VPC** deployments, that heartbeat is the only data the SDK sends to AxonFlow, so setting `=off` means we receive nothing. On **Community SaaS** (`try.getaxonflow.com`) the hosted service also processes operational data — registrations, audit logs, policy enforcement records, workflow state, plan data, and request-header metadata aggregated for usage analytics — as part of running the platform; that operational data flow is governed by the [Privacy Policy](https://getaxonflow.com/privacy/), not by `AXONFLOW_TELEMETRY`.
|
|
1030
1187
|
|
|
1188
|
+
### Platform licence tier (`license_tier`)
|
|
1189
|
+
|
|
1190
|
+
Each heartbeat also reports the licence tier of the AxonFlow platform the SDK is configured to talk to — for example `community`, `evaluation`, `Enterprise`, or the transient `starting` while a platform is still booting. This lets us tell an enterprise-licensed deployment apart from an unlicensed community one in aggregate adoption figures, which the heartbeat previously could not distinguish.
|
|
1191
|
+
|
|
1192
|
+
What is and is not collected:
|
|
1193
|
+
|
|
1194
|
+
- **Collected:** the coarse tier string only.
|
|
1195
|
+
- **Not collected:** your licence key, its expiry, its seat or node count, your organisation's name, and any other licence detail. The SDK never reads your licence key.
|
|
1196
|
+
|
|
1197
|
+
The value is read from the `tier` field of the platform's own `/health` response — the same response the heartbeat already fetches to report the platform version, and an endpoint that returns this field to any caller without authentication. **No additional network request is made, and the SDK gains no access to anything `/health` does not already return.**
|
|
1198
|
+
|
|
1199
|
+
**This is an adoption-analytics signal, not an entitlement one.** The value is whatever the platform at your configured endpoint reported about itself, relayed unchanged: the SDK derives nothing and verifies nothing, and the receiver cannot verify the relay either. Whoever operates that endpoint controls the value completely, so it must never gate entitlement, unlock a feature, or enter any authorization or billing decision. It is used only for aggregate adoption figures.
|
|
1200
|
+
|
|
1201
|
+
The field is **omitted entirely** whenever the tier could not be determined — the platform is unreachable, returns an error, returns an unparseable body, or returns no `tier` field. It is never defaulted to a guessed value, so an absent field means "not known", never "community".
|
|
1202
|
+
|
|
1203
|
+
`AXONFLOW_TELEMETRY=off` suppresses this field along with the rest of the heartbeat.
|
|
1204
|
+
|
|
1205
|
+
### Platform build and deployment mode (`edition`, `platform_deployment_mode`)
|
|
1206
|
+
|
|
1207
|
+
Each heartbeat also reports which **build** the connected platform is running (`edition`: `community` or `enterprise`) and the platform's **own deployment mode** (`platform_deployment_mode`). Neither is derivable from the other or from the licence tier — the Community SaaS fleet runs the _enterprise_ build against the _community-saas_ schema.
|
|
1208
|
+
|
|
1209
|
+
Both are read from the platform's own `/health` response — the **same response** the heartbeat already fetches for the platform version and licence tier. **No additional network request is made.** Both are **omitted entirely** when the platform did not report them; an absent field means "not known" and is never defaulted.
|
|
1210
|
+
|
|
1211
|
+
These are adoption-analytics signals, **not entitlement ones**: whoever operates your configured endpoint controls both values and the SDK verifies neither.
|
|
1212
|
+
|
|
1213
|
+
> One naming caution for anyone reading raw payloads: the heartbeat's own `deployment_mode` field is a **different** dimension — a coarse topology this SDK derives from the endpoint URL you configured. The platform's own mode travels as `platform_deployment_mode`.
|
|
1214
|
+
|
|
1215
|
+
### Declaring a framework adapter (`registerAdapter`)
|
|
1216
|
+
|
|
1217
|
+
If you are building a framework integration on top of this SDK, you can declare it so aggregate adoption figures can tell adapter-driven usage apart from bare SDK usage. Without this they are indistinguishable: an adapter reports the same `sdk`, the same `sdk_version` and the same endpoint as any other client.
|
|
1218
|
+
|
|
1219
|
+
```typescript
|
|
1220
|
+
import { registerAdapter } from '@axonflow/sdk';
|
|
1221
|
+
|
|
1222
|
+
registerAdapter('my-framework');
|
|
1223
|
+
```
|
|
1224
|
+
|
|
1225
|
+
**The SDK's own `AxonFlowLangGraphAdapter` already does this**, so simply using it is enough — no telemetry code in your application.
|
|
1226
|
+
|
|
1227
|
+
The name is added to the `features` array of the heartbeat that already fires, as `adapter:my-framework`. **It adds no network request**, and calling `registerAdapter` does not itself send anything. It is idempotent.
|
|
1228
|
+
|
|
1229
|
+
The heartbeat fires on the client's **first outbound request**, not at construction, so anything registered before that request is on the very first ping. A name registered afterwards rides the next heartbeat.
|
|
1230
|
+
|
|
1231
|
+
What is and is not collected:
|
|
1232
|
+
|
|
1233
|
+
- **Collected:** the adapter name you pass, lowercased and trimmed.
|
|
1234
|
+
- **Not collected:** anything about what the adapter _does_ — no prompts, no payloads, no tool names, no user identities, no configuration.
|
|
1235
|
+
|
|
1236
|
+
Bounds, so a malformed call cannot damage the ping it rides on:
|
|
1237
|
+
|
|
1238
|
+
- A name longer than **64 bytes** is **dropped whole**, never truncated — a truncated adapter name is a name nothing is running. A name that is empty after trimming, or not a string, is ignored.
|
|
1239
|
+
- The `features` array carries at most **32 entries**, none longer than **128 bytes**.
|
|
1240
|
+
|
|
1241
|
+
The name is **not** validated against a list of known frameworks. The canonical vocabulary lives on the receiving service, which folds an unrecognised name into an `adapter:unknown` bucket while keeping the raw name on the row.
|
|
1242
|
+
|
|
1243
|
+
> **`heartbeatReady` moved with the trigger.** It resolves after the first request's heartbeat rather than after a constructor ping, and stays pending for a client that never sends a request. If you `await client.heartbeatReady` in a short-lived process, move that await to **after** your first API call.
|
|
1244
|
+
|
|
1245
|
+
`AXONFLOW_TELEMETRY=off` suppresses all of the above along with the rest of the heartbeat.
|
|
1246
|
+
|
|
1031
1247
|
`DO_NOT_TRACK` is **not** honored as an opt-out for AxonFlow telemetry. It is commonly inherited from host tools and developer environments, which makes it an unreliable expression of user intent.
|
|
1032
1248
|
|
|
1033
1249
|
See [Telemetry Documentation](https://docs.getaxonflow.com/docs/telemetry) for full details.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,aAAa,EAGd,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
31
|
exports.AxonFlowLangGraphAdapter = exports.WorkflowApprovalRequiredError = exports.WorkflowBlockedError = void 0;
|
|
32
32
|
const errors_1 = require("../errors");
|
|
33
|
+
const telemetry_1 = require("../telemetry");
|
|
33
34
|
/**
|
|
34
35
|
* Error thrown when a workflow step is blocked by policy.
|
|
35
36
|
*/
|
|
@@ -81,6 +82,25 @@ class AxonFlowLangGraphAdapter {
|
|
|
81
82
|
constructor(client, workflowName, options) {
|
|
82
83
|
this.workflowId = null;
|
|
83
84
|
this._stepCounter = 0;
|
|
85
|
+
// Declare this adapter on the next telemetry heartbeat. Without it, an
|
|
86
|
+
// application driving the SDK through this adapter is indistinguishable
|
|
87
|
+
// from bare SDK use on every telemetry dimension — same sdk, same
|
|
88
|
+
// sdk_version, same endpoint — which is the gap the registry closes.
|
|
89
|
+
//
|
|
90
|
+
// Here rather than at module import, and the distinction is the point:
|
|
91
|
+
// importing the module says the adapter is INSTALLED, constructing one says
|
|
92
|
+
// it is IN USE, and only the second is adoption signal.
|
|
93
|
+
//
|
|
94
|
+
// The heartbeat fires on the client's first outbound REQUEST, not at client
|
|
95
|
+
// construction, so a registration made here — necessarily after the client
|
|
96
|
+
// exists and before any call through it — reaches the very first ping. No
|
|
97
|
+
// I/O; one insert into a Set that deduplicates.
|
|
98
|
+
//
|
|
99
|
+
// A LITERAL, not `options?.source`: `source` is a PLATFORM API value the
|
|
100
|
+
// orchestrator interprets and a caller may override, while this is a
|
|
101
|
+
// TELEMETRY value the checkpoint buckets. Deriving one from the other would
|
|
102
|
+
// let a caller repoint an analytics dimension by passing a custom source.
|
|
103
|
+
(0, telemetry_1.registerAdapter)('langgraph');
|
|
84
104
|
this.client = client;
|
|
85
105
|
this.workflowName = workflowName;
|
|
86
106
|
this.source = options?.source ?? 'langgraph';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAGH,sCAImB;
|
|
1
|
+
{"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
|