@mtkn/mega-agent 0.1.1 → 0.2.0
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 +64 -4
- package/dist/artifact/artifact.repository.d.ts +2 -1
- package/dist/artifact/artifact.repository.d.ts.map +1 -1
- package/dist/artifact/artifact.repository.js +1 -1
- package/dist/artifact/artifact.repository.js.map +1 -1
- package/dist/artifact/artifact.service.d.ts +3 -2
- package/dist/artifact/artifact.service.d.ts.map +1 -1
- package/dist/artifact/artifact.service.js.map +1 -1
- package/dist/artifact/artifact.types.d.ts +2 -1
- package/dist/artifact/artifact.types.d.ts.map +1 -1
- package/dist/artifact/artifact.types.js.map +1 -1
- package/dist/chat/chat-memory.integration.d.ts +3 -2
- package/dist/chat/chat-memory.integration.d.ts.map +1 -1
- package/dist/chat/chat-memory.integration.js.map +1 -1
- package/dist/chat/chat.repository.d.ts +2 -1
- package/dist/chat/chat.repository.d.ts.map +1 -1
- package/dist/chat/chat.repository.js +1 -1
- package/dist/chat/chat.repository.js.map +1 -1
- package/dist/chat/chat.service.d.ts +3 -2
- package/dist/chat/chat.service.d.ts.map +1 -1
- package/dist/chat/chat.service.js +108 -33
- package/dist/chat/chat.service.js.map +1 -1
- package/dist/chat/chat.types.d.ts +7 -5
- package/dist/chat/chat.types.d.ts.map +1 -1
- package/dist/chat/chat.types.js.map +1 -1
- package/dist/chat/prompts/system.prompts.d.ts.map +1 -1
- package/dist/chat/prompts/system.prompts.js +9 -6
- package/dist/chat/prompts/system.prompts.js.map +1 -1
- package/dist/incident/incident.correlator.d.ts +3 -2
- package/dist/incident/incident.correlator.d.ts.map +1 -1
- package/dist/incident/incident.correlator.js.map +1 -1
- package/dist/incident/incident.repository.d.ts +5 -4
- package/dist/incident/incident.repository.d.ts.map +1 -1
- package/dist/incident/incident.repository.js +6 -6
- package/dist/incident/incident.repository.js.map +1 -1
- package/dist/incident/incident.service.d.ts +3 -2
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/incident/incident.types.d.ts +3 -2
- package/dist/incident/incident.types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/source.repository.d.ts +5 -4
- package/dist/mcp/source.repository.d.ts.map +1 -1
- package/dist/mcp/source.repository.js +3 -3
- package/dist/mcp/source.repository.js.map +1 -1
- package/dist/mcp/source.service.d.ts +3 -2
- package/dist/mcp/source.service.d.ts.map +1 -1
- package/dist/mcp/source.service.js.map +1 -1
- package/dist/memory/memory.repository.d.ts +3 -2
- package/dist/memory/memory.repository.d.ts.map +1 -1
- package/dist/memory/memory.repository.js +4 -4
- package/dist/memory/memory.repository.js.map +1 -1
- package/dist/memory/memory.service.d.ts +3 -2
- package/dist/memory/memory.service.d.ts.map +1 -1
- package/dist/memory/memory.service.js +2 -2
- package/dist/memory/memory.service.js.map +1 -1
- package/dist/memory/memory.types.d.ts +4 -3
- package/dist/memory/memory.types.d.ts.map +1 -1
- package/dist/memory/memory.types.js.map +1 -1
- package/dist/tools/tool-registry.d.ts +3 -2
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/types/id.types.d.ts +7 -0
- package/dist/types/id.types.d.ts.map +1 -0
- package/dist/types/id.types.js +2 -0
- package/dist/types/id.types.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/workflow/workflow.repository.js.map +1 -1
- package/dist/workflow/workflow.service.d.ts.map +1 -1
- package/dist/workflow/workflow.service.js +7 -6
- package/dist/workflow/workflow.service.js.map +1 -1
- package/dist/workflow/workflow.types.d.ts +4 -2
- package/dist/workflow/workflow.types.d.ts.map +1 -1
- package/dist/workflow/workflow.types.js.map +1 -1
- package/package.json +1 -3
- package/prisma/schema.prisma +9 -1
- package/scripts/prisma-sync.mjs +216 -13
package/README.md
CHANGED
|
@@ -77,7 +77,41 @@ The package requires 16 enums and 12 models in your Prisma schema.
|
|
|
77
77
|
npx mega-agent-prisma-sync --target prisma/schema.prisma
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
On first run, the CLI interactively asks your preferred ID strategy:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
📋 mega-agent Prisma Schema Configuration
|
|
84
|
+
|
|
85
|
+
Primary key strategy for mega-agent models? (cuid/uuid/autoincrement) [cuid]:
|
|
86
|
+
User ID type in your app? (int/string) [int]:
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
You can also pass flags directly (useful for CI/CD):
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# UUID primary keys + String user IDs
|
|
93
|
+
npx mega-agent-prisma-sync --target prisma/schema.prisma --id-type uuid --user-id-type string
|
|
94
|
+
|
|
95
|
+
# Autoincrement (integer) primary keys
|
|
96
|
+
npx mega-agent-prisma-sync --target prisma/schema.prisma --id-type autoincrement
|
|
97
|
+
|
|
98
|
+
# Skip prompts, use previous config or defaults
|
|
99
|
+
npx mega-agent-prisma-sync --target prisma/schema.prisma --no-interactive
|
|
100
|
+
|
|
101
|
+
# Preview without writing
|
|
102
|
+
npx mega-agent-prisma-sync --target prisma/schema.prisma --id-type uuid --dry-run
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Available options:**
|
|
106
|
+
|
|
107
|
+
| Flag | Values | Default | Description |
|
|
108
|
+
|------|--------|---------|-------------|
|
|
109
|
+
| `--id-type` | `cuid`, `uuid`, `autoincrement` | `cuid` | Primary key strategy for all mega-agent models |
|
|
110
|
+
| `--user-id-type` | `int`, `string` | `int` | Type of the `userId` field (must match your User model's ID type) |
|
|
111
|
+
| `--no-interactive` | — | — | Skip prompts, use previous config or defaults |
|
|
112
|
+
| `--dry-run` | — | — | Print result without writing to file |
|
|
113
|
+
|
|
114
|
+
Your selection is saved in the marker comment. Re-running the sync command automatically detects and reuses the previous config.
|
|
81
115
|
|
|
82
116
|
### Option B: Manual Copy
|
|
83
117
|
|
|
@@ -88,6 +122,8 @@ Copy all enums and models from the reference schema:
|
|
|
88
122
|
cat node_modules/@mtkn/mega-agent/prisma/schema.prisma
|
|
89
123
|
```
|
|
90
124
|
|
|
125
|
+
If your app uses UUID or autoincrement IDs, you'll need to manually adjust the `@id` defaults and `userId` field types.
|
|
126
|
+
|
|
91
127
|
### Add User Relations
|
|
92
128
|
|
|
93
129
|
Each AI model has a `userId` field. Add relations in your `User` model:
|
|
@@ -118,12 +154,12 @@ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
118
154
|
|
|
119
155
|
### Add Notification Model
|
|
120
156
|
|
|
121
|
-
The workflow service uses `prisma.notification.create()`. Your schema needs:
|
|
157
|
+
The workflow service uses `prisma.notification.create()`. Your schema needs a Notification model. Adjust the `userId` type to match your User model:
|
|
122
158
|
|
|
123
159
|
```prisma
|
|
124
160
|
model Notification {
|
|
125
161
|
id Int @id @default(autoincrement())
|
|
126
|
-
userId Int @map("user_id")
|
|
162
|
+
userId Int @map("user_id") // Use String if your User.id is String
|
|
127
163
|
type String
|
|
128
164
|
title String
|
|
129
165
|
message String
|
|
@@ -257,9 +293,11 @@ The chat router requires an auth middleware that sets `req.user` with at least a
|
|
|
257
293
|
type AuthMiddleware = (req: Request, res: Response, next: NextFunction) => void;
|
|
258
294
|
|
|
259
295
|
// Your middleware must set:
|
|
260
|
-
// req.user = { id: number, ... }
|
|
296
|
+
// req.user = { id: number | string, ... }
|
|
261
297
|
```
|
|
262
298
|
|
|
299
|
+
The `userId` type is flexible — it accepts both `number` and `string` to support different ID strategies (autoincrement integers, CUID strings, UUIDs, etc.).
|
|
300
|
+
|
|
263
301
|
### Registering Domain Tools
|
|
264
302
|
|
|
265
303
|
Tools give the AI agent access to your application's data and actions. The package comes with 2 built-in tools (`search_memory`, `create_memory`) when memory is enabled. Register your own domain tools after calling `createMegaAgent()`:
|
|
@@ -559,6 +597,28 @@ If using a monorepo with linked packages, ensure there's only one `@prisma/clien
|
|
|
559
597
|
- Up to 20 context messages are sent to the LLM
|
|
560
598
|
- Check LLM API key validity and rate limits
|
|
561
599
|
|
|
600
|
+
## TypeScript Types
|
|
601
|
+
|
|
602
|
+
The package exports a `UserId` type for use in your application:
|
|
603
|
+
|
|
604
|
+
```typescript
|
|
605
|
+
import type { UserId } from '@mtkn/mega-agent';
|
|
606
|
+
|
|
607
|
+
// UserId = string | number
|
|
608
|
+
// Matches both integer and string-based ID strategies
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
All service methods accept `UserId` for the `userId` parameter, so your app works regardless of whether your User model uses `Int @id @default(autoincrement())` or `String @id @default(cuid())`.
|
|
612
|
+
|
|
613
|
+
## Changelog
|
|
614
|
+
|
|
615
|
+
### v0.2.0
|
|
616
|
+
|
|
617
|
+
- **ID type selection** — `prisma-sync` CLI now supports `--id-type` (cuid/uuid/autoincrement) and `--user-id-type` (int/string) with interactive prompts
|
|
618
|
+
- **Flexible UserId** — All services accept `string | number` for userId, supporting any ID strategy
|
|
619
|
+
- **Removed `uuid` dependency** — Replaced with Node.js built-in `crypto.randomUUID()`
|
|
620
|
+
- **Bug fix** — Fixed hardcoded `userId: 1` in workflow action handlers
|
|
621
|
+
|
|
562
622
|
## License
|
|
563
623
|
|
|
564
624
|
MIT
|
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { AiArtifact } from '@prisma/client';
|
|
6
6
|
import type { CreateArtifactDto, UpdateArtifactDto, ArtifactListQuery, ArtifactServiceDependencies } from './artifact.types.js';
|
|
7
|
+
import type { UserId } from '../types/index.js';
|
|
7
8
|
export declare function initArtifactRepository(deps: ArtifactServiceDependencies): void;
|
|
8
9
|
export declare class ArtifactRepository {
|
|
9
10
|
private get prisma();
|
|
10
11
|
create(data: CreateArtifactDto): Promise<AiArtifact>;
|
|
11
12
|
findById(id: string): Promise<AiArtifact | null>;
|
|
12
|
-
findByUser(userId:
|
|
13
|
+
findByUser(userId: UserId, query?: ArtifactListQuery): Promise<AiArtifact[]>;
|
|
13
14
|
findByChat(chatId: string): Promise<AiArtifact[]>;
|
|
14
15
|
update(id: string, data: UpdateArtifactDto): Promise<AiArtifact>;
|
|
15
16
|
delete(id: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.repository.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.repository.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAChI,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAE9E;AAED,qBAAa,kBAAkB;IAC7B,OAAO,KAAK,MAAM,GAGjB;IAEK,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIhD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAY5E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOjD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAahE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.repository.js","sourceRoot":"","sources":["../../src/artifact/artifact.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"artifact.repository.js","sourceRoot":"","sources":["../../src/artifact/artifact.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { AiArtifact } from '@prisma/client';
|
|
6
6
|
import type { CreateArtifactDto, UpdateArtifactDto, ArtifactListQuery, ArtifactServiceDependencies } from './artifact.types.js';
|
|
7
|
+
import type { UserId } from '../types/index.js';
|
|
7
8
|
export declare function initArtifactService(deps: ArtifactServiceDependencies): void;
|
|
8
9
|
export declare function getArtifactServiceDeps(): ArtifactServiceDependencies | null;
|
|
9
10
|
export declare class ArtifactService {
|
|
@@ -12,11 +13,11 @@ export declare class ArtifactService {
|
|
|
12
13
|
private get logger();
|
|
13
14
|
create(data: CreateArtifactDto): Promise<AiArtifact>;
|
|
14
15
|
getById(id: string): Promise<AiArtifact | null>;
|
|
15
|
-
listByUser(userId:
|
|
16
|
+
listByUser(userId: UserId, query?: ArtifactListQuery): Promise<AiArtifact[]>;
|
|
16
17
|
listByChat(chatId: string): Promise<AiArtifact[]>;
|
|
17
18
|
update(id: string, data: UpdateArtifactDto): Promise<AiArtifact>;
|
|
18
19
|
delete(id: string): Promise<void>;
|
|
19
|
-
createFromMessage(userId:
|
|
20
|
+
createFromMessage(userId: UserId, chatId: string, messageId: string, data: Partial<CreateArtifactDto>): Promise<AiArtifact>;
|
|
20
21
|
export(id: string, format: 'json' | 'csv' | 'md'): Promise<string>;
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=artifact.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.service.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.service.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAG3E;AAED,wBAAgB,sBAAsB,IAAI,2BAA2B,GAAG,IAAI,CAE3E;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAqB;;IAQvC,OAAO,KAAK,MAAM,GAA4B;IAIxC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAMpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI/C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAI5E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIjD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAIhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjC,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/B,OAAO,CAAC,UAAU,CAAC;IAahB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CA6BzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.service.js","sourceRoot":"","sources":["../../src/artifact/artifact.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.service.js","sourceRoot":"","sources":["../../src/artifact/artifact.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { ArtifactType } from '@prisma/client';
|
|
5
5
|
import type { AiArtifact, Prisma, PrismaClient } from '@prisma/client';
|
|
6
|
+
import type { UserId } from '../types/index.js';
|
|
6
7
|
export { ArtifactType };
|
|
7
8
|
export type { AiArtifact };
|
|
8
9
|
export interface CreateArtifactDto {
|
|
9
|
-
userId:
|
|
10
|
+
userId: UserId;
|
|
10
11
|
chatId?: string;
|
|
11
12
|
messageId?: string;
|
|
12
13
|
type: ArtifactType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.types.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.types.d.ts","sourceRoot":"","sources":["../../src/artifact/artifact.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC;IAChD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact.types.js","sourceRoot":"","sources":["../../src/artifact/artifact.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact.types.js","sourceRoot":"","sources":["../../src/artifact/artifact.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { AiChatMessage, MemoryType } from '@prisma/client';
|
|
7
7
|
import type { ChatMemoryIntegrationDependencies, MemorySearchResult, MemorySuggestionResult } from './chat.types.js';
|
|
8
|
+
import type { UserId } from '../types/index.js';
|
|
8
9
|
/**
|
|
9
10
|
* Initialize the Chat Memory Integration with dependencies
|
|
10
11
|
*/
|
|
@@ -29,7 +30,7 @@ export declare class ChatMemoryIntegration {
|
|
|
29
30
|
* Get relevant memories for a chat message
|
|
30
31
|
* Combines the current message with chat context for better relevance
|
|
31
32
|
*/
|
|
32
|
-
getRelevantMemories(userId:
|
|
33
|
+
getRelevantMemories(userId: UserId, message: string, chatContext?: string): Promise<MemorySearchResult[]>;
|
|
33
34
|
/**
|
|
34
35
|
* Build memory context string for LLM injection
|
|
35
36
|
* Formats memories in a structured way for the LLM to understand
|
|
@@ -54,6 +55,6 @@ export declare class ChatMemoryIntegration {
|
|
|
54
55
|
* Create memory suggestion from chat
|
|
55
56
|
* Generates a memory suggestion based on chat content
|
|
56
57
|
*/
|
|
57
|
-
suggestMemoryFromChat(chatId: string, messageId: string, userId:
|
|
58
|
+
suggestMemoryFromChat(chatId: string, messageId: string, userId: UserId, content: string, type?: MemoryType): Promise<void>;
|
|
58
59
|
}
|
|
59
60
|
//# sourceMappingURL=chat-memory.integration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-memory.integration.d.ts","sourceRoot":"","sources":["../../src/chat/chat-memory.integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EACV,iCAAiC,EAGjC,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-memory.integration.d.ts","sourceRoot":"","sources":["../../src/chat/chat-memory.integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EACV,iCAAiC,EAGjC,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAMhD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iCAAiC,GAAG,IAAI,CAEvF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,iCAAiC,GAAG,IAAI,CAEvF;AAID;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,yDAAyD;IACzD,MAAM,CAAC,QAAQ,CAAC,mBAAmB,QAAQ;IAE3C,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,KAAK;;IAQzC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,aAAa,GAExB;IAED;;;OAGG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAqBhC;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM;IAsB1D;;;OAGG;IACH,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,WAAW,GAAE,MAAU,GAAG,MAAM;IAQnF;;;OAGG;IACG,iBAAiB,CACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB;IAuBhE;;;OAGG;IACG,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,UAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC;CAmBjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-memory.integration.js","sourceRoot":"","sources":["../../src/chat/chat-memory.integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"chat-memory.integration.js","sourceRoot":"","sources":["../../src/chat/chat-memory.integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { AiChat, AiChatMessage } from '@prisma/client';
|
|
6
6
|
import type { CreateChatDto, UpdateChatDto, ChatServiceDependencies } from './chat.types.js';
|
|
7
|
+
import type { UserId } from '../types/index.js';
|
|
7
8
|
/**
|
|
8
9
|
* Initialize the Chat repository with dependencies
|
|
9
10
|
*/
|
|
@@ -28,7 +29,7 @@ export declare class ChatRepository {
|
|
|
28
29
|
/**
|
|
29
30
|
* Find chats by user
|
|
30
31
|
*/
|
|
31
|
-
findByUser(userId:
|
|
32
|
+
findByUser(userId: UserId, limit?: number): Promise<AiChat[]>;
|
|
32
33
|
/**
|
|
33
34
|
* Update a chat
|
|
34
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.repository.d.ts","sourceRoot":"","sources":["../../src/chat/chat.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.repository.d.ts","sourceRoot":"","sources":["../../src/chat/chat.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAEtE;AAED,qBAAa,cAAc;IACzB,OAAO,KAAK,MAAM,GAGjB;IAED,OAAO,KAAK,MAAM,GAGjB;IAED;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBtD;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIlD;;OAEG;IACG,oBAAoB,CACxB,EAAE,EAAE,MAAM,EACV,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,MAAM,GAAG;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAY3D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQnE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAOlE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,EACrC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,GACA,OAAO,CAAC,aAAa,CAAC;IAsBzB;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,IAAI,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC;IAW3B;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.repository.js","sourceRoot":"","sources":["../../src/chat/chat.repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"chat.repository.js","sourceRoot":"","sources":["../../src/chat/chat.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { AiChat } from '@prisma/client';
|
|
5
5
|
import type { CreateChatDto, UpdateChatDto, SendMessageDto, ChatMessageResponse, ChatStreamChunk, ChatContext, ChatServiceDependencies } from './chat.types.js';
|
|
6
|
+
import type { UserId } from '../types/index.js';
|
|
6
7
|
export declare function initChatService(deps: ChatServiceDependencies): void;
|
|
7
8
|
export declare function getChatServiceDeps(): ChatServiceDependencies | null;
|
|
8
9
|
export declare class ChatService {
|
|
@@ -14,11 +15,11 @@ export declare class ChatService {
|
|
|
14
15
|
private get llmService();
|
|
15
16
|
createChat(data: CreateChatDto): Promise<AiChat>;
|
|
16
17
|
sendMessage(dto: SendMessageDto): Promise<ChatMessageResponse>;
|
|
17
|
-
approveToolCall(chatId: string, toolName: string, args: Record<string, unknown>, userId:
|
|
18
|
+
approveToolCall(chatId: string, toolName: string, args: Record<string, unknown>, userId: UserId, conversationState: string): Promise<ChatMessageResponse>;
|
|
18
19
|
streamMessage(dto: SendMessageDto): AsyncGenerator<ChatStreamChunk>;
|
|
19
20
|
getChat(id: string): Promise<AiChat | null>;
|
|
20
21
|
getChatWithMessages(id: string): Promise<ChatContext | null>;
|
|
21
|
-
getUserChats(userId:
|
|
22
|
+
getUserChats(userId: UserId, limit?: number): Promise<AiChat[]>;
|
|
22
23
|
updateChat(id: string, data: UpdateChatDto): Promise<AiChat>;
|
|
23
24
|
deleteChat(id: string): Promise<void>;
|
|
24
25
|
generateTitle(chatId: string): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAChK,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAYhD,wBAAgB,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAA4C;AAChH,wBAAgB,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAAkB;AAEtF,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,MAAM;IAC1C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,MAAM;;IAQ1C,OAAO,KAAK,MAAM,GAA4B;IAC9C,OAAO,KAAK,UAAU,GAAgC;IAEhD,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAShD,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqI9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BxJ,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAAC,eAAe,CAAC;IAgFpE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3C,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/D,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpD,OAAO,CAAC,oBAAoB;YAId,qBAAqB;CAOpC"}
|
|
@@ -65,7 +65,7 @@ export class ChatService {
|
|
|
65
65
|
const toolsCalled = [];
|
|
66
66
|
let finalContent = '';
|
|
67
67
|
let totalTokens = { prompt: 0, completion: 0, total: 0 };
|
|
68
|
-
// ── Loop
|
|
68
|
+
// ── Loop (handles multiple tool calls per iteration) ────────
|
|
69
69
|
for (let i = 0; i < ChatService.MAX_AGENT_ITERATIONS; i++) {
|
|
70
70
|
const res = await this.llmService.complete({
|
|
71
71
|
messages: llmMessages,
|
|
@@ -81,38 +81,60 @@ export class ChatService {
|
|
|
81
81
|
finalContent = res.content;
|
|
82
82
|
break;
|
|
83
83
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
84
|
+
const toolCalls = res.toolCalls;
|
|
85
|
+
const firstWriteIndex = toolCalls.findIndex(tc => requiresApproval(tc.name));
|
|
86
|
+
const autoExecuteCalls = firstWriteIndex === -1 ? toolCalls : toolCalls.slice(0, firstWriteIndex);
|
|
87
|
+
const writeToolCall = firstWriteIndex !== -1 ? toolCalls[firstWriteIndex] : null;
|
|
88
|
+
// Build assistant message with ALL tool_use blocks (Anthropic API requires matching tool_results)
|
|
89
|
+
const assistantBlocks = [
|
|
90
|
+
...(res.content ? [{ type: 'text', text: res.content }] : []),
|
|
91
|
+
...toolCalls.map(tc => ({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input })),
|
|
92
|
+
];
|
|
93
|
+
llmMessages.push({ role: 'assistant', content: assistantBlocks });
|
|
94
|
+
// Execute all READ tools before the first WRITE
|
|
95
|
+
const resultBlocks = [];
|
|
96
|
+
for (const tc of autoExecuteCalls) {
|
|
97
|
+
this.logger.info('Auto-executing tool', { tool: tc.name, iter: i });
|
|
98
|
+
const tStart = Date.now();
|
|
99
|
+
const result = await executeTool(tc.name, tc.input, chat.userId);
|
|
100
|
+
toolsCalled.push({ name: tc.name, durationMs: Date.now() - tStart });
|
|
101
|
+
resultBlocks.push({
|
|
102
|
+
type: 'tool_result',
|
|
103
|
+
tool_use_id: tc.id,
|
|
104
|
+
content: JSON.stringify(result.success ? (result.data ?? null) : (result.error ?? 'Unknown tool error')),
|
|
105
|
+
is_error: !result.success,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// WRITE tool → add placeholder results and return approval
|
|
109
|
+
if (writeToolCall) {
|
|
110
|
+
resultBlocks.push({
|
|
111
|
+
type: 'tool_result',
|
|
112
|
+
tool_use_id: writeToolCall.id,
|
|
113
|
+
content: 'Awaiting user approval.',
|
|
114
|
+
});
|
|
115
|
+
for (const tc of toolCalls.slice(firstWriteIndex + 1)) {
|
|
116
|
+
resultBlocks.push({
|
|
117
|
+
type: 'tool_result',
|
|
118
|
+
tool_use_id: tc.id,
|
|
119
|
+
content: 'Skipped: preceding tool requires user approval.',
|
|
120
|
+
is_error: true,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
llmMessages.push({ role: 'user', content: resultBlocks });
|
|
124
|
+
const tool = getAllTools().find(t => t.name === writeToolCall.name);
|
|
125
|
+
const approvalMsg = await this.repository.addMessage(dto.chatId, 'ASSISTANT', `I want to execute **${writeToolCall.name}**: \`\`\`json\n${JSON.stringify(writeToolCall.input, null, 2)}\n\`\`\`\nPlease confirm or reject.`);
|
|
89
126
|
return {
|
|
90
127
|
message: userMessage, assistantMessage: approvalMsg, usedMemories: usedMemoryIds,
|
|
91
128
|
tokens: totalTokens, latencyMs: Date.now() - startTime,
|
|
92
129
|
pendingApproval: {
|
|
93
|
-
id: `apv-${Date.now()}`, chatId: dto.chatId, toolName:
|
|
94
|
-
toolDescription: tool?.description ||
|
|
130
|
+
id: `apv-${Date.now()}`, chatId: dto.chatId, toolName: writeToolCall.name,
|
|
131
|
+
toolDescription: tool?.description || writeToolCall.name, arguments: writeToolCall.input,
|
|
95
132
|
conversationState: JSON.stringify(llmMessages),
|
|
96
133
|
},
|
|
97
134
|
};
|
|
98
135
|
}
|
|
99
|
-
// READ
|
|
100
|
-
|
|
101
|
-
const tStart = Date.now();
|
|
102
|
-
const result = await executeTool(tc.name, tc.input, chat.userId);
|
|
103
|
-
toolsCalled.push({ name: tc.name, durationMs: Date.now() - tStart });
|
|
104
|
-
// Append tool_use + tool_result to conversation
|
|
105
|
-
llmMessages.push({
|
|
106
|
-
role: 'assistant',
|
|
107
|
-
content: [
|
|
108
|
-
...(res.content ? [{ type: 'text', text: res.content }] : []),
|
|
109
|
-
{ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input },
|
|
110
|
-
],
|
|
111
|
-
});
|
|
112
|
-
llmMessages.push({
|
|
113
|
-
role: 'user',
|
|
114
|
-
content: [{ type: 'tool_result', tool_use_id: tc.id, content: JSON.stringify(result.data ?? result.error) }],
|
|
115
|
-
});
|
|
136
|
+
// All READ → push all tool_result blocks as single user message
|
|
137
|
+
llmMessages.push({ role: 'user', content: resultBlocks });
|
|
116
138
|
}
|
|
117
139
|
// Save final
|
|
118
140
|
const assistantMessage = await this.repository.addMessage(dto.chatId, 'ASSISTANT', finalContent, {
|
|
@@ -139,7 +161,15 @@ export class ChatService {
|
|
|
139
161
|
const llmMessages = JSON.parse(conversationState);
|
|
140
162
|
const toolId = `tool-${Date.now()}`;
|
|
141
163
|
llmMessages.push({ role: 'assistant', content: [{ type: 'tool_use', id: toolId, name: toolName, input: args }] });
|
|
142
|
-
llmMessages.push({
|
|
164
|
+
llmMessages.push({
|
|
165
|
+
role: 'user',
|
|
166
|
+
content: [{
|
|
167
|
+
type: 'tool_result',
|
|
168
|
+
tool_use_id: toolId,
|
|
169
|
+
content: JSON.stringify(result.success ? (result.data ?? null) : (result.error ?? 'Unknown tool error')),
|
|
170
|
+
is_error: !result.success,
|
|
171
|
+
}],
|
|
172
|
+
});
|
|
143
173
|
const chat = await this.repository.findByIdWithMessages(chatId, 3);
|
|
144
174
|
const res = await this.llmService.complete({ messages: llmMessages, model: chat?.model, tools: toAnthropicTools() });
|
|
145
175
|
const assistantMessage = await this.repository.addMessage(chatId, 'ASSISTANT', res.content, { model: res.model, tokens: res.tokens.total, latencyMs: res.latencyMs });
|
|
@@ -147,29 +177,74 @@ export class ChatService {
|
|
|
147
177
|
const structured = ResponseParser.parse(res.content, ctx);
|
|
148
178
|
return { message: assistantMessage, assistantMessage, usedMemories: [], tokens: res.tokens, latencyMs: Date.now() - startTime, structured };
|
|
149
179
|
}
|
|
150
|
-
// ── Stream (
|
|
180
|
+
// ── Stream (hybrid: non-streaming tool loop + streaming final response) ──
|
|
151
181
|
async *streamMessage(dto) {
|
|
152
182
|
const chat = await this.repository.findByIdWithMessages(dto.chatId, ChatService.MAX_CONTEXT_MESSAGES);
|
|
153
183
|
if (!chat) {
|
|
154
|
-
yield { type: 'error', error:
|
|
184
|
+
yield { type: 'error', error: 'Chat not found' };
|
|
155
185
|
return;
|
|
156
186
|
}
|
|
157
187
|
await this.repository.addMessage(dto.chatId, 'USER', dto.content);
|
|
158
188
|
const systemPrompt = buildSystemPrompt(chat.mode, { customPrompt: chat.systemPrompt ?? undefined });
|
|
159
|
-
const
|
|
189
|
+
const llmMessages = [
|
|
160
190
|
{ role: 'system', content: systemPrompt },
|
|
161
|
-
...chat.messages.map(m => ({
|
|
191
|
+
...chat.messages.map((m) => ({
|
|
192
|
+
role: m.role.toLowerCase(),
|
|
193
|
+
content: m.content,
|
|
194
|
+
})),
|
|
162
195
|
{ role: 'user', content: dto.content },
|
|
163
196
|
];
|
|
164
|
-
|
|
197
|
+
const tools = toAnthropicTools();
|
|
198
|
+
const model = dto.model || chat.model;
|
|
165
199
|
try {
|
|
166
|
-
|
|
200
|
+
// ── Phase 1: Non-streaming tool execution loop ──────────────
|
|
201
|
+
if (tools.length > 0) {
|
|
202
|
+
for (let i = 0; i < ChatService.MAX_AGENT_ITERATIONS; i++) {
|
|
203
|
+
const res = await this.llmService.complete({
|
|
204
|
+
messages: llmMessages,
|
|
205
|
+
model,
|
|
206
|
+
temperature: chat.temperature,
|
|
207
|
+
tools,
|
|
208
|
+
});
|
|
209
|
+
// No tool calls → proceed to Phase 2
|
|
210
|
+
if (!res.toolCalls || res.toolCalls.length === 0)
|
|
211
|
+
break;
|
|
212
|
+
const toolCalls = res.toolCalls;
|
|
213
|
+
// WRITE tools incompatible with SSE approval workflow
|
|
214
|
+
if (toolCalls.some(tc => requiresApproval(tc.name))) {
|
|
215
|
+
yield { type: 'error', error: 'A write tool requires approval. Please use non-streaming mode for write tool support.' };
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// Build assistant message with all tool_use blocks
|
|
219
|
+
const assistantBlocks = [
|
|
220
|
+
...(res.content ? [{ type: 'text', text: res.content }] : []),
|
|
221
|
+
...toolCalls.map(tc => ({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input })),
|
|
222
|
+
];
|
|
223
|
+
llmMessages.push({ role: 'assistant', content: assistantBlocks });
|
|
224
|
+
// Execute all READ tools, yield status for each
|
|
225
|
+
const resultBlocks = [];
|
|
226
|
+
for (const tc of toolCalls) {
|
|
227
|
+
yield { type: 'tool_status', toolName: tc.name, content: `Executing ${tc.name}...` };
|
|
228
|
+
const result = await executeTool(tc.name, tc.input, chat.userId);
|
|
229
|
+
resultBlocks.push({
|
|
230
|
+
type: 'tool_result',
|
|
231
|
+
tool_use_id: tc.id,
|
|
232
|
+
content: JSON.stringify(result.success ? (result.data ?? null) : (result.error ?? 'Unknown tool error')),
|
|
233
|
+
is_error: !result.success,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
llmMessages.push({ role: 'user', content: resultBlocks });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// ── Phase 2: Stream the final response ──────────────────────
|
|
240
|
+
let full = '';
|
|
241
|
+
for await (const chunk of this.llmService.stream({ messages: llmMessages, model, temperature: chat.temperature })) {
|
|
167
242
|
full += chunk.content;
|
|
168
243
|
yield { type: 'content', content: chunk.content };
|
|
169
244
|
if (chunk.done)
|
|
170
245
|
break;
|
|
171
246
|
}
|
|
172
|
-
await this.repository.addMessage(dto.chatId, 'ASSISTANT', full, { model
|
|
247
|
+
await this.repository.addMessage(dto.chatId, 'ASSISTANT', full, { model });
|
|
173
248
|
yield { type: 'done' };
|
|
174
249
|
}
|
|
175
250
|
catch (error) {
|