@taico/taico 0.7.0 → 0.8.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/README.md +1 -1
- package/dist/ai-providers/ai-model-selections.service.js +24 -2
- package/dist/ai-providers/ai-model-selections.service.js.map +1 -1
- package/dist/ai-providers/ai-provider-authorization-attempt.entity.d.ts +17 -0
- package/dist/ai-providers/ai-provider-authorization-attempt.entity.js +90 -0
- package/dist/ai-providers/ai-provider-authorization-attempt.entity.js.map +1 -0
- package/dist/ai-providers/ai-provider-connection.entity.d.ts +24 -0
- package/dist/ai-providers/ai-provider-connection.entity.js +131 -0
- package/dist/ai-providers/ai-provider-connection.entity.js.map +1 -0
- package/dist/ai-providers/ai-provider-connections.controller.d.ts +15 -0
- package/dist/ai-providers/ai-provider-connections.controller.js +167 -0
- package/dist/ai-providers/ai-provider-connections.controller.js.map +1 -0
- package/dist/ai-providers/ai-provider-models.service.d.ts +5 -2
- package/dist/ai-providers/ai-provider-models.service.js +44 -5
- package/dist/ai-providers/ai-provider-models.service.js.map +1 -1
- package/dist/ai-providers/ai-provider-models.service.spec.d.ts +1 -0
- package/dist/ai-providers/ai-provider-models.service.spec.js +110 -0
- package/dist/ai-providers/ai-provider-models.service.spec.js.map +1 -0
- package/dist/ai-providers/ai-provider.entity.d.ts +1 -0
- package/dist/ai-providers/ai-provider.entity.js +5 -0
- package/dist/ai-providers/ai-provider.entity.js.map +1 -1
- package/dist/ai-providers/ai-providers.controller.d.ts +1 -1
- package/dist/ai-providers/ai-providers.controller.js +4 -3
- package/dist/ai-providers/ai-providers.controller.js.map +1 -1
- package/dist/ai-providers/ai-providers.module.js +30 -4
- package/dist/ai-providers/ai-providers.module.js.map +1 -1
- package/dist/ai-providers/ai-providers.scopes.d.ts +4 -0
- package/dist/ai-providers/ai-providers.scopes.js +4 -0
- package/dist/ai-providers/ai-providers.scopes.js.map +1 -1
- package/dist/ai-providers/ai-providers.service.d.ts +3 -1
- package/dist/ai-providers/ai-providers.service.js +23 -3
- package/dist/ai-providers/ai-providers.service.js.map +1 -1
- package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.d.ts +50 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.js +607 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.d.ts +59 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.js +247 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.d.ts +21 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.js +298 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.d.ts +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.js +345 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.d.ts +16 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.js +26 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.d.ts +12 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.js +55 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.js.map +1 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.d.ts +15 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.js +78 -0
- package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.js.map +1 -0
- package/dist/ai-providers/dto/http/ai-provider-connection.dto.d.ts +30 -0
- package/dist/ai-providers/dto/http/ai-provider-connection.dto.js +182 -0
- package/dist/ai-providers/dto/http/ai-provider-connection.dto.js.map +1 -0
- package/dist/ai-providers/dto/service/ai-providers.service.types.d.ts +32 -1
- package/dist/ai-providers/enums/ai-model-job.enum.d.ts +3 -1
- package/dist/ai-providers/enums/ai-model-job.enum.js +10 -3
- package/dist/ai-providers/enums/ai-model-job.enum.js.map +1 -1
- package/dist/ai-providers/enums/ai-provider-connection-status.enum.d.ts +6 -0
- package/dist/ai-providers/enums/ai-provider-connection-status.enum.js +11 -0
- package/dist/ai-providers/enums/ai-provider-connection-status.enum.js.map +1 -0
- package/dist/ai-providers/enums/ai-provider-type.enum.d.ts +4 -1
- package/dist/ai-providers/enums/ai-provider-type.enum.js +9 -1
- package/dist/ai-providers/enums/ai-provider-type.enum.js.map +1 -1
- package/dist/ai-providers/enums/index.d.ts +1 -0
- package/dist/ai-providers/enums/index.js +1 -0
- package/dist/ai-providers/enums/index.js.map +1 -1
- package/dist/ai-providers/errors/ai-providers.errors.d.ts +33 -0
- package/dist/ai-providers/errors/ai-providers.errors.js +75 -4
- package/dist/ai-providers/errors/ai-providers.errors.js.map +1 -1
- package/dist/ai-providers/google-environment.d.ts +1 -0
- package/dist/ai-providers/google-environment.js +4 -0
- package/dist/ai-providers/google-environment.js.map +1 -1
- package/dist/app.module.js +6 -0
- package/dist/app.module.js.map +1 -1
- package/dist/config/env.config.d.ts +3 -0
- package/dist/config/env.config.js +17 -0
- package/dist/config/env.config.js.map +1 -1
- package/dist/errors/http/error-catalog.js +48 -0
- package/dist/errors/http/error-catalog.js.map +1 -1
- package/dist/migrations/1761600000000-AiProviderConnections.d.ts +6 -0
- package/dist/migrations/1761600000000-AiProviderConnections.js +61 -0
- package/dist/migrations/1761600000000-AiProviderConnections.js.map +1 -0
- package/dist/migrations/1761700000000-SplitSmallTasksSelection.d.ts +6 -0
- package/dist/migrations/1761700000000-SplitSmallTasksSelection.js +32 -0
- package/dist/migrations/1761700000000-SplitSmallTasksSelection.js.map +1 -0
- package/dist/migrations/1761800000000-ThreadTimers.d.ts +6 -0
- package/dist/migrations/1761800000000-ThreadTimers.js +22 -0
- package/dist/migrations/1761800000000-ThreadTimers.js.map +1 -0
- package/dist/public/assets/index-G5Ht4law.js +118 -0
- package/dist/public/assets/index-NjAtMwFI.css +1 -0
- package/dist/public/beta/assets/{index-tTf096QG.js → index-BO6PlAsO.js} +30 -30
- package/dist/public/beta/index.html +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/package.json +4 -4
- package/dist/search/index/search-embeddings.service.js +2 -0
- package/dist/search/index/search-embeddings.service.js.map +1 -1
- package/dist/secrets/secret-storage-format.d.ts +5 -0
- package/dist/secrets/secret-storage-format.js +101 -0
- package/dist/secrets/secret-storage-format.js.map +1 -0
- package/dist/secrets/secret-storage-format.spec.d.ts +1 -0
- package/dist/secrets/secret-storage-format.spec.js +32 -0
- package/dist/secrets/secret-storage-format.spec.js.map +1 -0
- package/dist/secrets/secrets-encryption.service.d.ts +1 -0
- package/dist/secrets/secrets-encryption.service.js +3 -0
- package/dist/secrets/secrets-encryption.service.js.map +1 -1
- package/dist/secrets/secrets.module.js +1 -1
- package/dist/secrets/secrets.module.js.map +1 -1
- package/dist/threads/agent/chat-model.factory.d.ts +6 -1
- package/dist/threads/agent/chat-model.factory.js +32 -8
- package/dist/threads/agent/chat-model.factory.js.map +1 -1
- package/dist/threads/agent/chat-model.factory.spec.js +143 -4
- package/dist/threads/agent/chat-model.factory.spec.js.map +1 -1
- package/dist/threads/agent/hooks/compaction.hook.d.ts +1 -0
- package/dist/threads/agent/hooks/compaction.hook.js +31 -7
- package/dist/threads/agent/hooks/compaction.hook.js.map +1 -1
- package/dist/threads/agent/hooks/hooks.spec.js +123 -0
- package/dist/threads/agent/hooks/hooks.spec.js.map +1 -1
- package/dist/threads/agent/thread-agent-log.service.d.ts +10 -0
- package/dist/threads/agent/thread-agent-log.service.js +57 -1
- package/dist/threads/agent/thread-agent-log.service.js.map +1 -1
- package/dist/threads/agent/thread-agent-tools.factory.d.ts +3 -1
- package/dist/threads/agent/thread-agent-tools.factory.js +195 -3
- package/dist/threads/agent/thread-agent-tools.factory.js.map +1 -1
- package/dist/threads/agent/thread-agent.prompts.d.ts +15 -0
- package/dist/threads/agent/thread-agent.prompts.js +29 -1
- package/dist/threads/agent/thread-agent.prompts.js.map +1 -1
- package/dist/threads/agent/thread-agent.service.js +10 -3
- package/dist/threads/agent/thread-agent.service.js.map +1 -1
- package/dist/threads/agent/thread-agent.service.spec.js +59 -4
- package/dist/threads/agent/thread-agent.service.spec.js.map +1 -1
- package/dist/threads/chat.service.d.ts +13 -1
- package/dist/threads/chat.service.js +77 -21
- package/dist/threads/chat.service.js.map +1 -1
- package/dist/threads/chat.service.spec.d.ts +1 -0
- package/dist/threads/chat.service.spec.js +150 -0
- package/dist/threads/chat.service.spec.js.map +1 -0
- package/dist/threads/dto/service/threads.service.types.d.ts +12 -0
- package/dist/threads/dto/thread-response.dto.d.ts +2 -0
- package/dist/threads/dto/thread-response.dto.js +10 -0
- package/dist/threads/dto/thread-response.dto.js.map +1 -1
- package/dist/threads/dto/thread-task-subscription-params.dto.d.ts +4 -0
- package/dist/threads/dto/thread-task-subscription-params.dto.js +28 -0
- package/dist/threads/dto/thread-task-subscription-params.dto.js.map +1 -0
- package/dist/threads/dto/thread-timer-params.dto.d.ts +4 -0
- package/dist/threads/dto/thread-timer-params.dto.js +28 -0
- package/dist/threads/dto/thread-timer-params.dto.js.map +1 -0
- package/dist/threads/dto/thread-timer-response.dto.d.ts +13 -0
- package/dist/threads/dto/thread-timer-response.dto.js +92 -0
- package/dist/threads/dto/thread-timer-response.dto.js.map +1 -0
- package/dist/threads/task-subscriptions/thread-task-subscriptions.service.d.ts +8 -0
- package/dist/threads/task-subscriptions/thread-task-subscriptions.service.js +14 -0
- package/dist/threads/task-subscriptions/thread-task-subscriptions.service.js.map +1 -1
- package/dist/threads/thread-state-reconciler.service.js +5 -0
- package/dist/threads/thread-state-reconciler.service.js.map +1 -1
- package/dist/threads/thread-state-reconciler.service.spec.d.ts +1 -0
- package/dist/threads/thread-state-reconciler.service.spec.js +44 -0
- package/dist/threads/thread-state-reconciler.service.spec.js.map +1 -0
- package/dist/threads/thread-title.service.d.ts +8 -2
- package/dist/threads/thread-title.service.js +18 -3
- package/dist/threads/thread-title.service.js.map +1 -1
- package/dist/threads/thread-title.service.spec.d.ts +1 -0
- package/dist/threads/thread-title.service.spec.js +59 -0
- package/dist/threads/thread-title.service.spec.js.map +1 -0
- package/dist/threads/threads.controller.d.ts +4 -0
- package/dist/threads/threads.controller.js +40 -0
- package/dist/threads/threads.controller.js.map +1 -1
- package/dist/threads/threads.module.js +8 -0
- package/dist/threads/threads.module.js.map +1 -1
- package/dist/threads/threads.service.d.ts +8 -1
- package/dist/threads/threads.service.js +39 -10
- package/dist/threads/threads.service.js.map +1 -1
- package/dist/threads/timers/thread-timer-firing.entity.d.ts +9 -0
- package/dist/threads/timers/thread-timer-firing.entity.js +54 -0
- package/dist/threads/timers/thread-timer-firing.entity.js.map +1 -0
- package/dist/threads/timers/thread-timer-sweeper.service.d.ts +11 -0
- package/dist/threads/timers/thread-timer-sweeper.service.js +62 -0
- package/dist/threads/timers/thread-timer-sweeper.service.js.map +1 -0
- package/dist/threads/timers/thread-timer.entity.d.ts +17 -0
- package/dist/threads/timers/thread-timer.entity.js +87 -0
- package/dist/threads/timers/thread-timer.entity.js.map +1 -0
- package/dist/threads/timers/thread-timer.enums.d.ts +4 -0
- package/dist/threads/timers/thread-timer.enums.js +9 -0
- package/dist/threads/timers/thread-timer.enums.js.map +1 -0
- package/dist/threads/timers/thread-timers.service.d.ts +26 -0
- package/dist/threads/timers/thread-timers.service.js +130 -0
- package/dist/threads/timers/thread-timers.service.js.map +1 -0
- package/dist/threads/timers/timer-input.d.ts +13 -0
- package/dist/threads/timers/timer-input.js +159 -0
- package/dist/threads/timers/timer-input.js.map +1 -0
- package/dist/threads/timers/timer-input.spec.d.ts +1 -0
- package/dist/threads/timers/timer-input.spec.js +92 -0
- package/dist/threads/timers/timer-input.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/dist/public/assets/index-ChunDgwd.css +0 -1
- package/dist/public/assets/index-DRkJsm_M.js +0 -118
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
<link rel="icon" type="image/svg+xml" href="/beta/roo-favicon.svg" />
|
|
20
20
|
<title>taico — Home</title>
|
|
21
|
-
<script type="module" crossorigin src="/beta/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/beta/assets/index-BO6PlAsO.js"></script>
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/beta/assets/index-DIzh0pTC.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
package/dist/public/index.html
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
19
19
|
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
|
20
20
|
<title>taico</title>
|
|
21
|
-
<script type="module" crossorigin src="/assets/index-
|
|
22
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/assets/index-G5Ht4law.js"></script>
|
|
22
|
+
<link rel="stylesheet" crossorigin href="/assets/index-NjAtMwFI.css">
|
|
23
23
|
</head>
|
|
24
24
|
|
|
25
25
|
<body>
|
package/dist/public/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taico/ui",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite",
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
15
|
-
"@taico/client": "^0.
|
|
16
|
-
"@taico/events": "^0.
|
|
17
|
-
"@taico/shared": "^0.
|
|
15
|
+
"@taico/client": "^0.8.0",
|
|
16
|
+
"@taico/events": "^0.8.0",
|
|
17
|
+
"@taico/shared": "^0.8.0",
|
|
18
18
|
"lucide-react": "^1.11.0",
|
|
19
19
|
"marked-react": "^4.0.0",
|
|
20
20
|
"react": "^19.2.0",
|
|
@@ -110,6 +110,8 @@ function buildEmbeddingModel(config, modelId) {
|
|
|
110
110
|
return null;
|
|
111
111
|
}
|
|
112
112
|
return (0, openai_compatible_1.createOpenAICompatible)({ name: config.type, baseURL, apiKey }).textEmbeddingModel(modelId);
|
|
113
|
+
case enums_1.AiProviderType.CHATGPT_SUBSCRIPTION:
|
|
114
|
+
return null;
|
|
113
115
|
}
|
|
114
116
|
}
|
|
115
117
|
//# sourceMappingURL=search-embeddings.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-embeddings.service.js","sourceRoot":"","sources":["../../../src/search/index/search-embeddings.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"search-embeddings.service.js","sourceRoot":"","sources":["../../../src/search/index/search-embeddings.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type StoredSecretClassification = 'encrypted' | 'plaintext' | 'ambiguous';
|
|
2
|
+
export declare function parseKeyHex(keyHex: string): Buffer;
|
|
3
|
+
export declare function decryptEnvelope(value: string, key: Buffer): string;
|
|
4
|
+
export declare function encryptEnvelope(plaintext: string, key: Buffer): string;
|
|
5
|
+
export declare function classifyStoredSecret(stored: string, key: Buffer): StoredSecretClassification;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseKeyHex = parseKeyHex;
|
|
37
|
+
exports.decryptEnvelope = decryptEnvelope;
|
|
38
|
+
exports.encryptEnvelope = encryptEnvelope;
|
|
39
|
+
exports.classifyStoredSecret = classifyStoredSecret;
|
|
40
|
+
const crypto = __importStar(require("crypto"));
|
|
41
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
42
|
+
const IV_LENGTH = 12;
|
|
43
|
+
const TAG_LENGTH = 16;
|
|
44
|
+
const KEY_LENGTH = 32;
|
|
45
|
+
function parseKeyHex(keyHex) {
|
|
46
|
+
if (!/^[0-9a-fA-F]{64}$/.test(keyHex)) {
|
|
47
|
+
throw new Error(`Encryption key must be ${KEY_LENGTH * 2} hex characters (${KEY_LENGTH} bytes).`);
|
|
48
|
+
}
|
|
49
|
+
return Buffer.from(keyHex, 'hex');
|
|
50
|
+
}
|
|
51
|
+
function isCanonicalBase64(value) {
|
|
52
|
+
return Buffer.from(value, 'base64').toString('base64') === value;
|
|
53
|
+
}
|
|
54
|
+
function hasEnvelopeShape(value) {
|
|
55
|
+
const parts = value.split(':');
|
|
56
|
+
if (parts.length !== 3)
|
|
57
|
+
return false;
|
|
58
|
+
const [iv, tag, ciphertext] = parts;
|
|
59
|
+
if (!isCanonicalBase64(iv) || !isCanonicalBase64(tag))
|
|
60
|
+
return false;
|
|
61
|
+
if (!isCanonicalBase64(ciphertext))
|
|
62
|
+
return false;
|
|
63
|
+
return (Buffer.from(iv, 'base64').length === IV_LENGTH &&
|
|
64
|
+
Buffer.from(tag, 'base64').length === TAG_LENGTH);
|
|
65
|
+
}
|
|
66
|
+
function decryptEnvelope(value, key) {
|
|
67
|
+
const [ivB64, tagB64, ciphertextB64] = value.split(':');
|
|
68
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, Buffer.from(ivB64, 'base64'), { authTagLength: TAG_LENGTH });
|
|
69
|
+
decipher.setAuthTag(Buffer.from(tagB64, 'base64'));
|
|
70
|
+
return Buffer.concat([
|
|
71
|
+
decipher.update(Buffer.from(ciphertextB64, 'base64')),
|
|
72
|
+
decipher.final(),
|
|
73
|
+
]).toString('utf8');
|
|
74
|
+
}
|
|
75
|
+
function encryptEnvelope(plaintext, key) {
|
|
76
|
+
const iv = crypto.randomBytes(IV_LENGTH);
|
|
77
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv, {
|
|
78
|
+
authTagLength: TAG_LENGTH,
|
|
79
|
+
});
|
|
80
|
+
const ciphertext = Buffer.concat([
|
|
81
|
+
cipher.update(plaintext, 'utf8'),
|
|
82
|
+
cipher.final(),
|
|
83
|
+
]);
|
|
84
|
+
return [
|
|
85
|
+
iv.toString('base64'),
|
|
86
|
+
cipher.getAuthTag().toString('base64'),
|
|
87
|
+
ciphertext.toString('base64'),
|
|
88
|
+
].join(':');
|
|
89
|
+
}
|
|
90
|
+
function classifyStoredSecret(stored, key) {
|
|
91
|
+
if (!hasEnvelopeShape(stored))
|
|
92
|
+
return 'plaintext';
|
|
93
|
+
try {
|
|
94
|
+
decryptEnvelope(stored, key);
|
|
95
|
+
return 'encrypted';
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 'ambiguous';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=secret-storage-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-storage-format.js","sourceRoot":"","sources":["../../src/secrets/secret-storage-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const secret_storage_format_1 = require("./secret-storage-format");
|
|
4
|
+
describe('secret-storage-format', () => {
|
|
5
|
+
const key = (0, secret_storage_format_1.parseKeyHex)('11'.repeat(32));
|
|
6
|
+
const otherKey = (0, secret_storage_format_1.parseKeyHex)('22'.repeat(32));
|
|
7
|
+
it('round-trips with the envelope format', () => {
|
|
8
|
+
const encrypted = (0, secret_storage_format_1.encryptEnvelope)('sk-test-value', key);
|
|
9
|
+
expect(encrypted.split(':')).toHaveLength(3);
|
|
10
|
+
expect((0, secret_storage_format_1.decryptEnvelope)(encrypted, key)).toBe('sk-test-value');
|
|
11
|
+
});
|
|
12
|
+
it('classifies a freshly encrypted value as encrypted', () => {
|
|
13
|
+
expect((0, secret_storage_format_1.classifyStoredSecret)((0, secret_storage_format_1.encryptEnvelope)('x', key), key)).toBe('encrypted');
|
|
14
|
+
});
|
|
15
|
+
it('classifies ordinary API keys as plaintext', () => {
|
|
16
|
+
expect((0, secret_storage_format_1.classifyStoredSecret)('sk-proj-abc123', key)).toBe('plaintext');
|
|
17
|
+
expect((0, secret_storage_format_1.classifyStoredSecret)('a:b:c', key)).toBe('plaintext');
|
|
18
|
+
});
|
|
19
|
+
it('flags envelope-shaped values that do not authenticate as ambiguous', () => {
|
|
20
|
+
const encryptedWithOtherKey = (0, secret_storage_format_1.encryptEnvelope)('x', otherKey);
|
|
21
|
+
expect((0, secret_storage_format_1.classifyStoredSecret)(encryptedWithOtherKey, key)).toBe('ambiguous');
|
|
22
|
+
const iv = Buffer.alloc(12, 1).toString('base64');
|
|
23
|
+
const tag = Buffer.alloc(16, 2).toString('base64');
|
|
24
|
+
const ct = Buffer.from('not-real').toString('base64');
|
|
25
|
+
expect((0, secret_storage_format_1.classifyStoredSecret)(`${iv}:${tag}:${ct}`, key)).toBe('ambiguous');
|
|
26
|
+
});
|
|
27
|
+
it('rejects keys that are not 32 bytes of hex', () => {
|
|
28
|
+
expect(() => (0, secret_storage_format_1.parseKeyHex)('abc')).toThrow();
|
|
29
|
+
expect(() => (0, secret_storage_format_1.parseKeyHex)('zz'.repeat(32))).toThrow();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=secret-storage-format.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-storage-format.spec.js","sourceRoot":"","sources":["../../src/secrets/secret-storage-format.spec.ts"],"names":[],"mappings":";;AAAA,mEAKiC;AAEjC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,GAAG,GAAG,IAAA,mCAAW,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAA,mCAAW,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,SAAS,GAAG,IAAA,uCAAe,EAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAA,uCAAe,EAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,IAAA,4CAAoB,EAAC,IAAA,uCAAe,EAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAC/D,WAAW,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,IAAA,4CAAoB,EAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,CAAC,IAAA,4CAAoB,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,qBAAqB,GAAG,IAAA,uCAAe,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAA,4CAAoB,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3E,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,IAAA,4CAAoB,EAAC,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,mCAAW,EAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,mCAAW,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -88,6 +88,9 @@ let SecretsEncryptionService = SecretsEncryptionService_1 = class SecretsEncrypt
|
|
|
88
88
|
`If using encryption, set SECRETS_ENCRYPTION_KEY to a ${KEY_LENGTH * 2}-character hex string (${KEY_LENGTH} bytes).`);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
isEncrypting() {
|
|
92
|
+
return this.key !== null;
|
|
93
|
+
}
|
|
91
94
|
assertEnabled() {
|
|
92
95
|
if (!this.key && !this.allowPlaintextStorage) {
|
|
93
96
|
throw new secrets_errors_1.SecretsFeatureDisabledError();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets-encryption.service.js","sourceRoot":"","sources":["../../src/secrets/secrets-encryption.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"secrets-encryption.service.js","sourceRoot":"","sources":["../../src/secrets/secrets-encryption.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ exports.SecretsModule = SecretsModule = __decorate([
|
|
|
25
25
|
],
|
|
26
26
|
controllers: [secrets_controller_1.SecretsController],
|
|
27
27
|
providers: [secrets_service_1.SecretsService, secrets_encryption_service_1.SecretsEncryptionService],
|
|
28
|
-
exports: [secrets_service_1.SecretsService],
|
|
28
|
+
exports: [secrets_service_1.SecretsService, secrets_encryption_service_1.SecretsEncryptionService],
|
|
29
29
|
})
|
|
30
30
|
], SecretsModule);
|
|
31
31
|
//# sourceMappingURL=secrets.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.module.js","sourceRoot":"","sources":["../../src/secrets/secrets.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,mDAA+C;AAC/C,uDAAmD;AACnD,6DAAyD;AACzD,6EAAwE;AACxE,0EAAqE;AAW9D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IATzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC,CAAC,4BAAY,CAAC,CAAC;YACxC,qCAAgB;SACjB;QACD,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,EAAE,qDAAwB,CAAC;QACrD,OAAO,EAAE,CAAC,gCAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"secrets.module.js","sourceRoot":"","sources":["../../src/secrets/secrets.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAAgD;AAChD,mDAA+C;AAC/C,uDAAmD;AACnD,6DAAyD;AACzD,6EAAwE;AACxE,0EAAqE;AAW9D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IATzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC,CAAC,4BAAY,CAAC,CAAC;YACxC,qCAAgB;SACjB;QACD,WAAW,EAAE,CAAC,sCAAiB,CAAC;QAChC,SAAS,EAAE,CAAC,gCAAc,EAAE,qDAAwB,CAAC;QACrD,OAAO,EAAE,CAAC,gCAAc,EAAE,qDAAwB,CAAC;KACpD,CAAC;GACW,aAAa,CAAG"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { LanguageModel } from 'ai';
|
|
2
2
|
import { AiProvidersService } from "../../ai-providers/ai-providers.service";
|
|
3
|
+
import { OnBehalfOf } from "../../ai-providers/dto/service/ai-providers.service.types";
|
|
4
|
+
import { ChatgptSubscriptionService } from "../../ai-providers/chatgpt-subscription/chatgpt-subscription.service";
|
|
3
5
|
import { AiModelSelectionsService } from "../../ai-providers/ai-model-selections.service";
|
|
4
6
|
import { AiModelJob } from "../../ai-providers/enums";
|
|
5
7
|
type ProviderOptions = Record<string, Record<string, string | number | boolean | null>>;
|
|
@@ -8,16 +10,19 @@ export type ResolvedChatModel = {
|
|
|
8
10
|
providerType: string;
|
|
9
11
|
modelId: string;
|
|
10
12
|
providerOptions?: ProviderOptions;
|
|
13
|
+
requiresStreaming?: boolean;
|
|
11
14
|
};
|
|
12
15
|
export type ResolveChatModelInput = {
|
|
13
16
|
job: AiModelJob;
|
|
14
17
|
aiProviderId?: string | null;
|
|
15
18
|
modelId?: string | null;
|
|
19
|
+
onBehalfOf?: OnBehalfOf;
|
|
16
20
|
};
|
|
17
21
|
export declare class ChatModelFactory {
|
|
18
22
|
private readonly aiProvidersService;
|
|
19
23
|
private readonly aiModelSelectionsService;
|
|
20
|
-
|
|
24
|
+
private readonly chatgptSubscription;
|
|
25
|
+
constructor(aiProvidersService: AiProvidersService, aiModelSelectionsService: AiModelSelectionsService, chatgptSubscription: ChatgptSubscriptionService);
|
|
21
26
|
resolve(input: ResolveChatModelInput): Promise<ResolvedChatModel>;
|
|
22
27
|
private build;
|
|
23
28
|
private buildVertex;
|
|
@@ -14,10 +14,12 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const anthropic_1 = require("@ai-sdk/anthropic");
|
|
15
15
|
const google_1 = require("@ai-sdk/google");
|
|
16
16
|
const google_vertex_1 = require("@ai-sdk/google-vertex");
|
|
17
|
+
const anthropic_2 = require("@ai-sdk/google-vertex/anthropic");
|
|
17
18
|
const openai_1 = require("@ai-sdk/openai");
|
|
18
19
|
const openai_compatible_1 = require("@ai-sdk/openai-compatible");
|
|
19
20
|
const xai_1 = require("@ai-sdk/xai");
|
|
20
21
|
const ai_providers_service_1 = require("../../ai-providers/ai-providers.service");
|
|
22
|
+
const chatgpt_subscription_service_1 = require("../../ai-providers/chatgpt-subscription/chatgpt-subscription.service");
|
|
21
23
|
const ai_model_selections_service_1 = require("../../ai-providers/ai-model-selections.service");
|
|
22
24
|
const enums_1 = require("../../ai-providers/enums");
|
|
23
25
|
const ai_providers_errors_1 = require("../../ai-providers/errors/ai-providers.errors");
|
|
@@ -25,19 +27,21 @@ const google_environment_1 = require("../../ai-providers/google-environment");
|
|
|
25
27
|
let ChatModelFactory = class ChatModelFactory {
|
|
26
28
|
aiProvidersService;
|
|
27
29
|
aiModelSelectionsService;
|
|
28
|
-
|
|
30
|
+
chatgptSubscription;
|
|
31
|
+
constructor(aiProvidersService, aiModelSelectionsService, chatgptSubscription) {
|
|
29
32
|
this.aiProvidersService = aiProvidersService;
|
|
30
33
|
this.aiModelSelectionsService = aiModelSelectionsService;
|
|
34
|
+
this.chatgptSubscription = chatgptSubscription;
|
|
31
35
|
}
|
|
32
36
|
async resolve(input) {
|
|
33
37
|
if (input.aiProviderId && input.modelId) {
|
|
34
38
|
const config = await this.aiProvidersService.getAiProviderConfigById(input.aiProviderId);
|
|
35
|
-
return this.build(config, input.modelId);
|
|
39
|
+
return this.build(config, input.modelId, input);
|
|
36
40
|
}
|
|
37
41
|
const selection = await this.aiModelSelectionsService.resolve(input.job);
|
|
38
|
-
return this.build(selection.provider, selection.modelId);
|
|
42
|
+
return this.build(selection.provider, selection.modelId, input);
|
|
39
43
|
}
|
|
40
|
-
build(config, modelId) {
|
|
44
|
+
async build(config, modelId, input) {
|
|
41
45
|
const apiKey = config.apiKey ?? undefined;
|
|
42
46
|
const baseURL = config.baseUrl ?? undefined;
|
|
43
47
|
switch (config.type) {
|
|
@@ -77,6 +81,22 @@ let ChatModelFactory = class ChatModelFactory {
|
|
|
77
81
|
providerType: config.type,
|
|
78
82
|
modelId,
|
|
79
83
|
};
|
|
84
|
+
case enums_1.AiProviderType.CHATGPT_SUBSCRIPTION:
|
|
85
|
+
if (!enums_1.USER_CONNECTED_PROVIDER_JOBS.includes(input.job) ||
|
|
86
|
+
!input.onBehalfOf ||
|
|
87
|
+
(input.job === enums_1.AiModelJob.USER_SMALL_TASKS && input.onBehalfOf.automated)) {
|
|
88
|
+
throw new ai_providers_errors_1.AiProviderJobNotAllowedError(config.id, input.job);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
model: await this.chatgptSubscription.modelForTurn({
|
|
92
|
+
providerId: config.id,
|
|
93
|
+
modelId,
|
|
94
|
+
onBehalfOf: input.onBehalfOf,
|
|
95
|
+
}),
|
|
96
|
+
providerType: config.type,
|
|
97
|
+
modelId,
|
|
98
|
+
requiresStreaming: true,
|
|
99
|
+
};
|
|
80
100
|
}
|
|
81
101
|
}
|
|
82
102
|
buildVertex(config, modelId) {
|
|
@@ -89,18 +109,22 @@ let ChatModelFactory = class ChatModelFactory {
|
|
|
89
109
|
throw new ai_providers_errors_1.AiProviderNotConfiguredError(config.id);
|
|
90
110
|
}
|
|
91
111
|
}
|
|
92
|
-
const
|
|
112
|
+
const settings = {
|
|
93
113
|
project: config.project ?? (0, google_environment_1.vertexProjectFromEnv)(),
|
|
94
114
|
location: config.location ?? (0, google_environment_1.vertexLocationFromEnv)(),
|
|
95
115
|
googleAuthOptions: credentials ? { credentials } : undefined,
|
|
96
|
-
}
|
|
97
|
-
|
|
116
|
+
};
|
|
117
|
+
const model = (0, google_environment_1.isVertexAnthropicModelId)(modelId)
|
|
118
|
+
? (0, anthropic_2.createVertexAnthropic)(settings)(modelId)
|
|
119
|
+
: (0, google_vertex_1.createVertex)(settings)(modelId);
|
|
120
|
+
return { model, providerType: enums_1.AiProviderType.GOOGLE_VERTEX, modelId };
|
|
98
121
|
}
|
|
99
122
|
};
|
|
100
123
|
exports.ChatModelFactory = ChatModelFactory;
|
|
101
124
|
exports.ChatModelFactory = ChatModelFactory = __decorate([
|
|
102
125
|
(0, common_1.Injectable)(),
|
|
103
126
|
__metadata("design:paramtypes", [ai_providers_service_1.AiProvidersService,
|
|
104
|
-
ai_model_selections_service_1.AiModelSelectionsService
|
|
127
|
+
ai_model_selections_service_1.AiModelSelectionsService,
|
|
128
|
+
chatgpt_subscription_service_1.ChatgptSubscriptionService])
|
|
105
129
|
], ChatModelFactory);
|
|
106
130
|
//# sourceMappingURL=chat-model.factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-model.factory.js","sourceRoot":"","sources":["../../../src/threads/agent/chat-model.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,iDAAoD;AACpD,2CAA8C;AAC9C,yDAAqD;AACrD,2CAA8C;AAC9C,iEAAmE;AACnE,qCAAwC;AACxC,kFAA2E;
|
|
1
|
+
{"version":3,"file":"chat-model.factory.js","sourceRoot":"","sources":["../../../src/threads/agent/chat-model.factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,13 @@ jest.mock('src/ai-providers/ai-model-selections.service', () => ({
|
|
|
11
11
|
jest.mock('src/ai-providers/errors/ai-providers.errors', () => ({
|
|
12
12
|
AiProviderNotConfiguredError: class extends Error {
|
|
13
13
|
},
|
|
14
|
+
AiProviderJobNotAllowedError: class extends Error {
|
|
15
|
+
code = 'AI_PROVIDER_JOB_NOT_ALLOWED';
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
jest.mock('src/ai-providers/chatgpt-subscription/chatgpt-subscription.service', () => ({
|
|
19
|
+
ChatgptSubscriptionService: class {
|
|
20
|
+
},
|
|
14
21
|
}));
|
|
15
22
|
const GOOGLE_ENV_KEYS = [
|
|
16
23
|
'GOOGLE_CLOUD_PROJECT',
|
|
@@ -35,8 +42,9 @@ describe('ChatModelFactory', () => {
|
|
|
35
42
|
modelId: selectedModelId,
|
|
36
43
|
}));
|
|
37
44
|
const getAiProviderConfigById = jest.fn(async () => providerConfig(type));
|
|
38
|
-
const
|
|
39
|
-
|
|
45
|
+
const modelForTurn = jest.fn(async () => ({ modelId: 'plan-model' }));
|
|
46
|
+
const factory = new chat_model_factory_1.ChatModelFactory({ getAiProviderConfigById }, { resolve: resolveSelection }, { modelForTurn });
|
|
47
|
+
return { factory, resolveSelection, getAiProviderConfigById, modelForTurn };
|
|
40
48
|
};
|
|
41
49
|
beforeEach(() => {
|
|
42
50
|
for (const key of GOOGLE_ENV_KEYS) {
|
|
@@ -56,6 +64,28 @@ describe('ChatModelFactory', () => {
|
|
|
56
64
|
modelId: 'gemini-3.6-flash',
|
|
57
65
|
});
|
|
58
66
|
});
|
|
67
|
+
it('runs a Gemini model on Vertex AI through the Gemini API', async () => {
|
|
68
|
+
process.env.GOOGLE_CLOUD_PROJECT = 'my-project';
|
|
69
|
+
process.env.GOOGLE_CLOUD_LOCATION = 'global';
|
|
70
|
+
const { factory } = factoryFor(enums_1.AiProviderType.GOOGLE_VERTEX, 'gemini-3.6-flash');
|
|
71
|
+
const resolved = await factory.resolve({
|
|
72
|
+
job: enums_1.AiModelJob.CONVERSATION,
|
|
73
|
+
aiProviderId: 'provider-1',
|
|
74
|
+
modelId: 'gemini-3.6-flash',
|
|
75
|
+
});
|
|
76
|
+
const model = resolved.model;
|
|
77
|
+
expect(model.provider).toMatch(/vertex/i);
|
|
78
|
+
expect(model.provider).not.toMatch(/anthropic/i);
|
|
79
|
+
});
|
|
80
|
+
it.each(['claude-sonnet-4-5', 'claude-opus-4-1@20250805'])('runs %s on Vertex AI through the Anthropic API', async (modelId) => {
|
|
81
|
+
process.env.GOOGLE_CLOUD_PROJECT = 'my-project';
|
|
82
|
+
process.env.GOOGLE_CLOUD_LOCATION = 'us-east5';
|
|
83
|
+
const { factory } = factoryFor(enums_1.AiProviderType.GOOGLE_VERTEX, modelId);
|
|
84
|
+
const resolved = await factory.resolve({ job: enums_1.AiModelJob.CONVERSATION });
|
|
85
|
+
expect(resolved).toMatchObject({ providerType: enums_1.AiProviderType.GOOGLE_VERTEX, modelId });
|
|
86
|
+
expect(resolved.model.provider).toBe('googleVertex.anthropic.messages');
|
|
87
|
+
expect(resolved.model.modelId).toBe(modelId);
|
|
88
|
+
});
|
|
59
89
|
it('builds an xAI model for a Grok provider', async () => {
|
|
60
90
|
const { factory } = factoryFor(enums_1.AiProviderType.XAI, 'grok-4');
|
|
61
91
|
const resolved = await factory.resolve({ job: enums_1.AiModelJob.CONVERSATION });
|
|
@@ -64,10 +94,17 @@ describe('ChatModelFactory', () => {
|
|
|
64
94
|
});
|
|
65
95
|
it("asks for the job's selection when the thread has no model of its own", async () => {
|
|
66
96
|
const { factory, resolveSelection } = factoryFor(enums_1.AiProviderType.ANTHROPIC, 'claude-haiku-5-5');
|
|
67
|
-
const resolved = await factory.resolve({ job: enums_1.AiModelJob.
|
|
68
|
-
expect(resolveSelection).toHaveBeenCalledWith(enums_1.AiModelJob.
|
|
97
|
+
const resolved = await factory.resolve({ job: enums_1.AiModelJob.SYSTEM_SMALL_TASKS });
|
|
98
|
+
expect(resolveSelection).toHaveBeenCalledWith(enums_1.AiModelJob.SYSTEM_SMALL_TASKS);
|
|
69
99
|
expect(resolved.modelId).toBe('claude-haiku-5-5');
|
|
70
100
|
});
|
|
101
|
+
it.each([enums_1.AiModelJob.USER_SMALL_TASKS, enums_1.AiModelJob.SYSTEM_SMALL_TASKS])('runs %s on a provider with an API key, with or without a person', async (job) => {
|
|
102
|
+
const { factory } = factoryFor(enums_1.AiProviderType.ANTHROPIC, 'claude-haiku-5-5');
|
|
103
|
+
await expect(factory.resolve({ job })).resolves.toMatchObject({
|
|
104
|
+
providerType: enums_1.AiProviderType.ANTHROPIC,
|
|
105
|
+
});
|
|
106
|
+
await expect(factory.resolve({ job, onBehalfOf: { actorId: 'actor-1', automated: false } })).resolves.toMatchObject({ providerType: enums_1.AiProviderType.ANTHROPIC });
|
|
107
|
+
});
|
|
71
108
|
it("uses the thread's own provider and model when both are set", async () => {
|
|
72
109
|
const { factory, resolveSelection, getAiProviderConfigById } = factoryFor(enums_1.AiProviderType.ANTHROPIC, 'claude-haiku-5-5');
|
|
73
110
|
const resolved = await factory.resolve({
|
|
@@ -79,5 +116,107 @@ describe('ChatModelFactory', () => {
|
|
|
79
116
|
expect(resolveSelection).not.toHaveBeenCalled();
|
|
80
117
|
expect(resolved.modelId).toBe('claude-opus-5-5');
|
|
81
118
|
});
|
|
119
|
+
describe('a provider that runs on a person\u2019s own plan', () => {
|
|
120
|
+
const onBehalfOf = { actorId: 'actor-1', automated: false };
|
|
121
|
+
it('binds a thread turn to the person it is for and marks the model streaming-only', async () => {
|
|
122
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-large');
|
|
123
|
+
const resolved = await factory.resolve({ job: enums_1.AiModelJob.CONVERSATION, onBehalfOf });
|
|
124
|
+
expect(modelForTurn).toHaveBeenCalledWith({
|
|
125
|
+
providerId: 'provider-1',
|
|
126
|
+
modelId: 'gpt-plan-large',
|
|
127
|
+
onBehalfOf,
|
|
128
|
+
});
|
|
129
|
+
expect(resolved).toMatchObject({
|
|
130
|
+
providerType: enums_1.AiProviderType.CHATGPT_SUBSCRIPTION,
|
|
131
|
+
modelId: 'gpt-plan-large',
|
|
132
|
+
requiresStreaming: true,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
it('honours a thread\u2019s own provider and model', async () => {
|
|
136
|
+
const { factory, modelForTurn, resolveSelection } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-large');
|
|
137
|
+
await factory.resolve({
|
|
138
|
+
job: enums_1.AiModelJob.CONVERSATION,
|
|
139
|
+
aiProviderId: 'provider-1',
|
|
140
|
+
modelId: 'gpt-plan-small',
|
|
141
|
+
onBehalfOf,
|
|
142
|
+
});
|
|
143
|
+
expect(resolveSelection).not.toHaveBeenCalled();
|
|
144
|
+
expect(modelForTurn).toHaveBeenCalledWith(expect.objectContaining({ modelId: 'gpt-plan-small', onBehalfOf }));
|
|
145
|
+
});
|
|
146
|
+
it('binds a middle manager run to the person it is for, as an unattended run', async () => {
|
|
147
|
+
const { factory, modelForTurn, resolveSelection } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
148
|
+
const creator = { actorId: 'creator-1', automated: true };
|
|
149
|
+
const resolved = await factory.resolve({
|
|
150
|
+
job: enums_1.AiModelJob.MIDDLE_MANAGER,
|
|
151
|
+
onBehalfOf: creator,
|
|
152
|
+
});
|
|
153
|
+
expect(resolveSelection).toHaveBeenCalledWith(enums_1.AiModelJob.MIDDLE_MANAGER);
|
|
154
|
+
expect(modelForTurn).toHaveBeenCalledWith({
|
|
155
|
+
providerId: 'provider-1',
|
|
156
|
+
modelId: 'gpt-plan-small',
|
|
157
|
+
onBehalfOf: creator,
|
|
158
|
+
});
|
|
159
|
+
expect(resolved.requiresStreaming).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
it('refuses a middle manager run that does not say who it is for', async () => {
|
|
162
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
163
|
+
await expect(factory.resolve({ job: enums_1.AiModelJob.MIDDLE_MANAGER })).rejects.toMatchObject({
|
|
164
|
+
code: 'AI_PROVIDER_JOB_NOT_ALLOWED',
|
|
165
|
+
});
|
|
166
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
167
|
+
});
|
|
168
|
+
it('binds a user small task to the person who started it', async () => {
|
|
169
|
+
const { factory, modelForTurn, resolveSelection } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
170
|
+
const resolved = await factory.resolve({
|
|
171
|
+
job: enums_1.AiModelJob.USER_SMALL_TASKS,
|
|
172
|
+
onBehalfOf,
|
|
173
|
+
});
|
|
174
|
+
expect(resolveSelection).toHaveBeenCalledWith(enums_1.AiModelJob.USER_SMALL_TASKS);
|
|
175
|
+
expect(modelForTurn).toHaveBeenCalledWith({
|
|
176
|
+
providerId: 'provider-1',
|
|
177
|
+
modelId: 'gpt-plan-small',
|
|
178
|
+
onBehalfOf,
|
|
179
|
+
});
|
|
180
|
+
expect(resolved.requiresStreaming).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
it('refuses a user small task that does not say who started it', async () => {
|
|
183
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
184
|
+
await expect(factory.resolve({ job: enums_1.AiModelJob.USER_SMALL_TASKS })).rejects.toMatchObject({
|
|
185
|
+
code: 'AI_PROVIDER_JOB_NOT_ALLOWED',
|
|
186
|
+
});
|
|
187
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
it('refuses an unattended user small task, even with consent recorded elsewhere', async () => {
|
|
190
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
191
|
+
await expect(factory.resolve({
|
|
192
|
+
job: enums_1.AiModelJob.USER_SMALL_TASKS,
|
|
193
|
+
onBehalfOf: { actorId: 'creator-1', automated: true },
|
|
194
|
+
})).rejects.toMatchObject({ code: 'AI_PROVIDER_JOB_NOT_ALLOWED' });
|
|
195
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
196
|
+
});
|
|
197
|
+
it.each([
|
|
198
|
+
undefined,
|
|
199
|
+
{ actorId: 'actor-1', automated: false },
|
|
200
|
+
{ actorId: 'actor-1', automated: true },
|
|
201
|
+
])('refuses a system small task whoever it names (%o)', async (forWhom) => {
|
|
202
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-small');
|
|
203
|
+
await expect(factory.resolve({ job: enums_1.AiModelJob.SYSTEM_SMALL_TASKS, onBehalfOf: forWhom })).rejects.toMatchObject({ code: 'AI_PROVIDER_JOB_NOT_ALLOWED' });
|
|
204
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
205
|
+
});
|
|
206
|
+
it('refuses the embeddings job even when told who it is for', async () => {
|
|
207
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-large');
|
|
208
|
+
await expect(factory.resolve({ job: enums_1.AiModelJob.EMBEDDINGS, onBehalfOf })).rejects.toMatchObject({
|
|
209
|
+
code: 'AI_PROVIDER_JOB_NOT_ALLOWED',
|
|
210
|
+
});
|
|
211
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
it('refuses a conversation call that does not say who it is for', async () => {
|
|
214
|
+
const { factory, modelForTurn } = factoryFor(enums_1.AiProviderType.CHATGPT_SUBSCRIPTION, 'gpt-plan-large');
|
|
215
|
+
await expect(factory.resolve({ job: enums_1.AiModelJob.CONVERSATION })).rejects.toMatchObject({
|
|
216
|
+
code: 'AI_PROVIDER_JOB_NOT_ALLOWED',
|
|
217
|
+
});
|
|
218
|
+
expect(modelForTurn).not.toHaveBeenCalled();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
82
221
|
});
|
|
83
222
|
//# sourceMappingURL=chat-model.factory.spec.js.map
|