hanoman 0.1.12 → 0.1.13
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 +155 -13
- package/dist/server.js +898 -88
- package/package.json +1 -1
- package/prisma/migrations/20260801230000_auto_merge/migration.sql +8 -0
- package/prisma/migrations/20260801230000_custom_agent_runtime/migration.sql +8 -0
- package/prisma/migrations/20260801234500_lead_flow/migration.sql +36 -0
- package/prisma/schema.prisma +42 -0
- package/web/assets/{index-W4J6iiyI.js → index-DRwKLKdp.js} +1566 -1566
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- SPEC-486 · ADR-0103 · kebijakan auto-merge saat sesi selesai.
|
|
2
|
+
--
|
|
3
|
+
-- ADITIF & nullable tanpa default → `ADD COLUMN` polos (pola migration SPEC-447). Yang dilarang
|
|
4
|
+
-- SQLite adalah `ADD COLUMN … DEFAULT <non-konstan>`, bukan `ADD COLUMN` itu sendiri. Baris lama
|
|
5
|
+
-- tetap NULL, dan NULL berarti "tanpa auto-merge" di Project / "warisi project" di Spec —
|
|
6
|
+
-- jadi tak ada backfill, dan project lama tak berubah perilaku satu langkah git pun.
|
|
7
|
+
ALTER TABLE "Project" ADD COLUMN "autoMerge" JSONB;
|
|
8
|
+
ALTER TABLE "Spec" ADD COLUMN "autoMerge" JSONB;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- SPEC-484 · ADR-0101 · penyaring mesin sesi per definisi agen.
|
|
2
|
+
--
|
|
3
|
+
-- NULLABLE TANPA DEFAULT, dan itu yang membuat migration ini satu baris: setiap baris lama tetap
|
|
4
|
+
-- NULL = "ikut sesi induk" = perilaku ADR-0094 apa adanya, jadi tak ada backfill dan tak ada satu
|
|
5
|
+
-- pun roster yang berubah saat rilis ini mendarat. Larangan SQLite atas
|
|
6
|
+
-- `ADD COLUMN … DEFAULT CURRENT_TIMESTAMP` (migration SPEC-408) tak berlaku di sini justru karena
|
|
7
|
+
-- kolomnya tanpa default — tabel tak perlu diredefinisi.
|
|
8
|
+
ALTER TABLE "CustomAgent" ADD COLUMN "runtime" TEXT;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- SPEC-485 · ADR-0102 · rantai keputusan lead + pilihan jamak.
|
|
2
|
+
--
|
|
3
|
+
-- Ditulis tangan (bukan `migrate dev`): worktree tetangga membuat `migrate dev` me-reset DB saat
|
|
4
|
+
-- ada drift. ADITIF murni — satu tabel baru + empat kolom NULLABLE tanpa default, tak ada tabel
|
|
5
|
+
-- diredefinisi, tak ada baris disentuh. Larangan SQLite atas `ADD COLUMN … DEFAULT <non-konstan>`
|
|
6
|
+
-- (lihat migration SPEC-408) tak berlaku di sini karena tak ada default sama sekali pada ALTER.
|
|
7
|
+
--
|
|
8
|
+
-- `LeadFlow` LOCAL-only: tanpa kolom `version`, tak pernah masuk changefeed sync — barisnya
|
|
9
|
+
-- menunjuk sesi tmux & worktree di MESIN INI, persis alasan `LeadDecision` juga tak disync.
|
|
10
|
+
CREATE TABLE "LeadFlow" (
|
|
11
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
12
|
+
"projectId" TEXT NOT NULL,
|
|
13
|
+
"specId" TEXT,
|
|
14
|
+
"sessionId" TEXT,
|
|
15
|
+
"gate" TEXT NOT NULL,
|
|
16
|
+
"status" TEXT NOT NULL DEFAULT 'menunggu',
|
|
17
|
+
"title" TEXT NOT NULL,
|
|
18
|
+
"steps" INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
"closeReason" TEXT,
|
|
20
|
+
"openedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
+
"closedAt" DATETIME,
|
|
22
|
+
"expiresAt" DATETIME NOT NULL,
|
|
23
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
24
|
+
"updatedAt" DATETIME NOT NULL
|
|
25
|
+
);
|
|
26
|
+
CREATE INDEX "LeadFlow_projectId_createdAt_idx" ON "LeadFlow"("projectId", "createdAt");
|
|
27
|
+
CREATE INDEX "LeadFlow_status_idx" ON "LeadFlow"("status");
|
|
28
|
+
|
|
29
|
+
-- `choices` menggantikan pasangan skalar `choice`/`choiceIndex` sebagai bentuk yang berlaku; yang
|
|
30
|
+
-- lama DIPERTAHANKAN dan diisi dari `choices[0]` supaya pembaca lama (dan baris pra-migrasi) tetap
|
|
31
|
+
-- terbaca tanpa backfill apa pun.
|
|
32
|
+
ALTER TABLE "LeadDecision" ADD COLUMN "flowId" TEXT;
|
|
33
|
+
ALTER TABLE "LeadDecision" ADD COLUMN "step" INTEGER;
|
|
34
|
+
ALTER TABLE "LeadDecision" ADD COLUMN "choices" JSONB;
|
|
35
|
+
ALTER TABLE "LeadDecision" ADD COLUMN "select" JSONB;
|
|
36
|
+
CREATE INDEX "LeadDecision_flowId_idx" ON "LeadDecision"("flowId");
|
package/prisma/schema.prisma
CHANGED
|
@@ -21,6 +21,9 @@ model Project {
|
|
|
21
21
|
helpEnabled Boolean @default(false) // SPEC-253 · opt-in Help Center publik
|
|
22
22
|
schedulerOptIn Boolean @default(false) // SPEC-294 · ADR-0072 · opt-in scheduler otonom (LOCAL — tak masuk FIELDS sync)
|
|
23
23
|
leadOptIn Boolean @default(false) // SPEC-409 · ADR-0091 · opt-in hanoman-lead (LOCAL — cermin schedulerOptIn)
|
|
24
|
+
// SPEC-486 · ADR-0103 · kebijakan auto-merge saat backlog item selesai (LOCAL — tak masuk
|
|
25
|
+
// FIELDS sync, cermin repoDir/schedulerOptIn). null = tanpa auto-merge (default, nol backfill).
|
|
26
|
+
autoMerge Json?
|
|
24
27
|
specs Spec[]
|
|
25
28
|
tickets Ticket[]
|
|
26
29
|
customAgents CustomAgent[] // SPEC-450 · ADR-0094 · custom agent milik project ini
|
|
@@ -54,6 +57,9 @@ model Spec {
|
|
|
54
57
|
// dan kolom ikut FIELDS.spec sync apa adanya. Integritas ditegakkan di boundary route +
|
|
55
58
|
// pembersihan saat spec dihapus, bukan FK.
|
|
56
59
|
dependsOn Json?
|
|
60
|
+
// SPEC-486 · ADR-0103 · override kebijakan auto-merge untuk item ini. null = warisi project.
|
|
61
|
+
// `Json?` dengan alasan yang sama seperti dependsOn: blok dibaca utuh, tak pernah difilter.
|
|
62
|
+
autoMerge Json?
|
|
57
63
|
updatedAt DateTime @updatedAt
|
|
58
64
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
59
65
|
}
|
|
@@ -82,6 +88,7 @@ model CustomAgent {
|
|
|
82
88
|
tools Json?
|
|
83
89
|
model String?
|
|
84
90
|
mentions Json?
|
|
91
|
+
runtime String? // SPEC-484 · ADR-0101 · penyaring mesin sesi; null = ikut sesi induk
|
|
85
92
|
enabled Boolean @default(true)
|
|
86
93
|
version Int @default(0) // SPEC-213 · version-stamp sync (ADR-0045)
|
|
87
94
|
createdAt DateTime @default(now())
|
|
@@ -371,6 +378,33 @@ model SchedulerQueueItem {
|
|
|
371
378
|
@@index([status])
|
|
372
379
|
}
|
|
373
380
|
|
|
381
|
+
// SPEC-485 · ADR-0102 · satu RANTAI keputusan lead: beberapa pertanyaan berurutan yang satu urusan,
|
|
382
|
+
// dari pertanyaan pertama sampai submit akhir. Sebelum model ini "alur" hanya ada sebagai kebetulan
|
|
383
|
+
// (baris jejak yang berdekatan waktunya), jadi tak ada tempat untuk menegakkan "pertanyaan lanjutan
|
|
384
|
+
// hanya boleh masuk ke alur yang masih aktif" dan tak ada yang bisa ditanya "sudah di-submit belum".
|
|
385
|
+
//
|
|
386
|
+
// LOCAL-ONLY (tanpa `version`, tak pernah disync) dan TANPA FK — cermin LeadDecision di bawah:
|
|
387
|
+
// id project/spec/sesi boleh lenyap tanpa menyeret jejaknya.
|
|
388
|
+
model LeadFlow {
|
|
389
|
+
id String @id @default(cuid())
|
|
390
|
+
projectId String
|
|
391
|
+
specId String?
|
|
392
|
+
sessionId String?
|
|
393
|
+
gate String // pintu yang membuka rantai (contract|detected|pulse)
|
|
394
|
+
status String @default("menunggu") // menunggu | sebagian | selesai | dibatalkan
|
|
395
|
+
title String // pertanyaan pertama, terpangkas — ini yang dibaca operator
|
|
396
|
+
steps Int @default(0)
|
|
397
|
+
closeReason String? // tunggal | submit | operator | kedaluwarsa
|
|
398
|
+
openedAt DateTime @default(now())
|
|
399
|
+
closedAt DateTime?
|
|
400
|
+
expiresAt DateTime // pagar anti-menggantung; penyapunya menumpang tick lead
|
|
401
|
+
createdAt DateTime @default(now())
|
|
402
|
+
updatedAt DateTime @updatedAt
|
|
403
|
+
|
|
404
|
+
@@index([projectId, createdAt])
|
|
405
|
+
@@index([status])
|
|
406
|
+
}
|
|
407
|
+
|
|
374
408
|
// SPEC-409 · ADR-0091 · jejak keputusan hanoman-lead. Data BARU yang harus bertahan (bukan nilai
|
|
375
409
|
// turunan seperti coverage/PRD, ADR-0011/0018): pertanyaan yang ditanyakan sesi yang sudah mati,
|
|
376
410
|
// dan alasan yang dipakai lead, tak bisa dihitung ulang dari sumber mana pun.
|
|
@@ -402,12 +436,20 @@ model LeadDecision {
|
|
|
402
436
|
choiceIndex Int? // 1-basis, sepasang dengan `choice`
|
|
403
437
|
options Json? // string[] — daftar opsi yang DIKIRIM peminta, supaya jejak bisa diaudit
|
|
404
438
|
missing Json? // string[] — apa yang kurang bila lead menyatakan konteksnya tak cukup
|
|
439
|
+
// SPEC-485 · ADR-0102 · aditif & nullable: baris lama sah apa adanya. `choices` adalah bentuk
|
|
440
|
+
// penyimpanan yang BERLAKU; `choice`/`choiceIndex` di atas tinggal turunan `choices[0]`, dan
|
|
441
|
+
// baris pra-migrasi diturunkan balik jadi `choices` saat dibaca (kompatibilitas mundur).
|
|
442
|
+
flowId String? // rantai tempat langkah ini duduk
|
|
443
|
+
step Int? // urutan langkah dalam rantai, 1-basis
|
|
444
|
+
choices Json? // {index,option}[] — SELALU daftar
|
|
445
|
+
select Json? // {mode,min,max} sebagaimana dikirim peminta
|
|
405
446
|
createdAt DateTime @default(now())
|
|
406
447
|
updatedAt DateTime @updatedAt
|
|
407
448
|
|
|
408
449
|
@@index([projectId, createdAt])
|
|
409
450
|
@@index([specId])
|
|
410
451
|
@@index([sessionId])
|
|
452
|
+
@@index([flowId])
|
|
411
453
|
}
|
|
412
454
|
|
|
413
455
|
// SPEC-215 · ADR-0049 · LOCAL-ONLY: override config runtime (env → DB). Tak pernah disync.
|