@agent-os-sdk/client 0.4.1 → 0.4.2
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 +60 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/modules/builder.d.ts +61 -15
- package/dist/modules/builder.d.ts.map +1 -1
- package/dist/modules/builder.js +20 -3
- package/package.json +50 -49
- package/src/index.ts +1 -1
- package/src/modules/builder.ts +102 -18
package/README.md
CHANGED
|
@@ -64,6 +64,66 @@ await api.runs.resume(runId, { approved: true });
|
|
|
64
64
|
| `triggers` | Webhooks, crons |
|
|
65
65
|
| `credentials` | BYOK secrets |
|
|
66
66
|
|
|
67
|
+
## Hints (hints.v1) — o que são
|
|
68
|
+
|
|
69
|
+
**Hints** são um **side-channel** de UX: o DP/meta-agent **sugere** ações/atenções visuais, o **CP repassa** (sem virar fonte de verdade), e o **Frontend anima** (glow, badge, shake, toast etc).
|
|
70
|
+
Eles **não alteram** `graph_spec` e não são “estado do sistema” — são **sugestões descartáveis**.
|
|
71
|
+
|
|
72
|
+
### Onde aparecem
|
|
73
|
+
|
|
74
|
+
Hoje, no builder do meta-agent, eles saem **junto do update do grafo**:
|
|
75
|
+
|
|
76
|
+
* **SSE event**: `graph_update`
|
|
77
|
+
Payload inclui `graph_spec` e `hints`.
|
|
78
|
+
|
|
79
|
+
E também existem no modelo de retorno não-streaming (`ChatResponse.hints`), se você usar o caminho sync.
|
|
80
|
+
|
|
81
|
+
**Regra kernel**: `Content-Type: text/event-stream` só depois de validações; hints são dados normais dentro do JSON do evento.
|
|
82
|
+
|
|
83
|
+
### Estrutura rápida do HintModel
|
|
84
|
+
|
|
85
|
+
Campos principais:
|
|
86
|
+
|
|
87
|
+
* `type` *(string)*: um dos 12 tipos canônicos
|
|
88
|
+
* `severity` *(info|warn|error|success)*
|
|
89
|
+
* `scope` *(graph|thread|run)* — onde isso “vive”
|
|
90
|
+
* `target` *(opcional)*: `{ node_id?, edge_id?, panel?, action? }`
|
|
91
|
+
* `message` *(opcional)*: texto curto pra UI
|
|
92
|
+
* `ttl_ms` *(opcional)*: tempo pra auto-dismiss
|
|
93
|
+
* `id` *(opcional)*: fingerprint pra dedupe
|
|
94
|
+
* `data` *(opcional)*: payload pequeno (ex.: `code`, `path`, `credential_slug`, `fields`…)
|
|
95
|
+
|
|
96
|
+
### Como usar (frontend)
|
|
97
|
+
|
|
98
|
+
Fluxo recomendado:
|
|
99
|
+
|
|
100
|
+
1. Consumir evento `graph_update`
|
|
101
|
+
2. Ler `payload.hints[]`
|
|
102
|
+
3. Para cada hint, despachar por `hint.type`
|
|
103
|
+
4. Aplicar animação/efeito no alvo (`hint.target`) e opcionalmente mostrar mensagem (`hint.message`)
|
|
104
|
+
5. Respeitar `ttl_ms` quando existir (auto-remover/auto-dismiss)
|
|
105
|
+
|
|
106
|
+
### Mini exemplo
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
event: graph_update
|
|
110
|
+
data: {
|
|
111
|
+
"type": "graph_update",
|
|
112
|
+
"graph_spec": { "...": "..." },
|
|
113
|
+
"hints": [
|
|
114
|
+
{
|
|
115
|
+
"type": "error_marker",
|
|
116
|
+
"id": "error:node_1:UNKNOWN_TOOL:/nodes/3/config/tool",
|
|
117
|
+
"scope": "graph",
|
|
118
|
+
"severity": "error",
|
|
119
|
+
"target": { "node_id": "node_1" },
|
|
120
|
+
"message": "Unknown tool slug",
|
|
121
|
+
"data": { "code": "UNKNOWN_TOOL", "path": "/nodes/3/config/tool" }
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
67
127
|
## Rule
|
|
68
128
|
|
|
69
129
|
> ❌ **NEVER** use `fetch`, `axios`, or `ky` in frontend.
|
package/dist/index.d.ts
CHANGED
|
@@ -46,7 +46,7 @@ export { collectAll, getFirst, paginate, type CursorPaginatedResponse, type Curs
|
|
|
46
46
|
export { createRawClient, createTypedClient, type APIResponse, type ClientOptions, type HookErrorContext, type HookRequestContext, type HookResponseContext, type RawClient, type SDKHooks, type TypedClient } from "./client/raw.js";
|
|
47
47
|
export type { components, paths } from "./client/raw.js";
|
|
48
48
|
export { AgentsModule, type Agent, type AgentGraphResponse, type AgentListResponse, type AgentVersion } from "./modules/agents.js";
|
|
49
|
-
export { BuilderModule, type BuilderChatRequest, type BuilderChatResponse, type BuilderStreamEvent, type GraphUpdateAction } from "./modules/builder.js";
|
|
49
|
+
export { BuilderModule, type BuilderChatRequest, type BuilderChatResponse, type BuilderStreamEvent, type GraphUpdateAction, type HintModel, type HintTargetModel, type HintDataModel } from "./modules/builder.js";
|
|
50
50
|
export { CredentialsModule, type Credential, type CredentialListResponse, type CredentialType } from "./modules/credentials.js";
|
|
51
51
|
export { KnowledgeModule, type KnowledgeDataset, type KnowledgeSearchResponse } from "./modules/knowledge.js";
|
|
52
52
|
export { MembersModule, type Member, type MemberListResponse, type Role } from "./modules/members.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGxG,OAAO,EACH,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,YAAY,EAC/E,KAAK,OAAO,EACf,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACH,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,MAAM,EACtF,KAAK,SAAS,EACjB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAEH,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EACxF,WAAW,EAAE,YAAY,EAEzB,iBAAiB,EAAE,eAAe,EAElC,cAAc,EAAE,WAAW,EAC3B,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,YAAY,EAEjE,KAAK,UAAU,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,EACH,yBAAyB,EAAE,sBAAsB,EACjD,0BAA0B,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EACvF,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAK3E,OAAO,EACH,UAAU,EACV,QAAQ,EAAE,QAAQ,EAAE,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAC7I,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACH,eAAe,EACf,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EACvG,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAExC,KAAK,QAAQ,EAAE,KAAK,WAAW,EAClC,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAOzD,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,38 +37,81 @@ export type ChatHistoryMessage = {
|
|
|
37
37
|
role: 'user' | 'assistant';
|
|
38
38
|
content: string;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* Builder chat request.
|
|
42
|
+
*
|
|
43
|
+
* KERNEL-FIRST: Frontend sends INTENTION only.
|
|
44
|
+
* - Graph spec is loaded from artifact storage by CP
|
|
45
|
+
* - Catalogs are loaded from DB by CP
|
|
46
|
+
* - Frontend should NOT send graph_spec or catalogs
|
|
47
|
+
*/
|
|
40
48
|
export type BuilderChatRequest = {
|
|
49
|
+
/** Chat message/intention */
|
|
41
50
|
message: string;
|
|
42
|
-
|
|
51
|
+
/** Thread ID for conversation continuity */
|
|
43
52
|
thread_id?: string;
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
/** Optional ETag for concurrency control */
|
|
54
|
+
base_graph_etag?: string;
|
|
55
|
+
};
|
|
56
|
+
export type HintTargetModel = {
|
|
57
|
+
node_id?: string;
|
|
58
|
+
edge_id?: string;
|
|
59
|
+
panel?: "credentials" | "triggers" | "logs" | "validation" | "deploy" | string;
|
|
60
|
+
action?: "create_credential" | "save_draft" | "publish_version" | string;
|
|
61
|
+
};
|
|
62
|
+
export type HintDataModel = {
|
|
63
|
+
credential_slug?: string;
|
|
64
|
+
reason?: string;
|
|
65
|
+
fields?: string[];
|
|
66
|
+
code?: string;
|
|
67
|
+
path?: string;
|
|
68
|
+
run_id?: string;
|
|
69
|
+
error_code?: string;
|
|
70
|
+
tokens_in?: number;
|
|
71
|
+
tokens_out?: number;
|
|
72
|
+
usd_estimate?: number;
|
|
73
|
+
action_id?: string;
|
|
74
|
+
params?: Record<string, any>;
|
|
75
|
+
};
|
|
76
|
+
export type HintModel = {
|
|
77
|
+
id?: string;
|
|
78
|
+
scope: "graph" | "thread" | "run" | string;
|
|
79
|
+
type: "highlight_node" | "needs_credential" | "missing_config" | "error_marker" | "warning_marker" | "toast" | "run_started" | "node_running" | "node_failed" | "rate_limited" | "cost_estimate" | "action_suggested" | string;
|
|
80
|
+
severity: "info" | "warn" | "error" | "success";
|
|
81
|
+
target?: HintTargetModel;
|
|
82
|
+
message?: string;
|
|
83
|
+
ttl_ms?: number;
|
|
84
|
+
data?: HintDataModel;
|
|
50
85
|
};
|
|
51
86
|
export type GraphUpdateAction = {
|
|
52
87
|
action: string;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
edge_to?: string;
|
|
88
|
+
} | {
|
|
89
|
+
graph_spec: Record<string, unknown>;
|
|
90
|
+
hints?: HintModel[];
|
|
91
|
+
has_errors?: boolean;
|
|
58
92
|
};
|
|
59
93
|
export type BuilderStreamEvent = {
|
|
60
94
|
type: "message";
|
|
61
95
|
data: {
|
|
62
96
|
text: string;
|
|
63
97
|
};
|
|
98
|
+
} | {
|
|
99
|
+
type: "validation";
|
|
100
|
+
data: {
|
|
101
|
+
valid: boolean;
|
|
102
|
+
errors: any[];
|
|
103
|
+
};
|
|
64
104
|
} | {
|
|
65
105
|
type: "graph_update";
|
|
66
|
-
data:
|
|
106
|
+
data: {
|
|
107
|
+
graph_spec: Record<string, unknown>;
|
|
108
|
+
hints: HintModel[];
|
|
109
|
+
has_errors?: boolean;
|
|
110
|
+
};
|
|
67
111
|
} | {
|
|
68
112
|
type: "done";
|
|
69
113
|
data: {
|
|
70
114
|
response: string;
|
|
71
|
-
actions: GraphUpdateAction[];
|
|
72
115
|
thread_id: string;
|
|
73
116
|
};
|
|
74
117
|
} | {
|
|
@@ -79,8 +122,11 @@ export type BuilderStreamEvent = {
|
|
|
79
122
|
};
|
|
80
123
|
export type BuilderChatResponse = {
|
|
81
124
|
response: string;
|
|
82
|
-
|
|
125
|
+
graph_spec?: Record<string, unknown>;
|
|
126
|
+
valid: boolean;
|
|
127
|
+
errors: any[];
|
|
83
128
|
thread_id: string;
|
|
129
|
+
hints: HintModel[];
|
|
84
130
|
};
|
|
85
131
|
export declare class BuilderModule {
|
|
86
132
|
private client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/modules/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/modules/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/builder.js
CHANGED
|
@@ -110,14 +110,28 @@ export class BuilderModule {
|
|
|
110
110
|
*/
|
|
111
111
|
async chatCollect(agentId, request) {
|
|
112
112
|
let fullResponse = "";
|
|
113
|
-
|
|
113
|
+
let lastGraphSpec;
|
|
114
|
+
let allHints = [];
|
|
115
|
+
const allErrors = [];
|
|
114
116
|
let threadId = request.thread_id ?? "";
|
|
117
|
+
let isValid = true;
|
|
115
118
|
for await (const event of this.chat(agentId, request)) {
|
|
116
119
|
if (event.type === "message") {
|
|
117
120
|
fullResponse += event.data.text;
|
|
118
121
|
}
|
|
119
122
|
else if (event.type === "graph_update") {
|
|
120
|
-
|
|
123
|
+
if ('graph_spec' in event.data) {
|
|
124
|
+
lastGraphSpec = event.data.graph_spec;
|
|
125
|
+
if (event.data.hints) {
|
|
126
|
+
allHints.push(...event.data.hints);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (event.type === "validation") {
|
|
131
|
+
isValid = event.data.valid;
|
|
132
|
+
if (event.data.errors) {
|
|
133
|
+
allErrors.push(...event.data.errors);
|
|
134
|
+
}
|
|
121
135
|
}
|
|
122
136
|
else if (event.type === "done") {
|
|
123
137
|
threadId = event.data.thread_id;
|
|
@@ -125,7 +139,10 @@ export class BuilderModule {
|
|
|
125
139
|
}
|
|
126
140
|
return {
|
|
127
141
|
response: fullResponse,
|
|
128
|
-
|
|
142
|
+
graph_spec: lastGraphSpec,
|
|
143
|
+
hints: allHints,
|
|
144
|
+
valid: isValid,
|
|
145
|
+
errors: allErrors,
|
|
129
146
|
thread_id: threadId,
|
|
130
147
|
};
|
|
131
148
|
}
|
package/package.json
CHANGED
|
@@ -1,51 +1,52 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
2
|
+
"name": "@agent-os-sdk/client",
|
|
3
|
+
"version": "0.4.2",
|
|
4
|
+
"description": "Official TypeScript SDK for Agent OS platform",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"generate": "tsx scripts/generate.ts",
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"prepublishOnly": "pnpm build"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"agent-os",
|
|
25
|
+
"sdk",
|
|
26
|
+
"ai",
|
|
27
|
+
"agents",
|
|
28
|
+
"typescript"
|
|
29
|
+
],
|
|
30
|
+
"author": "Agent OS Team",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/yuri12344/agent-os.git"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"openapi-fetch": "^0.13.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"openapi-typescript": "^7.4.0",
|
|
44
|
+
"tsx": "^4.19.0",
|
|
45
|
+
"typescript": "^5.5.0",
|
|
46
|
+
"vitest": "^4.0.18"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"src"
|
|
51
|
+
]
|
|
51
52
|
}
|
package/src/index.ts
CHANGED
|
@@ -115,7 +115,7 @@ export type { components, paths } from "./client/raw.js";
|
|
|
115
115
|
|
|
116
116
|
// Core modules
|
|
117
117
|
export { AgentsModule, type Agent, type AgentGraphResponse, type AgentListResponse, type AgentVersion } from "./modules/agents.js";
|
|
118
|
-
export { BuilderModule, type BuilderChatRequest, type BuilderChatResponse, type BuilderStreamEvent, type GraphUpdateAction } from "./modules/builder.js";
|
|
118
|
+
export { BuilderModule, type BuilderChatRequest, type BuilderChatResponse, type BuilderStreamEvent, type GraphUpdateAction, type HintModel, type HintTargetModel, type HintDataModel } from "./modules/builder.js";
|
|
119
119
|
export { CredentialsModule, type Credential, type CredentialListResponse, type CredentialType } from "./modules/credentials.js";
|
|
120
120
|
export { KnowledgeModule, type KnowledgeDataset, type KnowledgeSearchResponse } from "./modules/knowledge.js";
|
|
121
121
|
export { MembersModule, type Member, type MemberListResponse, type Role } from "./modules/members.js";
|
package/src/modules/builder.ts
CHANGED
|
@@ -41,37 +41,105 @@ export type ChatHistoryMessage = {
|
|
|
41
41
|
content: string;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Builder chat request.
|
|
46
|
+
*
|
|
47
|
+
* KERNEL-FIRST: Frontend sends INTENTION only.
|
|
48
|
+
* - Graph spec is loaded from artifact storage by CP
|
|
49
|
+
* - Catalogs are loaded from DB by CP
|
|
50
|
+
* - Frontend should NOT send graph_spec or catalogs
|
|
51
|
+
*/
|
|
44
52
|
export type BuilderChatRequest = {
|
|
53
|
+
/** Chat message/intention */
|
|
45
54
|
message: string;
|
|
46
|
-
|
|
55
|
+
/** Thread ID for conversation continuity */
|
|
47
56
|
thread_id?: string;
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
/** Optional ETag for concurrency control */
|
|
58
|
+
base_graph_etag?: string;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type HintTargetModel = {
|
|
62
|
+
node_id?: string;
|
|
63
|
+
edge_id?: string;
|
|
64
|
+
panel?: "credentials" | "triggers" | "logs" | "validation" | "deploy" | string;
|
|
65
|
+
action?: "create_credential" | "save_draft" | "publish_version" | string;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export type HintDataModel = {
|
|
69
|
+
// Credential hints
|
|
70
|
+
credential_slug?: string;
|
|
71
|
+
reason?: string;
|
|
72
|
+
|
|
73
|
+
// Config hints
|
|
74
|
+
fields?: string[];
|
|
75
|
+
|
|
76
|
+
// Error/validation hints
|
|
77
|
+
code?: string;
|
|
78
|
+
path?: string;
|
|
79
|
+
|
|
80
|
+
// Run/execution hints
|
|
81
|
+
run_id?: string;
|
|
82
|
+
error_code?: string;
|
|
83
|
+
|
|
84
|
+
// Cost/performance hints
|
|
85
|
+
tokens_in?: number;
|
|
86
|
+
tokens_out?: number;
|
|
87
|
+
usd_estimate?: number;
|
|
88
|
+
|
|
89
|
+
// Action hints
|
|
90
|
+
action_id?: string;
|
|
91
|
+
params?: Record<string, any>;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export type HintModel = {
|
|
95
|
+
id?: string;
|
|
96
|
+
scope: "graph" | "thread" | "run" | string;
|
|
97
|
+
type:
|
|
98
|
+
| "highlight_node"
|
|
99
|
+
| "needs_credential"
|
|
100
|
+
| "missing_config"
|
|
101
|
+
| "error_marker"
|
|
102
|
+
| "warning_marker"
|
|
103
|
+
| "toast"
|
|
104
|
+
| "run_started"
|
|
105
|
+
| "node_running"
|
|
106
|
+
| "node_failed"
|
|
107
|
+
| "rate_limited"
|
|
108
|
+
| "cost_estimate"
|
|
109
|
+
| "action_suggested"
|
|
110
|
+
| string;
|
|
111
|
+
severity: "info" | "warn" | "error" | "success";
|
|
112
|
+
target?: HintTargetModel;
|
|
113
|
+
message?: string;
|
|
114
|
+
ttl_ms?: number;
|
|
115
|
+
data?: HintDataModel;
|
|
54
116
|
};
|
|
55
117
|
|
|
56
118
|
export type GraphUpdateAction = {
|
|
119
|
+
// Legacy support
|
|
57
120
|
action: string;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
121
|
+
// ... legacy fields omitted for brevity, keeping strict new protocol
|
|
122
|
+
} | {
|
|
123
|
+
// New protocol (WAVE-3)
|
|
124
|
+
graph_spec: Record<string, unknown>;
|
|
125
|
+
hints?: HintModel[];
|
|
126
|
+
has_errors?: boolean;
|
|
63
127
|
};
|
|
64
128
|
|
|
65
129
|
export type BuilderStreamEvent =
|
|
66
130
|
| { type: "message"; data: { text: string } }
|
|
67
|
-
| { type: "
|
|
68
|
-
| { type: "
|
|
131
|
+
| { type: "validation"; data: { valid: boolean; errors: any[] } }
|
|
132
|
+
| { type: "graph_update"; data: { graph_spec: Record<string, unknown>; hints: HintModel[]; has_errors?: boolean } }
|
|
133
|
+
| { type: "done"; data: { response: string; thread_id: string } }
|
|
69
134
|
| { type: "error"; data: { error: string } };
|
|
70
135
|
|
|
71
136
|
export type BuilderChatResponse = {
|
|
72
137
|
response: string;
|
|
73
|
-
|
|
138
|
+
graph_spec?: Record<string, unknown>;
|
|
139
|
+
valid: boolean;
|
|
140
|
+
errors: any[];
|
|
74
141
|
thread_id: string;
|
|
142
|
+
hints: HintModel[];
|
|
75
143
|
};
|
|
76
144
|
|
|
77
145
|
export class BuilderModule {
|
|
@@ -176,14 +244,27 @@ export class BuilderModule {
|
|
|
176
244
|
request: BuilderChatRequest
|
|
177
245
|
): Promise<BuilderChatResponse> {
|
|
178
246
|
let fullResponse = "";
|
|
179
|
-
|
|
247
|
+
let lastGraphSpec: Record<string, unknown> | undefined;
|
|
248
|
+
let allHints: HintModel[] = [];
|
|
249
|
+
const allErrors: any[] = [];
|
|
180
250
|
let threadId = request.thread_id ?? "";
|
|
251
|
+
let isValid = true;
|
|
181
252
|
|
|
182
253
|
for await (const event of this.chat(agentId, request)) {
|
|
183
254
|
if (event.type === "message") {
|
|
184
255
|
fullResponse += event.data.text;
|
|
185
256
|
} else if (event.type === "graph_update") {
|
|
186
|
-
|
|
257
|
+
if ('graph_spec' in event.data) {
|
|
258
|
+
lastGraphSpec = event.data.graph_spec;
|
|
259
|
+
if (event.data.hints) {
|
|
260
|
+
allHints.push(...event.data.hints);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
} else if (event.type === "validation") {
|
|
264
|
+
isValid = event.data.valid;
|
|
265
|
+
if (event.data.errors) {
|
|
266
|
+
allErrors.push(...event.data.errors);
|
|
267
|
+
}
|
|
187
268
|
} else if (event.type === "done") {
|
|
188
269
|
threadId = event.data.thread_id;
|
|
189
270
|
}
|
|
@@ -191,7 +272,10 @@ export class BuilderModule {
|
|
|
191
272
|
|
|
192
273
|
return {
|
|
193
274
|
response: fullResponse,
|
|
194
|
-
|
|
275
|
+
graph_spec: lastGraphSpec,
|
|
276
|
+
hints: allHints,
|
|
277
|
+
valid: isValid,
|
|
278
|
+
errors: allErrors,
|
|
195
279
|
thread_id: threadId,
|
|
196
280
|
};
|
|
197
281
|
}
|