@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.
Files changed (97) hide show
  1. package/LICENSE +267 -0
  2. package/README.md +207 -0
  3. package/apis/octelium.binpb +0 -0
  4. package/dist/agent/pi/auth.d.ts +32 -0
  5. package/dist/agent/pi/auth.js +279 -0
  6. package/dist/agent/pi/auth.js.map +1 -0
  7. package/dist/agent/pi/backend.d.ts +77 -0
  8. package/dist/agent/pi/backend.js +518 -0
  9. package/dist/agent/pi/backend.js.map +1 -0
  10. package/dist/agent/pi/mapper.d.ts +33 -0
  11. package/dist/agent/pi/mapper.js +386 -0
  12. package/dist/agent/pi/mapper.js.map +1 -0
  13. package/dist/agent/pi/model.d.ts +47 -0
  14. package/dist/agent/pi/model.js +199 -0
  15. package/dist/agent/pi/model.js.map +1 -0
  16. package/dist/agent/prompt.d.ts +22 -0
  17. package/dist/agent/prompt.js +75 -0
  18. package/dist/agent/prompt.js.map +1 -0
  19. package/dist/agent/resources.d.ts +13 -0
  20. package/dist/agent/resources.js +78 -0
  21. package/dist/agent/resources.js.map +1 -0
  22. package/dist/agent/tools/builtin.d.ts +13 -0
  23. package/dist/agent/tools/builtin.js +80 -0
  24. package/dist/agent/tools/builtin.js.map +1 -0
  25. package/dist/agent/tools/octelium.d.ts +28 -0
  26. package/dist/agent/tools/octelium.js +236 -0
  27. package/dist/agent/tools/octelium.js.map +1 -0
  28. package/dist/agent/tools/present.d.ts +61 -0
  29. package/dist/agent/tools/present.js +273 -0
  30. package/dist/agent/tools/present.js.map +1 -0
  31. package/dist/agent/tools/util.d.ts +19 -0
  32. package/dist/agent/tools/util.js +103 -0
  33. package/dist/agent/tools/util.js.map +1 -0
  34. package/dist/agent/tools/web.d.ts +24 -0
  35. package/dist/agent/tools/web.js +237 -0
  36. package/dist/agent/tools/web.js.map +1 -0
  37. package/dist/agent/types.d.ts +60 -0
  38. package/dist/agent/types.js +2 -0
  39. package/dist/agent/types.js.map +1 -0
  40. package/dist/app.d.ts +36 -0
  41. package/dist/app.js +126 -0
  42. package/dist/app.js.map +1 -0
  43. package/dist/cli.d.ts +2 -0
  44. package/dist/cli.js +249 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +159 -0
  47. package/dist/config.js +251 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/errors.d.ts +13 -0
  50. package/dist/errors.js +18 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/index.d.ts +6 -0
  53. package/dist/index.js +6 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/log.d.ts +11 -0
  56. package/dist/log.js +41 -0
  57. package/dist/log.js.map +1 -0
  58. package/dist/octelium/catalog.d.ts +61 -0
  59. package/dist/octelium/catalog.js +595 -0
  60. package/dist/octelium/catalog.js.map +1 -0
  61. package/dist/octelium/client.d.ts +53 -0
  62. package/dist/octelium/client.js +201 -0
  63. package/dist/octelium/client.js.map +1 -0
  64. package/dist/octelium/search.d.ts +24 -0
  65. package/dist/octelium/search.js +211 -0
  66. package/dist/octelium/search.js.map +1 -0
  67. package/dist/protocol/index.d.ts +432 -0
  68. package/dist/protocol/index.js +44 -0
  69. package/dist/protocol/index.js.map +1 -0
  70. package/dist/runs/builder.d.ts +17 -0
  71. package/dist/runs/builder.js +81 -0
  72. package/dist/runs/builder.js.map +1 -0
  73. package/dist/runs/manager.d.ts +52 -0
  74. package/dist/runs/manager.js +536 -0
  75. package/dist/runs/manager.js.map +1 -0
  76. package/dist/server/http.d.ts +9 -0
  77. package/dist/server/http.js +100 -0
  78. package/dist/server/http.js.map +1 -0
  79. package/dist/server/server.d.ts +48 -0
  80. package/dist/server/server.js +483 -0
  81. package/dist/server/server.js.map +1 -0
  82. package/dist/skills.d.ts +4 -0
  83. package/dist/skills.js +69 -0
  84. package/dist/skills.js.map +1 -0
  85. package/dist/store/conversations.d.ts +26 -0
  86. package/dist/store/conversations.js +183 -0
  87. package/dist/store/conversations.js.map +1 -0
  88. package/dist/store/files.d.ts +27 -0
  89. package/dist/store/files.js +161 -0
  90. package/dist/store/files.js.map +1 -0
  91. package/dist/store/settings.d.ts +14 -0
  92. package/dist/store/settings.js +48 -0
  93. package/dist/store/settings.js.map +1 -0
  94. package/dist/version.d.ts +1 -0
  95. package/dist/version.js +11 -0
  96. package/dist/version.js.map +1 -0
  97. package/package.json +57 -0
@@ -0,0 +1,279 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { badRequest, conflict, notFound } from "../../errors.js";
5
+ const preferredSelections = {
6
+ anthropic: "copy_code",
7
+ };
8
+ const loginTTLMs = 15 * 60 * 1000;
9
+ const maxEvents = 50;
10
+ const maxAnswerLength = 8192;
11
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
12
+ export const toLoginEvent = (event) => {
13
+ switch (event.type) {
14
+ case "info":
15
+ return {
16
+ type: "info",
17
+ message: event.message,
18
+ links: event.links?.map((l) => ({ url: l.url, label: l.label })),
19
+ };
20
+ case "auth_url":
21
+ return {
22
+ type: "auth_url",
23
+ url: event.url,
24
+ instructions: event.instructions,
25
+ };
26
+ case "device_code":
27
+ return {
28
+ type: "device_code",
29
+ userCode: event.userCode,
30
+ verificationUri: event.verificationUri,
31
+ intervalSeconds: event.intervalSeconds,
32
+ expiresInSeconds: event.expiresInSeconds,
33
+ };
34
+ case "progress":
35
+ return { type: "progress", message: event.message };
36
+ }
37
+ };
38
+ export class AuthManager {
39
+ opts;
40
+ providers;
41
+ logins = new Map();
42
+ constructor(opts) {
43
+ this.opts = opts;
44
+ this.providers = opts.providers;
45
+ }
46
+ getDeviceId() {
47
+ const filePath = path.join(this.opts.dataDir, "device-id");
48
+ try {
49
+ const value = fs.readFileSync(filePath, "utf8").trim();
50
+ if (uuidPattern.test(value)) {
51
+ return value;
52
+ }
53
+ }
54
+ catch { }
55
+ const id = crypto.randomUUID();
56
+ fs.mkdirSync(this.opts.dataDir, { recursive: true, mode: 0o700 });
57
+ fs.writeFileSync(filePath, id, { mode: 0o600 });
58
+ return id;
59
+ }
60
+ async listProviders() {
61
+ const rt = this.opts.modelRuntime;
62
+ const ret = [];
63
+ for (const id of this.providers) {
64
+ const provider = rt.getProvider(id);
65
+ const oauth = provider?.auth.oauth;
66
+ if (!provider || !oauth) {
67
+ continue;
68
+ }
69
+ ret.push({
70
+ id,
71
+ name: oauth.name,
72
+ loginLabel: oauth.loginLabel,
73
+ subscription: !!oauth.isSubscription,
74
+ configured: rt.hasConfiguredAuth(id),
75
+ oauth: rt.isUsingOAuth(id),
76
+ });
77
+ }
78
+ return ret;
79
+ }
80
+ startLogin(req) {
81
+ const provider = this.opts.modelRuntime.getProvider(req.provider);
82
+ if (!this.providers.includes(req.provider) || !provider?.auth.oauth) {
83
+ throw badRequest(`Signing in is not supported for the provider "${req.provider}"`);
84
+ }
85
+ for (const entry of this.logins.values()) {
86
+ if (entry.session.provider === req.provider &&
87
+ entry.session.status === "pending") {
88
+ this.cancelLogin(entry.session.id);
89
+ }
90
+ }
91
+ const now = new Date().toISOString();
92
+ const id = crypto.randomUUID();
93
+ const entry = {
94
+ session: {
95
+ id,
96
+ provider: req.provider,
97
+ status: "pending",
98
+ events: [],
99
+ createdAt: now,
100
+ updatedAt: now,
101
+ },
102
+ controller: new AbortController(),
103
+ timer: setTimeout(() => this.expire(id), loginTTLMs),
104
+ };
105
+ entry.timer.unref();
106
+ this.logins.set(id, entry);
107
+ void this.runLogin(entry, req.selectModel ?? true);
108
+ return structuredClone(entry.session);
109
+ }
110
+ getLogin(id) {
111
+ const entry = this.logins.get(id);
112
+ return entry ? structuredClone(entry.session) : undefined;
113
+ }
114
+ answerLogin(id, promptId, value) {
115
+ const entry = this.logins.get(id);
116
+ if (!entry) {
117
+ throw notFound(`Login not found: ${id}`);
118
+ }
119
+ if (typeof value !== "string" || value.length > maxAnswerLength) {
120
+ throw badRequest('The "value" field must be a string');
121
+ }
122
+ if (entry.session.status !== "pending" ||
123
+ !entry.prompt ||
124
+ entry.prompt.id !== promptId) {
125
+ throw conflict("The prompt is not pending anymore");
126
+ }
127
+ entry.prompt.resolve(value);
128
+ return structuredClone(entry.session);
129
+ }
130
+ cancelLogin(id) {
131
+ const entry = this.logins.get(id);
132
+ if (!entry) {
133
+ throw notFound(`Login not found: ${id}`);
134
+ }
135
+ if (entry.session.status === "pending") {
136
+ entry.session.status = "cancelled";
137
+ this.touch(entry);
138
+ entry.controller.abort();
139
+ entry.prompt?.reject(new Error("The login was cancelled"));
140
+ }
141
+ return structuredClone(entry.session);
142
+ }
143
+ async logout(provider) {
144
+ if (!this.providers.includes(provider)) {
145
+ throw badRequest(`Signing out is not supported for the provider "${provider}"`);
146
+ }
147
+ await this.opts.modelRuntime.logout(provider);
148
+ await this.opts.onLogout?.(provider);
149
+ }
150
+ dispose() {
151
+ for (const entry of this.logins.values()) {
152
+ clearTimeout(entry.timer);
153
+ if (entry.session.status === "pending") {
154
+ this.cancelLogin(entry.session.id);
155
+ }
156
+ }
157
+ this.logins.clear();
158
+ }
159
+ touch(entry) {
160
+ entry.session.updatedAt = new Date().toISOString();
161
+ }
162
+ expire(id) {
163
+ const entry = this.logins.get(id);
164
+ if (!entry) {
165
+ return;
166
+ }
167
+ if (entry.session.status === "pending") {
168
+ this.cancelLogin(id);
169
+ }
170
+ this.logins.delete(id);
171
+ }
172
+ async runLogin(entry, selectModel) {
173
+ const { provider } = entry.session;
174
+ const interaction = {
175
+ signal: entry.controller.signal,
176
+ notify: (event) => {
177
+ entry.session.events.push(toLoginEvent(event));
178
+ if (entry.session.events.length > maxEvents) {
179
+ entry.session.events.splice(0, entry.session.events.length - maxEvents);
180
+ }
181
+ this.touch(entry);
182
+ },
183
+ prompt: (prompt) => this.prompt(entry, prompt),
184
+ };
185
+ try {
186
+ await this.opts.modelRuntime.login(provider, "oauth", interaction, {
187
+ getDeviceId: () => this.getDeviceId(),
188
+ });
189
+ if (entry.session.status !== "pending") {
190
+ return;
191
+ }
192
+ if (this.opts.onLogin) {
193
+ try {
194
+ entry.session.model = await this.opts.onLogin(provider, selectModel);
195
+ }
196
+ catch (err) {
197
+ this.opts.logger.warn("Could not select a model after signing in", {
198
+ provider,
199
+ error: err,
200
+ });
201
+ }
202
+ }
203
+ entry.session.status = "completed";
204
+ this.opts.logger.info("Signed in to the LLM provider", { provider });
205
+ }
206
+ catch (err) {
207
+ if (entry.session.status === "pending") {
208
+ entry.session.status = "failed";
209
+ entry.session.error = {
210
+ code: "login_failed",
211
+ message: err.message ?? String(err),
212
+ };
213
+ this.opts.logger.warn("Could not sign in to the LLM provider", {
214
+ provider,
215
+ error: err,
216
+ });
217
+ }
218
+ }
219
+ finally {
220
+ entry.prompt = undefined;
221
+ entry.session.prompt = undefined;
222
+ this.touch(entry);
223
+ }
224
+ }
225
+ prompt(entry, prompt) {
226
+ if (prompt.type === "select") {
227
+ const preferred = preferredSelections[entry.session.provider];
228
+ if (preferred && prompt.options.some((o) => o.id === preferred)) {
229
+ return Promise.resolve(preferred);
230
+ }
231
+ }
232
+ return new Promise((resolve, reject) => {
233
+ if (prompt.signal?.aborted || entry.controller.signal.aborted) {
234
+ reject(new Error("The prompt was cancelled"));
235
+ return;
236
+ }
237
+ const id = crypto.randomUUID();
238
+ const cleanup = () => {
239
+ prompt.signal?.removeEventListener("abort", onAbort);
240
+ if (entry.prompt?.id === id) {
241
+ entry.prompt = undefined;
242
+ entry.session.prompt = undefined;
243
+ this.touch(entry);
244
+ }
245
+ };
246
+ const onAbort = () => {
247
+ cleanup();
248
+ reject(new Error("The prompt was cancelled"));
249
+ };
250
+ prompt.signal?.addEventListener("abort", onAbort, { once: true });
251
+ entry.prompt = {
252
+ id,
253
+ resolve: (value) => {
254
+ cleanup();
255
+ resolve(value);
256
+ },
257
+ reject: (err) => {
258
+ cleanup();
259
+ reject(err);
260
+ },
261
+ };
262
+ entry.session.prompt = {
263
+ id,
264
+ type: prompt.type,
265
+ message: prompt.message,
266
+ placeholder: prompt.type === "select" ? undefined : prompt.placeholder,
267
+ options: prompt.type === "select"
268
+ ? prompt.options.map((o) => ({
269
+ id: o.id,
270
+ label: o.label,
271
+ description: o.description,
272
+ }))
273
+ : undefined,
274
+ };
275
+ this.touch(entry);
276
+ });
277
+ }
278
+ }
279
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/agent/pi/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { Api, Model } from "@earendil-works/pi-ai";
2
+ import { ModelRuntime } from "@earendil-works/pi-coding-agent";
3
+ import { type Config } from "../../config.ts";
4
+ import type { Logger } from "../../log.ts";
5
+ import type { APICatalog } from "../../octelium/catalog.ts";
6
+ import type { OcteliumClient } from "../../octelium/client.ts";
7
+ import type { ModelInfo, ModelsResponse, SetModelRequest } from "../../protocol/index.ts";
8
+ import type { ConversationStore } from "../../store/conversations.ts";
9
+ import type { FileStore } from "../../store/files.ts";
10
+ import type { AgentBackend, BackendRunContext, BackendRunInput, BackendRunResult, ToolContextProvider } from "../types.ts";
11
+ import { AuthManager } from "./auth.ts";
12
+ export declare const PREFERRED_MODELS: Record<string, string>;
13
+ export interface Identity {
14
+ user?: {
15
+ name?: string;
16
+ uid?: string;
17
+ displayName?: string;
18
+ };
19
+ workspace?: {
20
+ name?: string;
21
+ hostname?: string;
22
+ };
23
+ }
24
+ export interface PiBackendOptions {
25
+ config: Config;
26
+ catalog: APICatalog;
27
+ octelium: OcteliumClient;
28
+ octeliumUnavailableReason?: string;
29
+ runtime: ToolContextProvider;
30
+ store: ConversationStore;
31
+ files: FileStore;
32
+ logger: Logger;
33
+ skillPaths?: string[];
34
+ identity?: Identity;
35
+ modelRuntime?: ModelRuntime;
36
+ model?: Model<Api>;
37
+ }
38
+ export declare const formatBytes: (n: number) => string;
39
+ export declare class PiBackend implements AgentBackend {
40
+ model?: ModelInfo;
41
+ thinkingLevel?: string;
42
+ auth?: AuthManager;
43
+ private opts;
44
+ private settings;
45
+ private agentDir;
46
+ private modelRuntime?;
47
+ private resolvedModel?;
48
+ private modelError?;
49
+ private resolving?;
50
+ private sessions;
51
+ private pendingSessions;
52
+ private systemPrompt;
53
+ private toolNames;
54
+ private builtinTools;
55
+ constructor(opts: PiBackendOptions);
56
+ get issues(): string[];
57
+ init(): Promise<void>;
58
+ private promptContext;
59
+ get prompt(): string;
60
+ private ensureModel;
61
+ private resolveInitialModel;
62
+ listModels(): Promise<ModelsResponse>;
63
+ setModel(req: SetModelRequest): Promise<ModelsResponse>;
64
+ private applyModel;
65
+ private syncSession;
66
+ private onLogin;
67
+ private onLogout;
68
+ private createTools;
69
+ private getSession;
70
+ private createSession;
71
+ private scheduleIdle;
72
+ private buildPrompt;
73
+ run(input: BackendRunInput, ctx: BackendRunContext): Promise<BackendRunResult>;
74
+ generateTitle(text: string, signal?: AbortSignal): Promise<string | undefined>;
75
+ forgetConversation(conversationId: string): void;
76
+ dispose(): Promise<void>;
77
+ }