@agent-os-sdk/client 0.7.11 → 0.7.13
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/dist/client/HttpRequestBuilder.d.ts +48 -0
- package/dist/client/HttpRequestBuilder.d.ts.map +1 -0
- package/dist/client/HttpRequestBuilder.js +73 -0
- package/dist/client/OperationContext.d.ts +19 -0
- package/dist/client/OperationContext.d.ts.map +1 -0
- package/dist/client/OperationContext.js +13 -0
- package/dist/client/OperationContextProvider.d.ts +54 -0
- package/dist/client/OperationContextProvider.d.ts.map +1 -0
- package/dist/client/OperationContextProvider.js +71 -0
- package/dist/client/raw.d.ts +31 -0
- package/dist/client/raw.d.ts.map +1 -1
- package/dist/client/raw.js +13 -6
- package/dist/client/sanitize.d.ts +19 -0
- package/dist/client/sanitize.d.ts.map +1 -0
- package/dist/client/sanitize.js +28 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/modules/agents.d.ts +22 -6
- package/dist/modules/agents.d.ts.map +1 -1
- package/dist/modules/agents.js +26 -7
- package/dist/modules/credentials.d.ts +1 -0
- package/dist/modules/credentials.d.ts.map +1 -1
- package/dist/modules/credentials.js +2 -1
- package/dist/modules/crons.d.ts +1 -0
- package/dist/modules/crons.d.ts.map +1 -1
- package/dist/modules/crons.js +2 -1
- package/dist/modules/triggers.d.ts +11 -0
- package/dist/modules/triggers.d.ts.map +1 -1
- package/dist/modules/triggers.js +17 -2
- package/package.json +3 -2
- package/src/client/HttpRequestBuilder.ts +102 -0
- package/src/client/OperationContext.ts +22 -0
- package/src/client/OperationContextProvider.ts +89 -0
- package/src/client/raw.ts +21 -8
- package/src/client/sanitize.ts +31 -0
- package/src/index.ts +15 -0
- package/src/modules/agents.ts +44 -14
- package/src/modules/credentials.ts +2 -1
- package/src/modules/crons.ts +2 -1
- package/src/modules/triggers.ts +21 -2
package/dist/modules/agents.js
CHANGED
|
@@ -43,26 +43,35 @@ export class AgentsModule {
|
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
45
|
* Create a new agent.
|
|
46
|
+
* Backend only accepts `name` per CreateAgentRequest DTO.
|
|
46
47
|
* @example
|
|
47
48
|
* ```ts
|
|
49
|
+
* const { data: agent } = await client.agents.create({ name: "My Agent" });
|
|
50
|
+
*
|
|
51
|
+
* // With idempotency (safe to retry)
|
|
48
52
|
* const { data: agent } = await client.agents.create({
|
|
49
53
|
* name: "My Agent",
|
|
50
|
-
*
|
|
54
|
+
* idempotency_key: "unique-key"
|
|
51
55
|
* });
|
|
52
56
|
* ```
|
|
53
57
|
*/
|
|
54
58
|
async create(body) {
|
|
59
|
+
const headers = { ...this.headers() };
|
|
60
|
+
if (body.idempotency_key) {
|
|
61
|
+
headers["X-Idempotency-Key"] = body.idempotency_key;
|
|
62
|
+
}
|
|
55
63
|
return this.client.POST("/v1/api/agents", {
|
|
56
|
-
body,
|
|
57
|
-
headers
|
|
64
|
+
body: { name: body.name },
|
|
65
|
+
headers,
|
|
58
66
|
});
|
|
59
67
|
}
|
|
60
68
|
/**
|
|
61
69
|
* Update an existing agent.
|
|
70
|
+
* Uses PATCH per backend AgentsController.
|
|
62
71
|
*/
|
|
63
72
|
async update(agentId, body) {
|
|
64
|
-
return this.client.
|
|
65
|
-
params: { path: { agentId } },
|
|
73
|
+
return this.client.PATCH("/v1/api/agents/{id}", {
|
|
74
|
+
params: { path: { id: agentId } },
|
|
66
75
|
body,
|
|
67
76
|
headers: this.headers(),
|
|
68
77
|
});
|
|
@@ -121,10 +130,20 @@ export class AgentsModule {
|
|
|
121
130
|
* Publish a new version (bundle) of the agent.
|
|
122
131
|
* @param agentId The agent UUID
|
|
123
132
|
* @param graph_spec The graph specification to publish
|
|
124
|
-
* @param options Optional settings: version_label for tagging, set_as_live to make this the active version
|
|
133
|
+
* @param options Optional settings: version_label for tagging, set_as_live to make this the active version, idempotency_key for safe retries
|
|
125
134
|
* @returns Bundle response with version details
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* const { data: bundle } = await client.agents.publish(agentId, graphSpec, {
|
|
138
|
+
* idempotency_key: "publish-unique-key"
|
|
139
|
+
* });
|
|
140
|
+
* ```
|
|
126
141
|
*/
|
|
127
142
|
async publish(agentId, graph_spec, options) {
|
|
143
|
+
const headers = { ...this.headers() };
|
|
144
|
+
if (options?.idempotency_key) {
|
|
145
|
+
headers["X-Idempotency-Key"] = options.idempotency_key;
|
|
146
|
+
}
|
|
128
147
|
return this.client.POST("/v1/api/agents/{id}/publish", {
|
|
129
148
|
params: { path: { id: agentId } },
|
|
130
149
|
body: {
|
|
@@ -132,7 +151,7 @@ export class AgentsModule {
|
|
|
132
151
|
version_label: options?.version_label ?? null,
|
|
133
152
|
set_as_live: options?.set_as_live ?? true
|
|
134
153
|
},
|
|
135
|
-
headers
|
|
154
|
+
headers
|
|
136
155
|
});
|
|
137
156
|
}
|
|
138
157
|
// ======================== Bundles ========================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/modules/credentials.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK3E,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,OAAO;gBAFP,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,MAAM,EAC5B,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGjD;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAOhD;;OAEG;IACG,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAOjE;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;KACvC,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAUpC
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/modules/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,9 +42,10 @@ export class CredentialsModule {
|
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Update a credential.
|
|
45
|
+
* Uses PATCH per backend CredentialsController.
|
|
45
46
|
*/
|
|
46
47
|
async update(credentialId, body) {
|
|
47
|
-
return this.client.
|
|
48
|
+
return this.client.PATCH("/v1/api/credentials/{id}", {
|
|
48
49
|
params: { path: { id: credentialId } },
|
|
49
50
|
body,
|
|
50
51
|
headers: this.headers(),
|
package/dist/modules/crons.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crons.d.ts","sourceRoot":"","sources":["../../src/modules/crons.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAK3E,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACR,OAAO,CAAC,MAAM;IAAa,OAAO,CAAC,OAAO;gBAAlC,MAAM,EAAE,SAAS,EAAU,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEpF;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAO7C;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAOxD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAOjC
|
|
1
|
+
{"version":3,"file":"crons.d.ts","sourceRoot":"","sources":["../../src/modules/crons.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAK3E,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACR,OAAO,CAAC,MAAM;IAAa,OAAO,CAAC,OAAO;gBAAlC,MAAM,EAAE,SAAS,EAAU,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEpF;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAO7C;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAOxD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAOjC;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAQjC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAOxD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;CAM3E"}
|
package/dist/modules/crons.js
CHANGED
|
@@ -37,9 +37,10 @@ export class CronsModule {
|
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Update a cron job.
|
|
40
|
+
* Uses PATCH per backend CronsController.
|
|
40
41
|
*/
|
|
41
42
|
async update(cronId, body) {
|
|
42
|
-
return this.client.
|
|
43
|
+
return this.client.PATCH("/v1/api/crons/{id}", {
|
|
43
44
|
params: { path: { id: cronId } },
|
|
44
45
|
body,
|
|
45
46
|
headers: this.headers(),
|
|
@@ -106,6 +106,15 @@ export declare class TriggersModule {
|
|
|
106
106
|
getSecret(triggerId: string): Promise<APIResponse<TriggerSecretResponse>>;
|
|
107
107
|
/**
|
|
108
108
|
* Create a new trigger.
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const { data: trigger } = await client.triggers.create({
|
|
112
|
+
* name: "My Webhook",
|
|
113
|
+
* agent_id: "agent-uuid",
|
|
114
|
+
* trigger_type: "webhook",
|
|
115
|
+
* idempotency_key: "create-trigger-unique-key"
|
|
116
|
+
* });
|
|
117
|
+
* ```
|
|
109
118
|
*/
|
|
110
119
|
create(body: {
|
|
111
120
|
name: string;
|
|
@@ -113,6 +122,8 @@ export declare class TriggersModule {
|
|
|
113
122
|
trigger_type: string;
|
|
114
123
|
template_slug?: string;
|
|
115
124
|
config?: Record<string, unknown>;
|
|
125
|
+
/** Idempotency key for safe retries. When set, duplicate requests with the same key return 409 Conflict. */
|
|
126
|
+
idempotency_key?: string;
|
|
116
127
|
}): Promise<APIResponse<Trigger>>;
|
|
117
128
|
/**
|
|
118
129
|
* Update a trigger.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/modules/triggers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/modules/triggers.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/triggers.js
CHANGED
|
@@ -51,11 +51,26 @@ export class TriggersModule {
|
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
53
|
* Create a new trigger.
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* const { data: trigger } = await client.triggers.create({
|
|
57
|
+
* name: "My Webhook",
|
|
58
|
+
* agent_id: "agent-uuid",
|
|
59
|
+
* trigger_type: "webhook",
|
|
60
|
+
* idempotency_key: "create-trigger-unique-key"
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
54
63
|
*/
|
|
55
64
|
async create(body) {
|
|
65
|
+
const headers = { ...this.headers() };
|
|
66
|
+
if (body.idempotency_key) {
|
|
67
|
+
headers["X-Idempotency-Key"] = body.idempotency_key;
|
|
68
|
+
}
|
|
69
|
+
// Send body without idempotency_key (it's header-only)
|
|
70
|
+
const { idempotency_key, ...requestBody } = body;
|
|
56
71
|
return this.client.POST("/v1/api/triggers", {
|
|
57
|
-
body,
|
|
58
|
-
headers
|
|
72
|
+
body: requestBody,
|
|
73
|
+
headers,
|
|
59
74
|
});
|
|
60
75
|
}
|
|
61
76
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-os-sdk/client",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.13",
|
|
4
4
|
"description": "Official TypeScript SDK for Agent OS platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"openapi-fetch": "^0.13.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
+
"@types/node": "^25.2.1",
|
|
43
44
|
"openapi-typescript": "^7.4.0",
|
|
44
45
|
"tsx": "^4.19.0",
|
|
45
46
|
"typescript": "^5.5.0",
|
|
@@ -49,4 +50,4 @@
|
|
|
49
50
|
"dist",
|
|
50
51
|
"src"
|
|
51
52
|
]
|
|
52
|
-
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpRequestBuilder — Single source of truth for headers
|
|
3
|
+
*
|
|
4
|
+
* All header generation flows through this builder.
|
|
5
|
+
* raw.ts should NOT generate headers directly.
|
|
6
|
+
*
|
|
7
|
+
* Headers generated:
|
|
8
|
+
* - X-Request-Id: Per-request, always new (crypto.randomUUID)
|
|
9
|
+
* - X-Correlation-Id: Per-flow, immutable within flow
|
|
10
|
+
* - Authorization: Bearer token
|
|
11
|
+
* - X-Workspace-Id: Workspace binding (from context)
|
|
12
|
+
* - X-Idempotency-Key: Opt-in for POST requests
|
|
13
|
+
* - User-Agent: SDK version + runtime info
|
|
14
|
+
*
|
|
15
|
+
* @see sdk-upgrade.md Section 1.3
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { OperationContext } from "./OperationContext.js";
|
|
19
|
+
import { sanitizeHeader, sanitizeHeaders } from "./sanitize.js";
|
|
20
|
+
|
|
21
|
+
// SDK version injected at build time, fallback for local dev
|
|
22
|
+
declare const __SDK_VERSION__: string | undefined;
|
|
23
|
+
const SDK_VERSION = typeof __SDK_VERSION__ !== "undefined" ? __SDK_VERSION__ : "0.7.12-dev";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Options for building request headers
|
|
27
|
+
*/
|
|
28
|
+
export interface HttpRequestBuilderOptions {
|
|
29
|
+
/** Bearer token for Authorization header */
|
|
30
|
+
token?: string;
|
|
31
|
+
/** Operation context with correlationId and workspaceId */
|
|
32
|
+
context?: OperationContext;
|
|
33
|
+
/** Idempotency key for POST requests */
|
|
34
|
+
idempotencyKey?: string;
|
|
35
|
+
/** If true, throws if correlationId is missing */
|
|
36
|
+
requireFlow?: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Build headers for HTTP requests.
|
|
41
|
+
* This is the SINGLE SOURCE OF TRUTH for header generation.
|
|
42
|
+
*/
|
|
43
|
+
export class HttpRequestBuilder {
|
|
44
|
+
/**
|
|
45
|
+
* Build headers from options.
|
|
46
|
+
*
|
|
47
|
+
* @throws Error if requireFlow is true and correlationId is missing
|
|
48
|
+
*/
|
|
49
|
+
build(opts: HttpRequestBuilderOptions): Record<string, string> {
|
|
50
|
+
const headers: Record<string, string> = {};
|
|
51
|
+
|
|
52
|
+
// I2: X-Request-Id always exists (per request)
|
|
53
|
+
headers["X-Request-Id"] = crypto.randomUUID();
|
|
54
|
+
|
|
55
|
+
// User-Agent: Dynamic SDK version
|
|
56
|
+
headers["User-Agent"] = this.buildUserAgent();
|
|
57
|
+
|
|
58
|
+
// I3: X-Correlation-Id is per flow
|
|
59
|
+
if (opts.requireFlow && !opts.context?.correlationId) {
|
|
60
|
+
throw new Error("X-Correlation-Id required for flow-scoped operations");
|
|
61
|
+
}
|
|
62
|
+
if (opts.context?.correlationId) {
|
|
63
|
+
headers["X-Correlation-Id"] = opts.context.correlationId;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Authorization
|
|
67
|
+
if (opts.token) {
|
|
68
|
+
headers["Authorization"] = `Bearer ${opts.token}`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// X-Workspace-Id from context
|
|
72
|
+
if (opts.context?.workspaceId) {
|
|
73
|
+
headers["X-Workspace-Id"] = opts.context.workspaceId;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// I7: Idempotency is opt-in
|
|
77
|
+
if (opts.idempotencyKey) {
|
|
78
|
+
headers["X-Idempotency-Key"] = sanitizeHeader(opts.idempotencyKey);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return sanitizeHeaders(headers);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Build User-Agent string with SDK version and runtime info
|
|
86
|
+
*/
|
|
87
|
+
private buildUserAgent(): string {
|
|
88
|
+
// Node.js environment
|
|
89
|
+
if (typeof process !== "undefined" && process.version) {
|
|
90
|
+
return `agent-os-sdk/${SDK_VERSION} (node/${process.version})`;
|
|
91
|
+
}
|
|
92
|
+
// Browser environment
|
|
93
|
+
if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
94
|
+
return `agent-os-sdk/${SDK_VERSION} (browser)`;
|
|
95
|
+
}
|
|
96
|
+
// Unknown environment
|
|
97
|
+
return `agent-os-sdk/${SDK_VERSION}`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Singleton instance for convenience
|
|
102
|
+
export const httpRequestBuilder = new HttpRequestBuilder();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OperationContext — Immutable flow context
|
|
3
|
+
*
|
|
4
|
+
* Created at the start of a logical flow and never mutates.
|
|
5
|
+
*
|
|
6
|
+
* - correlationId: Tracks the entire logical operation (immutable per flow)
|
|
7
|
+
* - workspaceId: Optional workspace binding
|
|
8
|
+
*
|
|
9
|
+
* @see sdk-upgrade.md Section 1.1
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type OperationContext = Readonly<{
|
|
13
|
+
correlationId: string;
|
|
14
|
+
workspaceId?: string;
|
|
15
|
+
}>;
|
|
16
|
+
|
|
17
|
+
export function createOperationContext(input: {
|
|
18
|
+
correlationId: string;
|
|
19
|
+
workspaceId?: string;
|
|
20
|
+
}): OperationContext {
|
|
21
|
+
return Object.freeze({ ...input });
|
|
22
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OperationContextProvider — Flow lifecycle management
|
|
3
|
+
*
|
|
4
|
+
* Provider defines the lifecycle of a flow context.
|
|
5
|
+
* Implementations can use AsyncLocalStorage or manual context passing.
|
|
6
|
+
*
|
|
7
|
+
* @see sdk-upgrade.md Section 1.2
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { OperationContext } from "./OperationContext.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Interface for context providers
|
|
14
|
+
*/
|
|
15
|
+
export interface OperationContextProvider {
|
|
16
|
+
get(): OperationContext | undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Default provider that always returns undefined.
|
|
21
|
+
* Used when no flow context is established.
|
|
22
|
+
*/
|
|
23
|
+
export class DefaultContextProvider implements OperationContextProvider {
|
|
24
|
+
get(): OperationContext | undefined {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* AsyncLocalStorage-based provider for Node.js environments.
|
|
31
|
+
* Automatically propagates context through async call chains.
|
|
32
|
+
*
|
|
33
|
+
* Note: This class requires Node.js async_hooks module.
|
|
34
|
+
* Import and use only in Node.js environments.
|
|
35
|
+
*/
|
|
36
|
+
export class AsyncLocalStorageContextProvider implements OperationContextProvider {
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
private readonly storage: any;
|
|
39
|
+
|
|
40
|
+
constructor() {
|
|
41
|
+
// Dynamic import to avoid browser errors
|
|
42
|
+
try {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
+
const asyncHooks = require("async_hooks");
|
|
45
|
+
this.storage = new asyncHooks.AsyncLocalStorage();
|
|
46
|
+
} catch {
|
|
47
|
+
throw new Error("AsyncLocalStorage requires Node.js environment");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get(): OperationContext | undefined {
|
|
52
|
+
return this.storage?.getStore();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Run a function within a context.
|
|
57
|
+
* The context is automatically available to all async operations within.
|
|
58
|
+
*/
|
|
59
|
+
run<T>(context: OperationContext, fn: () => T): T {
|
|
60
|
+
return this.storage.run(context, fn);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Run an async function within a context.
|
|
65
|
+
*/
|
|
66
|
+
runAsync<T>(context: OperationContext, fn: () => Promise<T>): Promise<T> {
|
|
67
|
+
return this.storage.run(context, fn);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Manual provider for environments without AsyncLocalStorage.
|
|
73
|
+
* Context must be explicitly set and cleared.
|
|
74
|
+
*/
|
|
75
|
+
export class ManualContextProvider implements OperationContextProvider {
|
|
76
|
+
private context: OperationContext | undefined;
|
|
77
|
+
|
|
78
|
+
get(): OperationContext | undefined {
|
|
79
|
+
return this.context;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
set(context: OperationContext): void {
|
|
83
|
+
this.context = context;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
clear(): void {
|
|
87
|
+
this.context = undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
package/src/client/raw.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import createClient, { type Client } from "openapi-fetch";
|
|
9
9
|
import type { components, paths } from "../generated/openapi.js";
|
|
10
|
+
import { httpRequestBuilder } from "./HttpRequestBuilder.js";
|
|
11
|
+
import type { OperationContext } from "./OperationContext.js";
|
|
10
12
|
|
|
11
13
|
// Re-export types for external use
|
|
12
14
|
export type { components, paths };
|
|
@@ -111,6 +113,12 @@ export function createRawClient(options: ClientOptions) {
|
|
|
111
113
|
retry?: boolean;
|
|
112
114
|
/** Override timeout for this request */
|
|
113
115
|
timeoutMs?: number;
|
|
116
|
+
/** Operation context for flow tracing */
|
|
117
|
+
context?: OperationContext;
|
|
118
|
+
/** Idempotency key for POST requests */
|
|
119
|
+
idempotencyKey?: string;
|
|
120
|
+
/** Require correlation ID (throws if missing) */
|
|
121
|
+
requireFlow?: boolean;
|
|
114
122
|
}
|
|
115
123
|
): Promise<APIResponse<T>> {
|
|
116
124
|
// Replace path params
|
|
@@ -152,15 +160,18 @@ export function createRawClient(options: ClientOptions) {
|
|
|
152
160
|
headers["Content-Type"] = "application/json";
|
|
153
161
|
}
|
|
154
162
|
|
|
155
|
-
//
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
);
|
|
163
|
+
// Build standard headers via HttpRequestBuilder (single source of truth)
|
|
164
|
+
const builderHeaders = httpRequestBuilder.build({
|
|
165
|
+
context: opts?.context,
|
|
166
|
+
idempotencyKey: opts?.idempotencyKey,
|
|
167
|
+
requireFlow: opts?.requireFlow,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Merge builder headers (X-Request-Id, X-Correlation-Id, X-Idempotency-Key, User-Agent)
|
|
171
|
+
Object.assign(headers, builderHeaders);
|
|
161
172
|
|
|
162
|
-
//
|
|
163
|
-
const clientRequestId =
|
|
173
|
+
// Use X-Request-Id from builder as client request ID
|
|
174
|
+
const clientRequestId = headers["X-Request-Id"];
|
|
164
175
|
|
|
165
176
|
// Call onRequest hook
|
|
166
177
|
const startTime = Date.now();
|
|
@@ -233,6 +244,8 @@ export function createRawClient(options: ClientOptions) {
|
|
|
233
244
|
code: errorBody?.code || `HTTP_${response.status}`,
|
|
234
245
|
message: errorBody?.message || response.statusText,
|
|
235
246
|
details: errorBody?.details,
|
|
247
|
+
// Include full error body for 422 responses with hints
|
|
248
|
+
...errorBody,
|
|
236
249
|
},
|
|
237
250
|
response,
|
|
238
251
|
meta: { requestId },
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header Sanitization — Security layer for HTTP headers
|
|
3
|
+
*
|
|
4
|
+
* Removes control characters and enforces size limits.
|
|
5
|
+
*
|
|
6
|
+
* @see sdk-upgrade.md Section 1.4
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const MAX_LEN = 1024;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize a single header value.
|
|
13
|
+
* - Removes control characters (0x00-0x1F, 0x7F)
|
|
14
|
+
* - Truncates to MAX_LEN
|
|
15
|
+
*/
|
|
16
|
+
export function sanitizeHeader(v: string): string {
|
|
17
|
+
return v.replace(/[\u0000-\u001F\u007F]/g, "").slice(0, MAX_LEN);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize all header values in a record.
|
|
22
|
+
* Mutates in place for performance.
|
|
23
|
+
*/
|
|
24
|
+
export function sanitizeHeaders(h: Record<string, string>): Record<string, string> {
|
|
25
|
+
for (const k in h) {
|
|
26
|
+
if (Object.prototype.hasOwnProperty.call(h, k) && h[k] !== undefined) {
|
|
27
|
+
h[k] = sanitizeHeader(h[k]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return h;
|
|
31
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -63,6 +63,21 @@ export {
|
|
|
63
63
|
isRetryableError,
|
|
64
64
|
} from "./errors/index.js";
|
|
65
65
|
|
|
66
|
+
// ============================================================
|
|
67
|
+
// Auth Hardening (Pedra Sólida)
|
|
68
|
+
// ============================================================
|
|
69
|
+
|
|
70
|
+
export type { OperationContext } from "./client/OperationContext.js";
|
|
71
|
+
export { createOperationContext } from "./client/OperationContext.js";
|
|
72
|
+
export type { OperationContextProvider } from "./client/OperationContextProvider.js";
|
|
73
|
+
export {
|
|
74
|
+
DefaultContextProvider,
|
|
75
|
+
AsyncLocalStorageContextProvider,
|
|
76
|
+
ManualContextProvider,
|
|
77
|
+
} from "./client/OperationContextProvider.js";
|
|
78
|
+
export { HttpRequestBuilder, httpRequestBuilder } from "./client/HttpRequestBuilder.js";
|
|
79
|
+
export { sanitizeHeader, sanitizeHeaders } from "./client/sanitize.js";
|
|
80
|
+
|
|
66
81
|
// ============================================================
|
|
67
82
|
// Utilities
|
|
68
83
|
// ============================================================
|