hanoman 0.1.23 → 0.1.25

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.
@@ -145,6 +145,10 @@ token selalu **403**, apa pun capability-nya, dan tak ada capability yang bisa m
145
145
  mengalir keluar (ADR-0100)
146
146
  - `/api/telegram/settings`, `/api/telegram/test`, `/api/telegram/credentials` — permukaan
147
147
  **kredensial** (bot token & agent token), beda dari sisa `/api/telegram*` (ADR-0097)
148
+ - `/api/portal*` — portal klien: isinya ditentukan **akun yang login** (`ClientProjectAccess`), jadi
149
+ tak ada capability yang bisa berarti apa pun di sana. Backlog & tiket yang sama tersedia lewat
150
+ `/api/specs` dan `/api/tickets` dengan capability `backlog`/`support` (ADR-0110)
151
+ - `/api/client-accounts*` — membuat & mencabut akun klien beserta password awalnya (ADR-0110)
148
152
  - `POST /api/update/apply` dan tulis lain di bawah prefix status (`/api/limits`, `/api/update`,
149
153
  `/api/events`, `/api/fs`, `/api/health`) — **baca**-nya terbuka untuk token mana pun, **tulis**-nya
150
154
  cookie-only
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanoman",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "description": "Orchestrator + dashboard workflow docs-driven untuk sesi Claude Code / Codex",
5
5
  "type": "module",
6
6
  "repository": {
@@ -0,0 +1,15 @@
1
+ -- SPEC-617 · ADR-0110 · peran user + pemetaan akun klien → project.
2
+ -- Additif & aman untuk DB yang sudah berjalan: user lama mendapat role 'admin' lewat DEFAULT,
3
+ -- jadi tak ada akses yang putus. (SQLite hanya melarang DEFAULT CURRENT_TIMESTAMP.)
4
+ ALTER TABLE "User" ADD COLUMN "role" TEXT NOT NULL DEFAULT 'admin';
5
+ ALTER TABLE "User" ADD COLUMN "disabled" BOOLEAN NOT NULL DEFAULT false;
6
+
7
+ CREATE TABLE "ClientProjectAccess" (
8
+ "id" TEXT NOT NULL PRIMARY KEY,
9
+ "userId" TEXT NOT NULL,
10
+ "projectId" TEXT NOT NULL,
11
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ CONSTRAINT "ClientProjectAccess_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
13
+ CONSTRAINT "ClientProjectAccess_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE
14
+ );
15
+ CREATE UNIQUE INDEX "ClientProjectAccess_userId_projectId_key" ON "ClientProjectAccess"("userId", "projectId");
@@ -29,6 +29,7 @@ model Project {
29
29
  customAgents CustomAgent[] // SPEC-450 · ADR-0094 · custom agent milik project ini
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
+ clientAccess ClientProjectAccess[] // SPEC-617 · ADR-0110 · akun klien yang boleh melihat project ini
32
33
  }
33
34
 
34
35
  model Spec {
@@ -188,14 +189,37 @@ model Notification {
188
189
  readAt DateTime?
189
190
  }
190
191
 
191
- // SPEC-169 · auth. passwordHash = scrypt "<saltHex>:<hashHex>". Tak ada RBAC — semua user setara.
192
+ // SPEC-169 · auth. passwordHash = scrypt "<saltHex>:<hashHex>".
193
+ // SPEC-617 · ADR-0110 · dua peran: `admin` (operator, akses penuh seperti sebelumnya) dan
194
+ // `client` (portal baca-saja ber-scope project). Default `"admin"` DISENGAJA: itulah yang
195
+ // membuat migrasi aman untuk instance yang sudah berjalan — setiap baris lama otomatis admin,
196
+ // tak ada akses yang putus dan tak ada backfill manual.
192
197
  model User {
193
198
  id String @id @default(cuid())
194
199
  email String @unique
195
200
  passwordHash String
201
+ role String @default("admin")
202
+ // SPEC-617 · nonaktif ditolak di login DAN di lookupSession; hanya menutup login berarti
203
+ // cookie yang sudah terbit tetap hidup sampai 7 hari (pencabutan yang tak mencabut).
204
+ disabled Boolean @default(false)
196
205
  createdAt DateTime @default(now())
197
206
  sessions Session[]
198
207
  deviceTokens DeviceToken[]
208
+ projectAccess ClientProjectAccess[]
209
+ }
210
+
211
+ // SPEC-617 · ADR-0110 · project yang boleh dilihat sebuah akun klien. Tabel join, bukan kolom
212
+ // Json: SQLite melarang scalar list, dan relasi memberi cascade delete gratis di kedua sisi.
213
+ // LOCAL-only — cermin User/Session/AgentToken, tak pernah masuk SYNCED (services/sync.ts).
214
+ model ClientProjectAccess {
215
+ id String @id @default(cuid())
216
+ userId String
217
+ projectId String
218
+ createdAt DateTime @default(now())
219
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
220
+ project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
221
+
222
+ @@unique([userId, projectId])
199
223
  }
200
224
 
201
225
  // SPEC-169 · sesi opaque revocable. id = sha256(token); token asli hanya ada di cookie httpOnly.