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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanoman",
3
- "version": "0.1.50",
3
+ "version": "0.1.52",
4
4
  "description": "Orchestrator + dashboard workflow docs-driven untuk sesi Claude Code / Codex",
5
5
  "type": "module",
6
6
  "repository": {
@@ -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");
@@ -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
+ }