@octelium/console-agent 0.1.0-b-ca02.1.1
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/LICENSE +267 -0
- package/README.md +207 -0
- package/apis/octelium.binpb +0 -0
- package/dist/agent/pi/auth.d.ts +32 -0
- package/dist/agent/pi/auth.js +279 -0
- package/dist/agent/pi/auth.js.map +1 -0
- package/dist/agent/pi/backend.d.ts +77 -0
- package/dist/agent/pi/backend.js +518 -0
- package/dist/agent/pi/backend.js.map +1 -0
- package/dist/agent/pi/mapper.d.ts +33 -0
- package/dist/agent/pi/mapper.js +386 -0
- package/dist/agent/pi/mapper.js.map +1 -0
- package/dist/agent/pi/model.d.ts +47 -0
- package/dist/agent/pi/model.js +199 -0
- package/dist/agent/pi/model.js.map +1 -0
- package/dist/agent/prompt.d.ts +22 -0
- package/dist/agent/prompt.js +75 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/resources.d.ts +13 -0
- package/dist/agent/resources.js +78 -0
- package/dist/agent/resources.js.map +1 -0
- package/dist/agent/tools/builtin.d.ts +13 -0
- package/dist/agent/tools/builtin.js +80 -0
- package/dist/agent/tools/builtin.js.map +1 -0
- package/dist/agent/tools/octelium.d.ts +28 -0
- package/dist/agent/tools/octelium.js +236 -0
- package/dist/agent/tools/octelium.js.map +1 -0
- package/dist/agent/tools/present.d.ts +61 -0
- package/dist/agent/tools/present.js +273 -0
- package/dist/agent/tools/present.js.map +1 -0
- package/dist/agent/tools/util.d.ts +19 -0
- package/dist/agent/tools/util.js +103 -0
- package/dist/agent/tools/util.js.map +1 -0
- package/dist/agent/tools/web.d.ts +24 -0
- package/dist/agent/tools/web.js +237 -0
- package/dist/agent/tools/web.js.map +1 -0
- package/dist/agent/types.d.ts +60 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/app.d.ts +36 -0
- package/dist/app.js +126 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +249 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +159 -0
- package/dist/config.js +251 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +11 -0
- package/dist/log.js +41 -0
- package/dist/log.js.map +1 -0
- package/dist/octelium/catalog.d.ts +61 -0
- package/dist/octelium/catalog.js +595 -0
- package/dist/octelium/catalog.js.map +1 -0
- package/dist/octelium/client.d.ts +53 -0
- package/dist/octelium/client.js +201 -0
- package/dist/octelium/client.js.map +1 -0
- package/dist/octelium/search.d.ts +24 -0
- package/dist/octelium/search.js +211 -0
- package/dist/octelium/search.js.map +1 -0
- package/dist/protocol/index.d.ts +432 -0
- package/dist/protocol/index.js +44 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/runs/builder.d.ts +17 -0
- package/dist/runs/builder.js +81 -0
- package/dist/runs/builder.js.map +1 -0
- package/dist/runs/manager.d.ts +52 -0
- package/dist/runs/manager.js +536 -0
- package/dist/runs/manager.js.map +1 -0
- package/dist/server/http.d.ts +9 -0
- package/dist/server/http.js +100 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/server.d.ts +48 -0
- package/dist/server/server.js +483 -0
- package/dist/server/server.js.map +1 -0
- package/dist/skills.d.ts +4 -0
- package/dist/skills.js +69 -0
- package/dist/skills.js.map +1 -0
- package/dist/store/conversations.d.ts +26 -0
- package/dist/store/conversations.js +183 -0
- package/dist/store/conversations.js.map +1 -0
- package/dist/store/files.d.ts +27 -0
- package/dist/store/files.js +161 -0
- package/dist/store/files.js.map +1 -0
- package/dist/store/settings.d.ts +14 -0
- package/dist/store/settings.js +48 -0
- package/dist/store/settings.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type ChartSpec, type TableBlock, type TableColumn } from "../../protocol/index.ts";
|
|
3
|
+
import type { FileStore } from "../../store/files.ts";
|
|
4
|
+
import { type ToolDeps } from "./util.ts";
|
|
5
|
+
export declare const PRESENTATION_TOOL_NAMES: string[];
|
|
6
|
+
export declare const MAX_TABLE_ROWS = 500;
|
|
7
|
+
export declare const MAX_CHART_ROWS = 2000;
|
|
8
|
+
export declare const MAX_ARTIFACT_BYTES: number;
|
|
9
|
+
export declare const MAX_SNAPSHOTS = 50;
|
|
10
|
+
export declare const MAX_SNAPSHOT_CHARS: number;
|
|
11
|
+
export interface PresentToolDeps extends ToolDeps {
|
|
12
|
+
files: FileStore;
|
|
13
|
+
}
|
|
14
|
+
export declare const buildTable: (rows: Record<string, unknown>[], columns?: TableColumn[]) => Pick<TableBlock, "columns" | "rows" | "totalRows" | "truncated">;
|
|
15
|
+
export declare const buildChart: (spec: Omit<ChartSpec, "rows">, rows: Record<string, unknown>[]) => ChartSpec;
|
|
16
|
+
export declare const createPresentationTools: (deps: PresentToolDeps) => ((import("@earendil-works/pi-coding-agent").ToolDefinition<Type.TObject<{
|
|
17
|
+
title: Type.TOptional<Type.TString>;
|
|
18
|
+
caption: Type.TOptional<Type.TString>;
|
|
19
|
+
columns: Type.TOptional<Type.TArray<Type.TObject<{
|
|
20
|
+
key: Type.TString;
|
|
21
|
+
label: Type.TOptional<Type.TString>;
|
|
22
|
+
type: Type.TOptional<Type.TEnum<["string", "number", "boolean", "datetime", "json"]>>;
|
|
23
|
+
unit: Type.TOptional<Type.TString>;
|
|
24
|
+
}>>>;
|
|
25
|
+
rows: Type.TOptional<Type.TArray<Type.TObject<{}>>>;
|
|
26
|
+
dataPath: Type.TOptional<Type.TString>;
|
|
27
|
+
}>, import("../../protocol/index.ts").ToolDetails | undefined, any> & import("@earendil-works/pi-coding-agent").ToolDefinition<any, any, any>) | (import("@earendil-works/pi-coding-agent").ToolDefinition<Type.TObject<{
|
|
28
|
+
chartType: Type.TEnum<["line", "area", "bar", "pie", "scatter"]>;
|
|
29
|
+
title: Type.TOptional<Type.TString>;
|
|
30
|
+
description: Type.TOptional<Type.TString>;
|
|
31
|
+
x: Type.TObject<{
|
|
32
|
+
key: Type.TString;
|
|
33
|
+
label: Type.TOptional<Type.TString>;
|
|
34
|
+
type: Type.TOptional<Type.TEnum<["time", "category", "number"]>>;
|
|
35
|
+
}>;
|
|
36
|
+
y: Type.TOptional<Type.TObject<{
|
|
37
|
+
label: Type.TOptional<Type.TString>;
|
|
38
|
+
unit: Type.TOptional<Type.TString>;
|
|
39
|
+
}>>;
|
|
40
|
+
series: Type.TArray<Type.TObject<{
|
|
41
|
+
key: Type.TString;
|
|
42
|
+
label: Type.TOptional<Type.TString>;
|
|
43
|
+
unit: Type.TOptional<Type.TString>;
|
|
44
|
+
}>>;
|
|
45
|
+
stacked: Type.TOptional<Type.TBoolean>;
|
|
46
|
+
rows: Type.TOptional<Type.TArray<Type.TObject<{}>>>;
|
|
47
|
+
dataPath: Type.TOptional<Type.TString>;
|
|
48
|
+
}>, import("../../protocol/index.ts").ToolDetails | undefined, any> & import("@earendil-works/pi-coding-agent").ToolDefinition<any, any, any>) | (import("@earendil-works/pi-coding-agent").ToolDefinition<Type.TObject<{
|
|
49
|
+
title: Type.TOptional<Type.TString>;
|
|
50
|
+
resources: Type.TArray<Type.TObject<{
|
|
51
|
+
apiVersion: Type.TString;
|
|
52
|
+
kind: Type.TString;
|
|
53
|
+
name: Type.TString;
|
|
54
|
+
}>>;
|
|
55
|
+
}>, import("../../protocol/index.ts").ToolDetails | undefined, any> & import("@earendil-works/pi-coding-agent").ToolDefinition<any, any, any>) | (import("@earendil-works/pi-coding-agent").ToolDefinition<Type.TObject<{
|
|
56
|
+
path: Type.TString;
|
|
57
|
+
title: Type.TOptional<Type.TString>;
|
|
58
|
+
description: Type.TOptional<Type.TString>;
|
|
59
|
+
name: Type.TOptional<Type.TString>;
|
|
60
|
+
mimeType: Type.TOptional<Type.TString>;
|
|
61
|
+
}>, import("../../protocol/index.ts").ToolDetails | undefined, any> & import("@earendil-works/pi-coding-agent").ToolDefinition<any, any, any>))[];
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { defineTool } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
4
|
+
import { formatResourceURI, } from "../../protocol/index.js";
|
|
5
|
+
import { errorResult, readRowsFile, requireRunContext, resolvePath, textResult, } from "./util.js";
|
|
6
|
+
export const PRESENTATION_TOOL_NAMES = [
|
|
7
|
+
"present_table",
|
|
8
|
+
"present_chart",
|
|
9
|
+
"present_resources",
|
|
10
|
+
"publish_artifact",
|
|
11
|
+
];
|
|
12
|
+
export const MAX_TABLE_ROWS = 500;
|
|
13
|
+
export const MAX_CHART_ROWS = 2000;
|
|
14
|
+
export const MAX_ARTIFACT_BYTES = 512 * 1024 * 1024;
|
|
15
|
+
export const MAX_SNAPSHOTS = 50;
|
|
16
|
+
export const MAX_SNAPSHOT_CHARS = 16 * 1024;
|
|
17
|
+
const isRecord = (arg) => typeof arg === "object" && arg !== null && !Array.isArray(arg);
|
|
18
|
+
const loadRows = (deps, rows, dataPath) => {
|
|
19
|
+
if (dataPath) {
|
|
20
|
+
return readRowsFile(resolvePath(deps.workDir, dataPath));
|
|
21
|
+
}
|
|
22
|
+
return (rows ?? []);
|
|
23
|
+
};
|
|
24
|
+
const columnTypes = Type.Enum([
|
|
25
|
+
"string",
|
|
26
|
+
"number",
|
|
27
|
+
"boolean",
|
|
28
|
+
"datetime",
|
|
29
|
+
"json",
|
|
30
|
+
]);
|
|
31
|
+
const inferColumnType = (rows, key) => {
|
|
32
|
+
const values = rows
|
|
33
|
+
.slice(0, 50)
|
|
34
|
+
.map((row) => row[key])
|
|
35
|
+
.filter((v) => v !== undefined && v !== null && v !== "");
|
|
36
|
+
if (values.length === 0) {
|
|
37
|
+
return "string";
|
|
38
|
+
}
|
|
39
|
+
if (values.every((v) => typeof v === "number")) {
|
|
40
|
+
return "number";
|
|
41
|
+
}
|
|
42
|
+
if (values.every((v) => typeof v === "boolean")) {
|
|
43
|
+
return "boolean";
|
|
44
|
+
}
|
|
45
|
+
if (values.some((v) => typeof v === "object")) {
|
|
46
|
+
return "json";
|
|
47
|
+
}
|
|
48
|
+
if (values.every((v) => typeof v === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(v))) {
|
|
49
|
+
return "datetime";
|
|
50
|
+
}
|
|
51
|
+
return "string";
|
|
52
|
+
};
|
|
53
|
+
export const buildTable = (rows, columns) => {
|
|
54
|
+
if (!rows.every(isRecord)) {
|
|
55
|
+
throw new Error("Every row must be a JSON object");
|
|
56
|
+
}
|
|
57
|
+
const cols = columns && columns.length > 0
|
|
58
|
+
? columns
|
|
59
|
+
: [...new Set(rows.slice(0, 100).flatMap((row) => Object.keys(row)))].map((key) => ({ key }));
|
|
60
|
+
if (cols.length === 0) {
|
|
61
|
+
throw new Error("The table has no columns");
|
|
62
|
+
}
|
|
63
|
+
const resolved = cols.map((col) => ({
|
|
64
|
+
...col,
|
|
65
|
+
type: col.type ?? inferColumnType(rows, col.key),
|
|
66
|
+
}));
|
|
67
|
+
const shown = rows
|
|
68
|
+
.slice(0, MAX_TABLE_ROWS)
|
|
69
|
+
.map((row) => Object.fromEntries(resolved.map((col) => [col.key, row[col.key] ?? null])));
|
|
70
|
+
return {
|
|
71
|
+
columns: resolved,
|
|
72
|
+
rows: shown,
|
|
73
|
+
totalRows: rows.length,
|
|
74
|
+
truncated: rows.length > MAX_TABLE_ROWS || undefined,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
export const buildChart = (spec, rows) => {
|
|
78
|
+
if (!rows.every(isRecord)) {
|
|
79
|
+
throw new Error("Every row must be a JSON object");
|
|
80
|
+
}
|
|
81
|
+
if (rows.length === 0) {
|
|
82
|
+
throw new Error("The chart has no data rows");
|
|
83
|
+
}
|
|
84
|
+
if (spec.series.length === 0) {
|
|
85
|
+
throw new Error("The chart must have at least one series");
|
|
86
|
+
}
|
|
87
|
+
const keys = new Set(rows.slice(0, 100).flatMap((row) => Object.keys(row)));
|
|
88
|
+
const missing = [spec.x.key, ...spec.series.map((s) => s.key)].filter((key) => !keys.has(key));
|
|
89
|
+
if (missing.length > 0) {
|
|
90
|
+
throw new Error(`The rows do not contain the key(s): ${missing.join(", ")}. Available keys: ${[...keys].join(", ")}`);
|
|
91
|
+
}
|
|
92
|
+
const normalized = rows.slice(0, MAX_CHART_ROWS).map((row) => {
|
|
93
|
+
const ret = {};
|
|
94
|
+
const x = row[spec.x.key];
|
|
95
|
+
ret[spec.x.key] =
|
|
96
|
+
typeof x === "number" || typeof x === "string"
|
|
97
|
+
? x
|
|
98
|
+
: x == null
|
|
99
|
+
? null
|
|
100
|
+
: String(x);
|
|
101
|
+
for (const s of spec.series) {
|
|
102
|
+
const v = row[s.key];
|
|
103
|
+
const num = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
104
|
+
ret[s.key] = Number.isFinite(num) ? num : null;
|
|
105
|
+
}
|
|
106
|
+
return ret;
|
|
107
|
+
});
|
|
108
|
+
if (spec.series.every((s) => normalized.every((row) => row[s.key] === null))) {
|
|
109
|
+
throw new Error("The series values must be numeric");
|
|
110
|
+
}
|
|
111
|
+
return { ...spec, rows: normalized };
|
|
112
|
+
};
|
|
113
|
+
export const createPresentationTools = (deps) => {
|
|
114
|
+
const table = defineTool({
|
|
115
|
+
name: "present_table",
|
|
116
|
+
label: "Present table",
|
|
117
|
+
description: `Render a table in the User's chat UI. Prefer it over Markdown tables for more than a few rows or columns. Provide either "rows" (an array of objects) or "dataPath" (a JSON array, JSONL or CSV file). At most ${MAX_TABLE_ROWS} rows are shown.`,
|
|
118
|
+
parameters: Type.Object({
|
|
119
|
+
title: Type.Optional(Type.String()),
|
|
120
|
+
caption: Type.Optional(Type.String()),
|
|
121
|
+
columns: Type.Optional(Type.Array(Type.Object({
|
|
122
|
+
key: Type.String({
|
|
123
|
+
description: "The key of the value in each row",
|
|
124
|
+
}),
|
|
125
|
+
label: Type.Optional(Type.String()),
|
|
126
|
+
type: Type.Optional(columnTypes),
|
|
127
|
+
unit: Type.Optional(Type.String()),
|
|
128
|
+
}), {
|
|
129
|
+
description: "The columns to show. Inferred from the rows if omitted.",
|
|
130
|
+
})),
|
|
131
|
+
rows: Type.Optional(Type.Array(Type.Object({}, { additionalProperties: true }))),
|
|
132
|
+
dataPath: Type.Optional(Type.String({ description: "Path to a JSON, JSONL or CSV data file" })),
|
|
133
|
+
}),
|
|
134
|
+
async execute(_toolCallId, params) {
|
|
135
|
+
const ctx = requireRunContext(deps);
|
|
136
|
+
let result;
|
|
137
|
+
try {
|
|
138
|
+
result = buildTable(loadRows(deps, params.rows, params.dataPath), params.columns);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return errorResult(`Could not render the table: ${err.message}`);
|
|
142
|
+
}
|
|
143
|
+
const block = ctx.builder.addBlock({
|
|
144
|
+
type: "table",
|
|
145
|
+
title: params.title,
|
|
146
|
+
caption: params.caption,
|
|
147
|
+
...result,
|
|
148
|
+
});
|
|
149
|
+
return textResult(`Rendered a table (${result.totalRows} rows${result.truncated ? `, ${MAX_TABLE_ROWS} shown` : ""}) as block ${block.id}. Do not repeat its content in your answer.`);
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
const chart = defineTool({
|
|
153
|
+
name: "present_chart",
|
|
154
|
+
label: "Present chart",
|
|
155
|
+
description: `Render a chart in the User's chat UI (line, area, bar, pie or scatter). Each row is an object holding the x value under x.key and one numeric value per series key. For a pie chart, x.key is the category and the first series is the value. Provide either "rows" or "dataPath" (a JSON array, JSONL or CSV file). At most ${MAX_CHART_ROWS} rows are used.`,
|
|
156
|
+
parameters: Type.Object({
|
|
157
|
+
chartType: Type.Enum(["line", "area", "bar", "pie", "scatter"]),
|
|
158
|
+
title: Type.Optional(Type.String()),
|
|
159
|
+
description: Type.Optional(Type.String()),
|
|
160
|
+
x: Type.Object({
|
|
161
|
+
key: Type.String(),
|
|
162
|
+
label: Type.Optional(Type.String()),
|
|
163
|
+
type: Type.Optional(Type.Enum(["time", "category", "number"])),
|
|
164
|
+
}),
|
|
165
|
+
y: Type.Optional(Type.Object({
|
|
166
|
+
label: Type.Optional(Type.String()),
|
|
167
|
+
unit: Type.Optional(Type.String()),
|
|
168
|
+
})),
|
|
169
|
+
series: Type.Array(Type.Object({
|
|
170
|
+
key: Type.String(),
|
|
171
|
+
label: Type.Optional(Type.String()),
|
|
172
|
+
unit: Type.Optional(Type.String()),
|
|
173
|
+
}), { minItems: 1 }),
|
|
174
|
+
stacked: Type.Optional(Type.Boolean()),
|
|
175
|
+
rows: Type.Optional(Type.Array(Type.Object({}, { additionalProperties: true }))),
|
|
176
|
+
dataPath: Type.Optional(Type.String({ description: "Path to a JSON, JSONL or CSV data file" })),
|
|
177
|
+
}),
|
|
178
|
+
async execute(_toolCallId, params) {
|
|
179
|
+
const ctx = requireRunContext(deps);
|
|
180
|
+
let spec;
|
|
181
|
+
try {
|
|
182
|
+
const { rows, dataPath, ...rest } = params;
|
|
183
|
+
spec = buildChart(rest, loadRows(deps, rows, dataPath));
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
return errorResult(`Could not render the chart: ${err.message}`);
|
|
187
|
+
}
|
|
188
|
+
const block = ctx.builder.addBlock({
|
|
189
|
+
type: "chart",
|
|
190
|
+
chart: spec,
|
|
191
|
+
});
|
|
192
|
+
return textResult(`Rendered a ${spec.chartType} chart with ${spec.rows.length} data points as block ${block.id}.`);
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
const resources = defineTool({
|
|
196
|
+
name: "present_resources",
|
|
197
|
+
label: "Present resources",
|
|
198
|
+
description: "Show one or more Octelium/Cordium resources (e.g. Services, Users, Policies, Workspaces) as interactive items in the User's chat UI that link to their pages in the web console. Use the resources' apiVersion (e.g. core/v1, cordium/v1), kind and name exactly as returned by the APIs.",
|
|
199
|
+
parameters: Type.Object({
|
|
200
|
+
title: Type.Optional(Type.String()),
|
|
201
|
+
resources: Type.Array(Type.Object({
|
|
202
|
+
apiVersion: Type.String({ description: 'e.g. "core/v1"' }),
|
|
203
|
+
kind: Type.String({ description: 'e.g. "Service"' }),
|
|
204
|
+
name: Type.String(),
|
|
205
|
+
}), { minItems: 1, maxItems: 200 }),
|
|
206
|
+
}),
|
|
207
|
+
async execute(_toolCallId, params) {
|
|
208
|
+
const ctx = requireRunContext(deps);
|
|
209
|
+
const items = params.resources.map((ref, i) => {
|
|
210
|
+
const snapshot = i < MAX_SNAPSHOTS ? ctx.resources.get(ref) : undefined;
|
|
211
|
+
return {
|
|
212
|
+
ref,
|
|
213
|
+
uri: formatResourceURI(ref),
|
|
214
|
+
snapshot: snapshot && JSON.stringify(snapshot).length <= MAX_SNAPSHOT_CHARS
|
|
215
|
+
? snapshot
|
|
216
|
+
: undefined,
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const block = ctx.builder.addBlock({
|
|
220
|
+
type: "resources",
|
|
221
|
+
title: params.title,
|
|
222
|
+
resources: items,
|
|
223
|
+
});
|
|
224
|
+
return textResult(`Rendered ${items.length} resource(s) as block ${block.id}.`);
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
const artifact = defineTool({
|
|
228
|
+
name: "publish_artifact",
|
|
229
|
+
label: "Publish artifact",
|
|
230
|
+
description: "Publish a file that you created (e.g. a report, a CSV/JSON export, a YAML manifest, an image, an archive) so that the User can preview or download it from the chat UI. Write the file first, then publish it. Never paste large file contents into your answer.",
|
|
231
|
+
parameters: Type.Object({
|
|
232
|
+
path: Type.String({ description: "Path of the file to publish" }),
|
|
233
|
+
title: Type.Optional(Type.String()),
|
|
234
|
+
description: Type.Optional(Type.String()),
|
|
235
|
+
name: Type.Optional(Type.String({
|
|
236
|
+
description: "The download file name (defaults to the file's name)",
|
|
237
|
+
})),
|
|
238
|
+
mimeType: Type.Optional(Type.String()),
|
|
239
|
+
}),
|
|
240
|
+
async execute(_toolCallId, params) {
|
|
241
|
+
const ctx = requireRunContext(deps);
|
|
242
|
+
const filePath = resolvePath(deps.workDir, params.path);
|
|
243
|
+
let size;
|
|
244
|
+
try {
|
|
245
|
+
const stat = fs.statSync(filePath);
|
|
246
|
+
if (!stat.isFile()) {
|
|
247
|
+
return errorResult(`Not a regular file: ${filePath}`);
|
|
248
|
+
}
|
|
249
|
+
size = stat.size;
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
return errorResult(`Could not access ${filePath}: ${err.message}`);
|
|
253
|
+
}
|
|
254
|
+
if (size > MAX_ARTIFACT_BYTES) {
|
|
255
|
+
return errorResult(`The file is too large to be published (${size} bytes, the maximum is ${MAX_ARTIFACT_BYTES})`);
|
|
256
|
+
}
|
|
257
|
+
const info = deps.files.publishArtifact(filePath, {
|
|
258
|
+
name: params.name,
|
|
259
|
+
title: params.title,
|
|
260
|
+
description: params.description,
|
|
261
|
+
mimeType: params.mimeType,
|
|
262
|
+
conversationId: deps.conversationId,
|
|
263
|
+
});
|
|
264
|
+
const block = ctx.builder.addBlock({
|
|
265
|
+
type: "artifact",
|
|
266
|
+
artifact: info,
|
|
267
|
+
});
|
|
268
|
+
return textResult(`Published the artifact "${info.name}" (${info.size} bytes, ${info.mimeType}) as block ${block.id}.`);
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
return [table, chart, resources, artifact];
|
|
272
|
+
};
|
|
273
|
+
//# sourceMappingURL=present.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"present.js","sourceRoot":"","sources":["../../../src/agent/tools/present.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { ToolDetails } from "../../protocol/index.ts";
|
|
3
|
+
import type { ToolContextProvider, ToolRunContext } from "../types.ts";
|
|
4
|
+
export interface ToolDeps {
|
|
5
|
+
conversationId: string;
|
|
6
|
+
workDir: string;
|
|
7
|
+
runtime: ToolContextProvider;
|
|
8
|
+
}
|
|
9
|
+
export declare const textResult: (text: string, details?: ToolDetails, isError?: boolean) => AgentToolResult<ToolDetails | undefined>;
|
|
10
|
+
export declare const errorResult: (text: string, details?: ToolDetails) => AgentToolResult<ToolDetails | undefined>;
|
|
11
|
+
export declare const truncateText: (text: string, max: number) => {
|
|
12
|
+
text: string;
|
|
13
|
+
truncated: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const resolvePath: (workDir: string, p: string) => string;
|
|
16
|
+
export declare const requireRunContext: (deps: ToolDeps) => ToolRunContext;
|
|
17
|
+
export declare const writeJSONFile: (filePath: string, data: unknown) => void;
|
|
18
|
+
export declare const parseCSV: (text: string) => Record<string, string>[];
|
|
19
|
+
export declare const readRowsFile: (filePath: string) => Record<string, unknown>[];
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
export const textResult = (text, details, isError = false) => ({
|
|
4
|
+
content: [{ type: "text", text }],
|
|
5
|
+
details,
|
|
6
|
+
isError: isError || undefined,
|
|
7
|
+
});
|
|
8
|
+
export const errorResult = (text, details) => textResult(text, details, true);
|
|
9
|
+
export const truncateText = (text, max) => text.length <= max
|
|
10
|
+
? { text, truncated: false }
|
|
11
|
+
: { text: `${text.slice(0, max)}\n…[truncated]`, truncated: true };
|
|
12
|
+
export const resolvePath = (workDir, p) => path.resolve(workDir, p.startsWith("~/") ? path.join(process.env.HOME ?? "", p.slice(2)) : p);
|
|
13
|
+
export const requireRunContext = (deps) => {
|
|
14
|
+
const ctx = deps.runtime.current(deps.conversationId);
|
|
15
|
+
if (!ctx) {
|
|
16
|
+
throw new Error("This tool can only be used within an active run");
|
|
17
|
+
}
|
|
18
|
+
return ctx;
|
|
19
|
+
};
|
|
20
|
+
export const writeJSONFile = (filePath, data) => {
|
|
21
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
22
|
+
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`);
|
|
23
|
+
};
|
|
24
|
+
export const parseCSV = (text) => {
|
|
25
|
+
const rows = [];
|
|
26
|
+
let row = [];
|
|
27
|
+
let field = "";
|
|
28
|
+
let inQuotes = false;
|
|
29
|
+
for (let i = 0; i < text.length; i++) {
|
|
30
|
+
const c = text[i];
|
|
31
|
+
if (inQuotes) {
|
|
32
|
+
if (c === '"') {
|
|
33
|
+
if (text[i + 1] === '"') {
|
|
34
|
+
field += '"';
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
inQuotes = false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
field += c;
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (c === '"') {
|
|
47
|
+
inQuotes = true;
|
|
48
|
+
}
|
|
49
|
+
else if (c === ",") {
|
|
50
|
+
row.push(field);
|
|
51
|
+
field = "";
|
|
52
|
+
}
|
|
53
|
+
else if (c === "\n" || c === "\r") {
|
|
54
|
+
if (c === "\r" && text[i + 1] === "\n") {
|
|
55
|
+
i++;
|
|
56
|
+
}
|
|
57
|
+
row.push(field);
|
|
58
|
+
field = "";
|
|
59
|
+
if (row.some((v) => v !== "")) {
|
|
60
|
+
rows.push(row);
|
|
61
|
+
}
|
|
62
|
+
row = [];
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
field += c;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
row.push(field);
|
|
69
|
+
if (row.some((v) => v !== "")) {
|
|
70
|
+
rows.push(row);
|
|
71
|
+
}
|
|
72
|
+
const [header, ...data] = rows;
|
|
73
|
+
if (!header) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return data.map((values) => Object.fromEntries(header.map((key, i) => [key.trim(), values[i] ?? ""])));
|
|
77
|
+
};
|
|
78
|
+
export const readRowsFile = (filePath) => {
|
|
79
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
80
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
81
|
+
if (ext === ".csv") {
|
|
82
|
+
return parseCSV(raw);
|
|
83
|
+
}
|
|
84
|
+
if (ext === ".jsonl" || ext === ".ndjson") {
|
|
85
|
+
return raw
|
|
86
|
+
.split("\n")
|
|
87
|
+
.filter((line) => line.trim() !== "")
|
|
88
|
+
.map((line) => JSON.parse(line));
|
|
89
|
+
}
|
|
90
|
+
const parsed = JSON.parse(raw);
|
|
91
|
+
if (Array.isArray(parsed)) {
|
|
92
|
+
return parsed;
|
|
93
|
+
}
|
|
94
|
+
if (parsed && typeof parsed === "object") {
|
|
95
|
+
for (const key of ["rows", "items", "data", "results"]) {
|
|
96
|
+
if (Array.isArray(parsed[key])) {
|
|
97
|
+
return parsed[key];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
throw new Error("The data file must contain a JSON array of objects (or an object with a rows/items/data array), JSONL or CSV");
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/agent/tools/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { WebSearchConfig } from "../../config.ts";
|
|
3
|
+
import { type ToolDeps } from "./util.ts";
|
|
4
|
+
export declare const decodeEntities: (text: string) => string;
|
|
5
|
+
export declare const htmlToText: (html: string) => {
|
|
6
|
+
title?: string;
|
|
7
|
+
text: string;
|
|
8
|
+
};
|
|
9
|
+
export interface WebToolDeps extends ToolDeps {
|
|
10
|
+
webSearch?: WebSearchConfig;
|
|
11
|
+
fetchImpl?: typeof fetch;
|
|
12
|
+
}
|
|
13
|
+
interface SearchResult {
|
|
14
|
+
title: string;
|
|
15
|
+
url: string;
|
|
16
|
+
snippet: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const runWebSearch: (cfg: WebSearchConfig, query: string, count: number, signal: AbortSignal | undefined, fetchImpl?: typeof fetch) => Promise<SearchResult[]>;
|
|
19
|
+
export declare const createWebTools: (deps: WebToolDeps) => (import("@earendil-works/pi-coding-agent").ToolDefinition<Type.TObject<{
|
|
20
|
+
url: Type.TString;
|
|
21
|
+
maxChars: Type.TOptional<Type.TInteger>;
|
|
22
|
+
raw: Type.TOptional<Type.TBoolean>;
|
|
23
|
+
}>, import("../../index.ts").ToolDetails | undefined, any> & import("@earendil-works/pi-coding-agent").ToolDefinition<any, any, any>)[];
|
|
24
|
+
export {};
|