psadk 1.3.7 → 1.4.3

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 (136) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +150 -0
  3. package/build/main/index.d.ts +1 -0
  4. package/build/main/index.js +2 -1
  5. package/build/main/lib/PSAI.d.ts +16 -1
  6. package/build/main/lib/PSAI.js +264 -79
  7. package/build/main/lib/PSAgent.js +77 -60
  8. package/build/main/lib/PSAgentConfig.d.ts +3 -0
  9. package/build/main/lib/PSAgentLogger.js +12 -9
  10. package/build/main/lib/PSAgentTask.js +4 -1
  11. package/build/main/lib/PSAgentTool.js +12 -2
  12. package/build/main/lib/agent-core/agent-loop.d.ts +23 -0
  13. package/build/main/lib/agent-core/agent-loop.js +483 -0
  14. package/build/main/lib/agent-core/agent.d.ts +124 -0
  15. package/build/main/lib/agent-core/agent.js +419 -0
  16. package/build/main/lib/agent-core/harness/agent-harness.d.ts +84 -0
  17. package/build/main/lib/agent-core/harness/agent-harness.js +772 -0
  18. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  19. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  20. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  21. package/build/main/lib/agent-core/harness/compaction/compaction.js +637 -0
  22. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  23. package/build/main/lib/agent-core/harness/compaction/utils.js +153 -0
  24. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  25. package/build/main/lib/agent-core/harness/env/nodejs.js +353 -0
  26. package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -0
  27. package/build/main/lib/agent-core/harness/execution-env.js +3 -0
  28. package/build/main/lib/agent-core/harness/messages.d.ts +50 -0
  29. package/build/main/lib/agent-core/harness/messages.js +116 -0
  30. package/build/main/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  31. package/build/main/lib/agent-core/harness/prompt-templates.js +204 -0
  32. package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  33. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  34. package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  35. package/build/main/lib/agent-core/harness/session/repo/memory.js +46 -0
  36. package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  37. package/build/main/lib/agent-core/harness/session/repo/shared.js +31 -0
  38. package/build/main/lib/agent-core/harness/session/session.d.ts +31 -0
  39. package/build/main/lib/agent-core/harness/session/session.js +199 -0
  40. package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  41. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  42. package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  43. package/build/main/lib/agent-core/harness/session/storage/memory.js +94 -0
  44. package/build/main/lib/agent-core/harness/skills.d.ts +40 -0
  45. package/build/main/lib/agent-core/harness/skills.js +266 -0
  46. package/build/main/lib/agent-core/harness/system-prompt.d.ts +2 -0
  47. package/build/main/lib/agent-core/harness/system-prompt.js +30 -0
  48. package/build/main/lib/agent-core/harness/types.d.ts +524 -0
  49. package/build/main/lib/agent-core/harness/types.js +16 -0
  50. package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  51. package/build/main/lib/agent-core/harness/utils/shell-output.js +101 -0
  52. package/build/main/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  53. package/build/main/lib/agent-core/harness/utils/truncate.js +208 -0
  54. package/build/main/lib/agent-core/index.d.ts +19 -0
  55. package/build/main/lib/agent-core/index.js +25 -0
  56. package/build/main/lib/agent-core/package.json +3 -0
  57. package/build/main/lib/agent-core/proxy.d.ts +68 -0
  58. package/build/main/lib/agent-core/proxy.js +294 -0
  59. package/build/main/lib/agent-core/types.d.ts +385 -0
  60. package/build/main/lib/agent-core/types.js +2 -0
  61. package/build/main/lib/skills/constants.js +6 -4
  62. package/build/main/lib/skills/skillParser.js +2 -2
  63. package/build/main/lib/skills/utils.js +8 -10
  64. package/build/main/lib/tools/BraveWebSearchTool.js +4 -3
  65. package/build/main/lib/tools/PSArtifactTool.js +3 -3
  66. package/build/main/lib/tools/PSClarifyTool.js +3 -2
  67. package/build/main/lib/tools/PSCommandLineTool.js +8 -7
  68. package/build/main/lib/tools/PSMemoryTool.js +9 -7
  69. package/build/main/lib/tools/PSReadFileTool.js +3 -3
  70. package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
  71. package/build/main/lib/tools/PSRetrievalTool.js +172 -0
  72. package/build/main/lib/tools/PSSkillTool.js +6 -4
  73. package/build/main/lib/tools/PSSubAgentTool.js +4 -5
  74. package/build/main/lib/tools/PSWriteFileTool.js +3 -3
  75. package/build/main/lib/tools/TodoTool.js +8 -4
  76. package/build/main/lib/utils/helpers.d.ts +34 -0
  77. package/build/main/lib/utils/helpers.js +281 -13
  78. package/build/module/index.d.ts +1 -0
  79. package/build/module/index.js +2 -1
  80. package/build/module/lib/PSAI.d.ts +16 -1
  81. package/build/module/lib/PSAI.js +229 -85
  82. package/build/module/lib/PSAgentConfig.d.ts +3 -0
  83. package/build/module/lib/agent-core/agent-loop.d.ts +23 -0
  84. package/build/module/lib/agent-core/agent-loop.js +483 -0
  85. package/build/module/lib/agent-core/agent.d.ts +124 -0
  86. package/build/module/lib/agent-core/agent.js +419 -0
  87. package/build/module/lib/agent-core/harness/agent-harness.d.ts +84 -0
  88. package/build/module/lib/agent-core/harness/agent-harness.js +772 -0
  89. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  90. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  91. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  92. package/build/module/lib/agent-core/harness/compaction/compaction.js +637 -0
  93. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  94. package/build/module/lib/agent-core/harness/compaction/utils.js +153 -0
  95. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  96. package/build/module/lib/agent-core/harness/env/nodejs.js +353 -0
  97. package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -0
  98. package/build/module/lib/agent-core/harness/execution-env.js +3 -0
  99. package/build/module/lib/agent-core/harness/messages.d.ts +50 -0
  100. package/build/module/lib/agent-core/harness/messages.js +116 -0
  101. package/build/module/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  102. package/build/module/lib/agent-core/harness/prompt-templates.js +204 -0
  103. package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  104. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  105. package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  106. package/build/module/lib/agent-core/harness/session/repo/memory.js +46 -0
  107. package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  108. package/build/module/lib/agent-core/harness/session/repo/shared.js +31 -0
  109. package/build/module/lib/agent-core/harness/session/session.d.ts +31 -0
  110. package/build/module/lib/agent-core/harness/session/session.js +199 -0
  111. package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  112. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  113. package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  114. package/build/module/lib/agent-core/harness/session/storage/memory.js +94 -0
  115. package/build/module/lib/agent-core/harness/skills.d.ts +40 -0
  116. package/build/module/lib/agent-core/harness/skills.js +266 -0
  117. package/build/module/lib/agent-core/harness/system-prompt.d.ts +2 -0
  118. package/build/module/lib/agent-core/harness/system-prompt.js +30 -0
  119. package/build/module/lib/agent-core/harness/types.d.ts +524 -0
  120. package/build/module/lib/agent-core/harness/types.js +16 -0
  121. package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  122. package/build/module/lib/agent-core/harness/utils/shell-output.js +101 -0
  123. package/build/module/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  124. package/build/module/lib/agent-core/harness/utils/truncate.js +208 -0
  125. package/build/module/lib/agent-core/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/index.js +25 -0
  127. package/build/module/lib/agent-core/proxy.d.ts +68 -0
  128. package/build/module/lib/agent-core/proxy.js +294 -0
  129. package/build/module/lib/agent-core/types.d.ts +385 -0
  130. package/build/module/lib/agent-core/types.js +2 -0
  131. package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
  132. package/build/module/lib/tools/PSRetrievalTool.js +172 -0
  133. package/build/module/lib/tools/PSSkillTool.js +1 -1
  134. package/build/module/lib/utils/helpers.d.ts +34 -0
  135. package/build/module/lib/utils/helpers.js +280 -1
  136. package/package.json +20 -3
@@ -13,6 +13,7 @@ const PSAgentLogger_1 = require("./PSAgentLogger");
13
13
  const jwt_1 = require("./jwt");
14
14
  const apiEndpoints_1 = require("./utils/apiEndpoints");
15
15
  const debuglogger_1 = __importDefault(require("./utils/debuglogger"));
16
+ const helpers_1 = require("./utils/helpers");
16
17
  const fetch = (0, fetch_retry_1.default)(global.fetch);
17
18
  const dlog = (0, debuglogger_1.default)('PSAI:');
18
19
  const existingToken = {
@@ -21,8 +22,22 @@ const existingToken = {
21
22
  expires: new Date(0),
22
23
  service_expires: new Date(0),
23
24
  };
25
+ function updateExistingToken(accessToken, refreshToken) {
26
+ const accessPayload = jwt_1.JwtUtils.decode(accessToken);
27
+ const refreshPayload = jwt_1.JwtUtils.decode(refreshToken);
28
+ existingToken.service_token = accessToken;
29
+ existingToken.refresh_token = refreshToken;
30
+ existingToken.expires = new Date(refreshPayload?.exp * 1000);
31
+ existingToken.service_expires = new Date(accessPayload?.exp * 1000);
32
+ }
24
33
  // export default class AIHelper implements EmbeddingsInterface{
25
34
  class PSAI {
35
+ token;
36
+ dimensions;
37
+ baseUrl;
38
+ log;
39
+ clientid;
40
+ appToken;
26
41
  constructor(token, baseUrl, log, appToken) {
27
42
  this.token = token;
28
43
  this.baseUrl = baseUrl || process.env.PS_API_URL || '';
@@ -48,7 +63,14 @@ class PSAI {
48
63
  async embedQuery(text, embeddingModel = 'text-embedding-3-small') {
49
64
  const response = await fetch(apiEndpoints_1.API_ENDPOINTS.VECTOR_EMBEDDINGS(this.baseUrl), {
50
65
  method: 'POST',
51
- headers: Object.assign({ 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}`, 'x-client-id': this.clientid || '' }, (this.appToken ? { 'X-App-Authorization': `Bearer ${this.appToken}` } : {})),
66
+ headers: {
67
+ 'Content-Type': 'application/json',
68
+ Authorization: `Bearer ${this.token}`,
69
+ 'x-client-id': this.clientid || '',
70
+ ...(this.appToken
71
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
72
+ : {}),
73
+ },
52
74
  body: JSON.stringify({
53
75
  input: text,
54
76
  model: embeddingModel,
@@ -65,7 +87,14 @@ class PSAI {
65
87
  async embedDocuments(text, embeddingModel = 'text-embedding-3-small') {
66
88
  const response = await fetch(apiEndpoints_1.API_ENDPOINTS.VECTOR_EMBEDDINGS(this.baseUrl), {
67
89
  method: 'POST',
68
- headers: Object.assign({ 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}`, 'x-client-id': this.clientid || '' }, (this.appToken ? { 'X-App-Authorization': `Bearer ${this.appToken}` } : {})),
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ Authorization: `Bearer ${this.token}`,
93
+ 'x-client-id': this.clientid || '',
94
+ ...(this.appToken
95
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
96
+ : {}),
97
+ },
69
98
  body: JSON.stringify({
70
99
  input: text,
71
100
  model: embeddingModel,
@@ -80,27 +109,71 @@ class PSAI {
80
109
  return data.data.map((item) => item.embedding);
81
110
  }
82
111
  async getModels() {
83
- const lres = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/models'), {
84
- headers: Object.assign({ Authorization: `Bearer ${this.token}` }, (this.appToken ? { 'X-App-Authorization': `Bearer ${this.appToken}` } : {})),
112
+ const response = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/models'), {
113
+ headers: {
114
+ Authorization: `Bearer ${this.token}`,
115
+ ...(this.appToken
116
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
117
+ : {}),
118
+ },
85
119
  });
86
- if (!lres.ok) {
87
- this.log.error(`Failed to fetch LLM models: ${lres.status} ${lres.statusText}`);
120
+ if (!response.ok) {
121
+ this.log.error(`Failed to fetch LLM models: ${response.status} ${response.statusText}`);
88
122
  }
89
- const { data: models } = (await lres.json());
123
+ const { data: models } = (await response.json());
90
124
  return models;
91
125
  }
92
- async llm(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
126
+ prepareMessages(prompt, systemmsg, llm_config) {
127
+ const messages = [];
128
+ const enableCaching = llm_config?.enable_prompt_caching ?? false;
129
+ const cacheSystemPrompt = llm_config?.cache_system_prompt ?? true;
130
+ if (enableCaching && cacheSystemPrompt) {
131
+ messages.push({
132
+ role: 'system',
133
+ content: [
134
+ {
135
+ type: 'text',
136
+ text: systemmsg,
137
+ cache_control: { type: 'ephemeral' },
138
+ },
139
+ ],
140
+ });
141
+ }
142
+ else {
143
+ messages.push({ role: 'system', content: systemmsg });
144
+ }
145
+ messages.push({ role: 'user', content: prompt });
146
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
147
+ const { enable_prompt_caching, cache_system_prompt, ...apiConfig } = llm_config || {};
148
+ return { messages, apiConfig };
149
+ }
150
+ async llm(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config, transformCodexResponse = true) {
151
+ if (model.includes('codex')) {
152
+ const raw = await this.llmResponses(prompt, model, systemmsg, llm_config);
153
+ if (transformCodexResponse) {
154
+ return (0, helpers_1.convertResponseToChatCompletion)(raw);
155
+ }
156
+ return raw;
157
+ }
93
158
  const log = this.log;
94
159
  try {
160
+ const { messages, apiConfig } = this.prepareMessages(prompt, systemmsg, llm_config);
161
+ const body = JSON.stringify({
162
+ model,
163
+ messages,
164
+ stream: false,
165
+ ...apiConfig,
166
+ });
95
167
  const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/chat/completions'), {
96
168
  method: 'POST',
97
- headers: Object.assign({ 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` }, (this.appToken ? { 'X-App-Authorization': `Bearer ${this.appToken}` } : {})),
98
- body: JSON.stringify(Object.assign(Object.assign({ model, messages: [
99
- { role: 'system', content: systemmsg },
100
- { role: 'user', content: prompt },
101
- ] }, (llm_config || {})), { prompt_cache_key: model.includes('gpt-5')
102
- ? `cache_${model}_${Buffer.from(prompt).toString('base64')}`
103
- : undefined, prompt_cache_retention: model.includes('gpt-5') ? '24h' : undefined })),
169
+ headers: {
170
+ 'Content-Type': 'application/json',
171
+ Authorization: `Bearer ${this.token}`,
172
+ ...(this.appToken
173
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
174
+ : {}),
175
+ },
176
+ body,
104
177
  retries: 3,
105
178
  retryOn: function (attempt, error, response) {
106
179
  // retry on any network error, or 4xx or 5xx status codes
@@ -121,7 +194,7 @@ class PSAI {
121
194
  log.debug(errorData);
122
195
  throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${errorData}`);
123
196
  }
124
- catch (_a) {
197
+ catch {
125
198
  throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${await res.text()}`);
126
199
  }
127
200
  }
@@ -133,16 +206,33 @@ class PSAI {
133
206
  throw error;
134
207
  }
135
208
  }
136
- async llmStream(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
209
+ async llmStream(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config, transformCodexStream = true) {
210
+ if (model.includes('codex')) {
211
+ const raw = await this.llmResponsesStream(prompt, model, systemmsg, llm_config);
212
+ if (transformCodexStream) {
213
+ return (0, helpers_1.convertResponsesStreamToChatStream)(raw, model);
214
+ }
215
+ return raw;
216
+ }
137
217
  const log = this.log;
138
218
  try {
219
+ const { messages, apiConfig } = this.prepareMessages(prompt, systemmsg, llm_config);
220
+ const body = JSON.stringify({
221
+ model,
222
+ messages,
223
+ stream: true,
224
+ ...apiConfig,
225
+ });
139
226
  const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/chat/completions'), {
140
227
  method: 'POST',
141
- headers: Object.assign({ 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` }, (this.appToken ? { 'X-App-Authorization': `Bearer ${this.appToken}` } : {})),
142
- body: JSON.stringify(Object.assign({ model, messages: [
143
- { role: 'system', content: systemmsg },
144
- { role: 'user', content: prompt },
145
- ], stream: true }, (llm_config || {}))),
228
+ headers: {
229
+ 'Content-Type': 'application/json',
230
+ Authorization: `Bearer ${this.token}`,
231
+ ...(this.appToken
232
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
233
+ : {}),
234
+ },
235
+ body,
146
236
  retries: 3,
147
237
  retryOn: function (attempt, error, response) {
148
238
  // retry on any network error, or 4xx or 5xx status codes
@@ -163,7 +253,7 @@ class PSAI {
163
253
  log.debug(errorData);
164
254
  throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${errorData}`);
165
255
  }
166
- catch (_a) {
256
+ catch {
167
257
  throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${await res.text()}`);
168
258
  }
169
259
  }
@@ -180,59 +270,158 @@ class PSAI {
180
270
  throw error;
181
271
  }
182
272
  }
273
+ async llmResponses(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
274
+ const log = this.log;
275
+ try {
276
+ const { max_tokens, temperature, top_p } = llm_config ?? {};
277
+ const body = JSON.stringify({
278
+ model,
279
+ input: prompt,
280
+ instructions: systemmsg,
281
+ stream: false,
282
+ ...(max_tokens !== undefined && { max_output_tokens: max_tokens }),
283
+ ...(temperature !== undefined && { temperature }),
284
+ ...(top_p !== undefined && { top_p }),
285
+ });
286
+ const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/responses'), {
287
+ method: 'POST',
288
+ headers: {
289
+ 'Content-Type': 'application/json',
290
+ Authorization: `Bearer ${this.token}`,
291
+ ...(this.appToken
292
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
293
+ : {}),
294
+ },
295
+ body,
296
+ retries: 3,
297
+ retryOn: function (attempt, error, response) {
298
+ if (error !== null || (response.status >= 400 && attempt < 4)) {
299
+ log.warn(`retrying execute agent, attempt number ${attempt + 1}`);
300
+ return true;
301
+ }
302
+ return false;
303
+ },
304
+ retryDelay: function (attempt) {
305
+ return Math.pow(2, attempt) * 1000; // 1000, 2000, 4000
306
+ },
307
+ });
308
+ if (!res.ok) {
309
+ log.debug(`Failed to fetch LLM response: ${res.status} ${res.statusText}`);
310
+ try {
311
+ const errorData = await res.json();
312
+ log.debug(errorData);
313
+ throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${errorData}`);
314
+ }
315
+ catch {
316
+ throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${await res.text()}`);
317
+ }
318
+ }
319
+ const data = await res.json();
320
+ return data;
321
+ }
322
+ catch (error) {
323
+ log.debug('Error in llmResponses call:', error);
324
+ throw error;
325
+ }
326
+ }
327
+ async llmResponsesStream(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
328
+ const log = this.log;
329
+ try {
330
+ const { max_tokens, temperature, top_p } = llm_config ?? {};
331
+ const body = JSON.stringify({
332
+ model,
333
+ input: prompt,
334
+ instructions: systemmsg,
335
+ stream: true,
336
+ ...(max_tokens !== undefined && { max_output_tokens: max_tokens }),
337
+ ...(temperature !== undefined && { temperature }),
338
+ ...(top_p !== undefined && { top_p }),
339
+ });
340
+ const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/responses'), {
341
+ method: 'POST',
342
+ headers: {
343
+ 'Content-Type': 'application/json',
344
+ Authorization: `Bearer ${this.token}`,
345
+ ...(this.appToken
346
+ ? { 'X-App-Authorization': `Bearer ${this.appToken}` }
347
+ : {}),
348
+ },
349
+ body,
350
+ retries: 3,
351
+ retryOn: function (attempt, error, response) {
352
+ if (error !== null || (response.status >= 400 && attempt < 4)) {
353
+ log.warn(`retrying execute agent, attempt number ${attempt + 1}`);
354
+ return true;
355
+ }
356
+ return false;
357
+ },
358
+ retryDelay: function (attempt) {
359
+ return Math.pow(2, attempt) * 1000; // 1000, 2000, 4000
360
+ },
361
+ });
362
+ if (!res.ok) {
363
+ log.debug(`Failed to fetch LLM response: ${res.status} ${res.statusText}`);
364
+ try {
365
+ const errorData = await res.json();
366
+ log.debug(errorData);
367
+ throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${errorData}`);
368
+ }
369
+ catch {
370
+ throw new Error(`LLM call failed.\n\n status: ${res.status}, details: ${await res.text()}`);
371
+ }
372
+ }
373
+ //stream chunks as they arrive, converted to chat completions format
374
+ const data = res.body;
375
+ if (!data) {
376
+ log.error('No response body from LLM call');
377
+ throw new Error('No response body from LLM call');
378
+ }
379
+ return data;
380
+ }
381
+ catch (error) {
382
+ log.debug('Error in llmResponsesStream call:', error);
383
+ throw error;
384
+ }
385
+ }
183
386
  static async getServiceToken(options) {
184
387
  const { baseurl = process.env.PS_API_URL || '', appkey = process.env.PS_SVC_APP_KEY || '', clientid = process.env.PS_SVC_CLIENT_ID || '', clientsecret = process.env.PS_SVC_CLIENT_SECRET || '', } = options || {};
185
388
  if (!baseurl || !appkey || !clientid || !clientsecret) {
186
389
  throw new Error('Missing required environment variables for service token retrieval');
187
390
  }
188
391
  const currentTime = new Date();
189
- // Check if the existing token is still valid and expires after 20 minutes
190
- if (existingToken &&
191
- existingToken.service_token &&
192
- existingToken.service_expires.getTime() >
193
- currentTime.getTime() + 20 * 60000) {
392
+ const twentyMinutesFromNow = currentTime.getTime() + 20 * 60000;
393
+ if (existingToken.service_token &&
394
+ existingToken.service_expires.getTime() > twentyMinutesFromNow) {
194
395
  return existingToken.service_token;
195
396
  }
196
- const token = Buffer.from(`${clientid}:${clientsecret}`).toString('base64');
197
- if (existingToken && existingToken.expires > currentTime) {
397
+ const basicAuthToken = Buffer.from(`${clientid}:${clientsecret}`).toString('base64');
398
+ if (existingToken.expires > currentTime) {
198
399
  dlog.debug(`Found existing refresh token: ${existingToken.refresh_token}`);
199
- const tres = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/refreshtoken', '?client=machine'), {
400
+ const response = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/refreshtoken', '?client=machine'), {
200
401
  headers: {
201
- Authorization: `Basic ${token}`,
402
+ Authorization: `Basic ${basicAuthToken}`,
202
403
  'app-key': appkey || '',
203
404
  rt: existingToken.refresh_token || '',
204
405
  },
205
406
  });
206
- if (tres.ok) {
207
- const { accessToken, refreshToken } = (await tres.json());
208
- const spayload = jwt_1.JwtUtils.decode(accessToken);
209
- const rpayload = jwt_1.JwtUtils.decode(refreshToken);
210
- existingToken.service_token = accessToken;
211
- existingToken.refresh_token = refreshToken;
212
- existingToken.expires = new Date((rpayload === null || rpayload === void 0 ? void 0 : rpayload.exp) * 1000);
213
- existingToken.service_expires = new Date((spayload === null || spayload === void 0 ? void 0 : spayload.exp) * 1000);
407
+ if (response.ok) {
408
+ const { accessToken, refreshToken } = (await response.json());
409
+ updateExistingToken(accessToken, refreshToken);
214
410
  dlog.debug(`Refreshed service token: expires at ${existingToken.service_expires}`);
215
411
  return accessToken;
216
412
  }
217
- else {
218
- dlog.debug(`Failed to refresh service token, status: ${tres.status}`);
219
- }
413
+ dlog.debug(`Failed to refresh service token, status: ${response.status}`);
220
414
  }
221
- const tres = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/login', '?client=machine&source=custom'), {
415
+ const response = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/login', '?client=machine&source=custom'), {
222
416
  headers: {
223
- Authorization: `Basic ${token}`,
417
+ Authorization: `Basic ${basicAuthToken}`,
224
418
  'app-key': appkey || '',
225
419
  },
226
420
  });
227
- const { serviceToken, refreshToken } = (await tres.json());
228
- const spayload = jwt_1.JwtUtils.decode(serviceToken);
229
- const rpayload = jwt_1.JwtUtils.decode(refreshToken);
230
- dlog.debug(`service token expires: ${JSON.stringify(new Date((spayload === null || spayload === void 0 ? void 0 : spayload.exp) * 1000))}`);
231
- dlog.debug(`refresh token expires: ${JSON.stringify(new Date((rpayload === null || rpayload === void 0 ? void 0 : rpayload.exp) * 1000))}`);
232
- existingToken.service_token = serviceToken;
233
- existingToken.refresh_token = refreshToken;
234
- existingToken.expires = new Date((rpayload === null || rpayload === void 0 ? void 0 : rpayload.exp) * 1000);
235
- existingToken.service_expires = new Date((spayload === null || spayload === void 0 ? void 0 : spayload.exp) * 1000);
421
+ const { serviceToken, refreshToken } = (await response.json());
422
+ updateExistingToken(serviceToken, refreshToken);
423
+ dlog.debug(`service token expires: ${existingToken.service_expires}`);
424
+ dlog.debug(`refresh token expires: ${existingToken.expires}`);
236
425
  return serviceToken;
237
426
  }
238
427
  /**
@@ -242,7 +431,7 @@ class PSAI {
242
431
  * @throws error if any required values are missing or if authentication fails
243
432
  */
244
433
  static async getAuthToken(options) {
245
- const { baseurl = (options === null || options === void 0 ? void 0 : options.baseUrl) || process.env.PS_API_URL || '', appkey = (options === null || options === void 0 ? void 0 : options.appKey) || process.env.PS_APP_KEY || '', } = options || {};
434
+ const { baseurl = options?.baseUrl || process.env.PS_API_URL || '', appkey = options?.appKey || process.env.PS_APP_KEY || '', } = options || {};
246
435
  if (baseurl === '' || appkey === '') {
247
436
  throw new Error('Missing required values baseUrl & appKey or default environment variables PS_API_URL/PS_APP_KEY for access token retrieval');
248
437
  }
@@ -280,18 +469,18 @@ class PSAI {
280
469
  .send('Authentication successful! You can close this window.');
281
470
  });
282
471
  router.get('/login', async (_req, res) => {
283
- const rurl = encodeURIComponent('http://localhost:3133/callback');
284
- const loginUrl = `${baseurl}/api/v2/auth/login?client=desktop&redirect_url=${rurl}`;
285
- const lres = await fetch(loginUrl, {
472
+ const redirectUrl = encodeURIComponent('http://localhost:3133/callback');
473
+ const loginUrl = `${baseurl}/api/v2/auth/login?client=desktop&redirect_url=${redirectUrl}`;
474
+ const loginResponse = await fetch(loginUrl, {
286
475
  headers: { 'app-key': appkey || '' },
287
476
  });
288
- if (lres.status >= 400) {
289
- dlog.error(`Failed to initiate login: ${lres.status} ${lres.statusText}`);
290
- callBackError = `Failed to initiate login: ${lres.status} ${lres.statusText}`;
477
+ if (loginResponse.status >= 400) {
478
+ dlog.error(`Failed to initiate login: ${loginResponse.status} ${loginResponse.statusText}`);
479
+ callBackError = `Failed to initiate login: ${loginResponse.status} ${loginResponse.statusText}`;
291
480
  isCallbackFinished = true;
292
481
  return res.status(500).send('Failed to initiate login');
293
482
  }
294
- const data = lres.body;
483
+ const data = loginResponse.body;
295
484
  if (!data) {
296
485
  dlog.error('No response body from login initiation');
297
486
  callBackError = 'No response body from login initiation';
@@ -300,14 +489,14 @@ class PSAI {
300
489
  }
301
490
  const reader = data.getReader();
302
491
  const decoder = new TextDecoder('utf-8');
303
- let lresText = '';
492
+ let responseText = '';
304
493
  while (true) {
305
494
  const { done, value } = await reader.read();
306
495
  if (done)
307
496
  break;
308
- lresText += decoder.decode(value);
497
+ responseText += decoder.decode(value);
309
498
  }
310
- if (!lresText || lresText.length === 0) {
499
+ if (!responseText) {
311
500
  dlog.error('Empty response body from login initiation');
312
501
  callBackError = 'Empty response body from login initiation';
313
502
  isCallbackFinished = true;
@@ -316,7 +505,7 @@ class PSAI {
316
505
  .send('Empty response body from login initiation');
317
506
  }
318
507
  dlog.debug('Redirecting to authentication provider');
319
- return res.redirect(lresText);
508
+ return res.redirect(responseText);
320
509
  });
321
510
  app.use('', router);
322
511
  app
@@ -390,31 +579,27 @@ class PSAI {
390
579
  const model = req.params.modelid || 'o3-mini';
391
580
  try {
392
581
  let apiurl = baseapiurl || process.env.PS_API_URL;
393
- //remove trailing slash
394
- if (apiurl === null || apiurl === void 0 ? void 0 : apiurl.endsWith('/')) {
582
+ if (apiurl?.endsWith('/')) {
395
583
  apiurl = apiurl.slice(0, -1);
396
584
  }
397
585
  log.debug(`Proxying ${model} to ${apiurl}`);
398
- const lres = await fetch(`${apiurl}/api/v1/llm/chat/completions`, {
586
+ const proxyResponse = await fetch(`${apiurl}/api/v1/llm/chat/completions`, {
399
587
  method: 'POST',
400
588
  mode: 'no-cors',
401
589
  headers: callheaders,
402
- body: JSON.stringify(Object.assign({ model }, req.body)),
590
+ body: JSON.stringify({
591
+ model,
592
+ ...req.body,
593
+ }),
403
594
  });
404
- // if (!lres.ok) {
405
- // const data = await lres.json();
406
- // log.error(`LLM proxy error: ${lres.status} ${lres.statusText}`, data);
407
- // return res.status(lres.status).json(data);
408
- // }
409
- //pipe the lres response to res
410
- const data = lres.body;
595
+ const data = proxyResponse.body;
411
596
  if (!data) {
412
597
  log.error('No response body from LLM proxy');
413
598
  return res
414
599
  .status(500)
415
600
  .json({ error: 'No response body from LLM proxy' });
416
601
  }
417
- res.status(lres.status);
602
+ res.status(proxyResponse.status);
418
603
  const reader = data.getReader();
419
604
  const decoder = new TextDecoder('utf-8');
420
605
  while (true) {
@@ -436,4 +621,4 @@ class PSAI {
436
621
  }
437
622
  }
438
623
  exports.PSAI = PSAI;
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsb0VBQW9FO0FBQ3BFLHVFQUF1RTtBQUN2RSxzREFBcUQ7QUFDckQsOERBQXFDO0FBRXJDLG1EQUErRDtBQUMvRCwrQkFBK0M7QUFDL0MsdURBQXFEO0FBQ3JELHNFQUE4QztBQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUEscUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUVsQyxNQUFNLGFBQWEsR0FLZjtJQUNGLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGFBQWEsRUFBRSxJQUFJO0lBQ25CLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEIsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztDQUM3QixDQUFDO0FBRUYsZ0VBQWdFO0FBQ2hFLE1BQWEsSUFBSTtJQVFmLFlBQVksS0FBYSxFQUFFLE9BQWdCLEVBQUUsR0FBbUIsRUFBRSxRQUFpQjtRQUNqRixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQywwREFBMEQ7UUFDbEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSw2QkFBYSxDQUFDLEVBQUUsTUFBTSxF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
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsb0VBQW9FO0FBQ3BFLHVFQUF1RTtBQUN2RSxzREFBcUQ7QUFDckQsOERBQXFDO0FBRXJDLG1EQUErRDtBQUMvRCwrQkFBK0M7QUFDL0MsdURBQXFEO0FBQ3JELHNFQUE4QztBQUM5Qyw2Q0FHeUI7QUFFekIsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV2QyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFFbEMsTUFBTSxhQUFhLEdBS2Y7SUFDRixhQUFhLEVBQUUsSUFBSTtJQUNuQixhQUFhLEVBQUUsSUFBSTtJQUNuQixPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsbUJBQW1CLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtJQUNwRSxNQUFNLGFBQWEsR0FBRyxjQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBaUIsQ0FBQztJQUNuRSxNQUFNLGNBQWMsR0FBRyxjQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBaUIsQ0FBQztJQUNyRSxhQUFhLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztJQUMxQyxhQUFhLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztJQUMzQyxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0QsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RFLENBQUM7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