hanoman 0.1.50 → 0.1.52
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/dist/build-info.json +3 -3
- package/dist/cli.js +37 -2
- package/dist/server.js +749 -19
- package/package.json +1 -1
- package/prisma/migrations/20260819140000_portal_chat/migration.sql +31 -0
- package/prisma/schema.prisma +44 -0
- package/web/assets/{index-Ddz2nble.js → index-VxebVskK.js} +1544 -1544
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-- SPEC-854 · ADR-0129 · chat portal klien (LOCAL-only)
|
|
2
|
+
CREATE TABLE "PortalChatSession" (
|
|
3
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
4
|
+
"projectId" TEXT NOT NULL,
|
|
5
|
+
"userId" TEXT NOT NULL,
|
|
6
|
+
"type" TEXT NOT NULL,
|
|
7
|
+
"periodKey" TEXT NOT NULL,
|
|
8
|
+
"summary" TEXT NOT NULL DEFAULT '',
|
|
9
|
+
"prdMarkdown" TEXT,
|
|
10
|
+
"prdReadyAt" DATETIME,
|
|
11
|
+
"prdDocPath" TEXT,
|
|
12
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"updatedAt" DATETIME NOT NULL,
|
|
14
|
+
CONSTRAINT "PortalChatSession_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
15
|
+
CONSTRAINT "PortalChatSession_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
16
|
+
);
|
|
17
|
+
CREATE INDEX "PortalChatSession_projectId_type_periodKey_idx" ON "PortalChatSession"("projectId", "type", "periodKey");
|
|
18
|
+
|
|
19
|
+
CREATE TABLE "PortalChatMessage" (
|
|
20
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
21
|
+
"sessionId" TEXT NOT NULL,
|
|
22
|
+
"seq" INTEGER NOT NULL,
|
|
23
|
+
"role" TEXT NOT NULL,
|
|
24
|
+
"text" TEXT NOT NULL,
|
|
25
|
+
"rawText" TEXT,
|
|
26
|
+
"blocked" BOOLEAN NOT NULL DEFAULT false,
|
|
27
|
+
"blockReasons" JSONB,
|
|
28
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
29
|
+
CONSTRAINT "PortalChatMessage_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "PortalChatSession" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
30
|
+
);
|
|
31
|
+
CREATE UNIQUE INDEX "PortalChatMessage_sessionId_seq_key" ON "PortalChatMessage"("sessionId", "seq");
|
package/prisma/schema.prisma
CHANGED
|
@@ -30,6 +30,7 @@ model Project {
|
|
|
30
30
|
githubIssues GithubIssue[] // SPEC-471 · ADR-0095 · cermin issue repo GitHub project ini
|
|
31
31
|
changelogs Changelog[] // SPEC-516 · ADR-0105 · changelog tersimpan project ini
|
|
32
32
|
clientAccess ClientProjectAccess[] // SPEC-617 · ADR-0110 · akun klien yang boleh melihat project ini
|
|
33
|
+
portalChats PortalChatSession[] // SPEC-854 · ADR-0129 · percakapan portal klien project ini
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
model Spec {
|
|
@@ -245,6 +246,7 @@ model User {
|
|
|
245
246
|
sessions Session[]
|
|
246
247
|
deviceTokens DeviceToken[]
|
|
247
248
|
projectAccess ClientProjectAccess[]
|
|
249
|
+
portalChats PortalChatSession[] // SPEC-854 · ADR-0129
|
|
248
250
|
}
|
|
249
251
|
|
|
250
252
|
// SPEC-617 · ADR-0110 · project yang boleh dilihat sebuah akun klien. Tabel join, bukan kolom
|
|
@@ -845,3 +847,45 @@ model WebhookDelivery {
|
|
|
845
847
|
@@index([endpointId, createdAt])
|
|
846
848
|
@@index([eventId])
|
|
847
849
|
}
|
|
850
|
+
|
|
851
|
+
// SPEC-854 · ADR-0129 · satu percakapan klien di portal. LOCAL-only (cermin
|
|
852
|
+
// ClientProjectAccess, ADR-0110) — akun klien adalah kredensial per-instance, jadi percakapannya
|
|
853
|
+
// tak menyeberang sync maupun webhook. `periodKey` DIBEKUKAN saat sesi lahir, bukan dihitung
|
|
854
|
+
// ulang saat dibaca: itu yang membuat perilaku sesudah reset kuota bisa diuji tanpa memalsukan
|
|
855
|
+
// jam mesin.
|
|
856
|
+
model PortalChatSession {
|
|
857
|
+
id String @id @default(cuid())
|
|
858
|
+
projectId String
|
|
859
|
+
userId String
|
|
860
|
+
type String // "brainstorm" | "tanya"
|
|
861
|
+
periodKey String // "YYYY-MM" UTC
|
|
862
|
+
summary String @default("")
|
|
863
|
+
prdMarkdown String?
|
|
864
|
+
prdReadyAt DateTime?
|
|
865
|
+
prdDocPath String? // terisi saat operator memateralisasi jadi docs/prd/<slug>.md
|
|
866
|
+
createdAt DateTime @default(now())
|
|
867
|
+
updatedAt DateTime @updatedAt
|
|
868
|
+
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
869
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
870
|
+
messages PortalChatMessage[]
|
|
871
|
+
|
|
872
|
+
@@index([projectId, type, periodKey])
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// SPEC-854 · satu giliran percakapan. `rawText`+`blockReasons` menyimpan balasan agen yang
|
|
876
|
+
// DITOLAK gerbang keluaran beserta alasannya — justru baris itu yang paling perlu dibaca
|
|
877
|
+
// operator, dan membuangnya membuat kegagalan penjagaan jadi tak terlihat.
|
|
878
|
+
model PortalChatMessage {
|
|
879
|
+
id String @id @default(cuid())
|
|
880
|
+
sessionId String
|
|
881
|
+
seq Int
|
|
882
|
+
role String // "klien" | "hanoman"
|
|
883
|
+
text String
|
|
884
|
+
rawText String?
|
|
885
|
+
blocked Boolean @default(false)
|
|
886
|
+
blockReasons Json?
|
|
887
|
+
createdAt DateTime @default(now())
|
|
888
|
+
session PortalChatSession @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
|
889
|
+
|
|
890
|
+
@@unique([sessionId, seq])
|
|
891
|
+
}
|