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.
- package/dist/build-info.json +3 -3
- package/dist/cli.js +24 -1
- package/dist/server.js +337 -53
- package/docs/agent-integration.md +4 -0
- package/package.json +1 -1
- package/prisma/migrations/20260810000000_client_portal_access/migration.sql +15 -0
- package/prisma/schema.prisma +25 -1
- package/web/assets/{index-DAlC1JOD.js → index-D68Z05gR.js} +1543 -1543
- package/web/index.html +1 -1
|
@@ -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
|
@@ -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");
|
package/prisma/schema.prisma
CHANGED
|
@@ -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>".
|
|
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.
|