hanoman 0.9.18 → 0.9.20

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.
Files changed (27) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/cli.js +63 -167
  3. package/dist/server.js +418 -639
  4. package/docs/agent-integration.md +9 -53
  5. package/package.json +1 -1
  6. package/prisma/migrations/20261007120000_project_memory/migration.sql +54 -0
  7. package/prisma/migrations/20261007130000_memory_sync/migration.sql +32 -0
  8. package/prisma/migrations/20261010070000_remove_memory_changelog/migration.sql +40 -0
  9. package/prisma/schema.prisma +3 -25
  10. package/web/assets/{DalangHanomanScreen-C1Ivdj4r.js → DalangHanomanScreen-DqzYitwv.js} +1 -1
  11. package/web/assets/{DocPreviewModal-Cw69hQk1.js → DocPreviewModal-Chk-jQ51.js} +1 -1
  12. package/web/assets/{DocsWorkspace--9rvckps.js → DocsWorkspace-DuNVIjTg.js} +1 -1
  13. package/web/assets/{IdeScreen-DxNG9eLb.js → IdeScreen-BZGVyFT5.js} +1 -1
  14. package/web/assets/{LeadScreen-CV3Lgbyd.js → LeadScreen-35VgddUo.js} +1 -1
  15. package/web/assets/{ReviewScreen-JLPOS52f.js → ReviewScreen-EkG8ywTU.js} +1 -1
  16. package/web/assets/{SchedulerScreen-UhxWcCtY.js → SchedulerScreen-ClaLLB8Y.js} +1 -1
  17. package/web/assets/SettingsScreen-liOlVCeT.js +62 -0
  18. package/web/assets/{TeamScreen-D24DsEwn.js → TeamScreen-Dzl6Ruju.js} +1 -1
  19. package/web/assets/{TerminalScreen-3nSnkwTy.js → TerminalScreen-CK3SzzgP.js} +1 -1
  20. package/web/assets/{TriageScreen-Dw6EqWar.js → TriageScreen-EtBRNg-t.js} +1 -1
  21. package/web/assets/{VpsScreen-C_rNhMi5.js → VpsScreen-9qeTHo1w.js} +1 -1
  22. package/web/assets/index-D5w059cP.js +1063 -0
  23. package/web/assets/{live-DHIFZVo0.js → live-Bz-jmiWI.js} +1 -1
  24. package/web/index.html +1 -1
  25. package/web/assets/ChangelogScreen-Bj1KreGh.js +0 -1
  26. package/web/assets/SettingsScreen-D3nVVnsZ.js +0 -62
  27. package/web/assets/index-DHVdBKua.js +0 -1053
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.18",
3
- "sha": "e6d9ceea",
4
- "builtAt": "2026-10-07T01:21:53.306Z"
2
+ "version": "0.9.20",
3
+ "sha": "121f1b81",
4
+ "builtAt": "2026-10-10T01:34:53.778Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4166,13 +4166,14 @@ var init_spec_source = __esm({
4166
4166
  function resolveMethod(id) {
4167
4167
  return (id ? METHODS[id] : void 0) ?? METHODS[DEFAULT_METHOD];
4168
4168
  }
4169
- var DEFAULT_METHOD, VERIFICATION_GATE, MATT_CLAUSE, METHODS, METHOD_IDS, uniq, PLAN_DIRS, SPEC_DIRS;
4169
+ var DEFAULT_METHOD, VERIFICATION_GATE, MATT_CLAUSE, AGENT_SKILLS_CLAUSE, METHODS, METHOD_IDS, uniq, PLAN_DIRS, SPEC_DIRS;
4170
4170
  var init_method_catalog = __esm({
4171
4171
  "../shared/src/method-catalog.ts"() {
4172
4172
  "use strict";
4173
4173
  DEFAULT_METHOD = "superpowers";
4174
4174
  VERIFICATION_GATE = "superpowers:verification-before-completion";
4175
4175
  MATT_CLAUSE = "Skill mattpocock yang kontraknya mewawancarai manusia (`/grill-me`, `/to-spec`, `/triage`) JANGAN dipakai: pakai primitif model-invoked-nya untuk menguji rancanganmu sendiri, bukan untuk mewawancarai siapa pun. Hal yang masih ambigu dan akan mempengaruhi hasil tetap JANGAN diputuskan sendiri \u2014 bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu; bila tidak, ajukan lewat jalur tanya di klausa otonomi prompt ini. `to-tickets` di fase Plan dipakai HANYA sebagai penghasil berkas plan berkotak `- [ ]` di `docs/matt/plans/`, BUKAN penerbit tiket \u2014 hanoman sendiri adalah issue tracker-nya, jadi jangan menulis ke tracker eksternal mana pun.";
4176
+ AGENT_SKILLS_CLAUSE = "Pakai skill Agent Skills langsung sesuai fase, bukan slash-command atau meta-router `using-agent-skills`. Kontrak fase, instruksi project/pengguna, dan jalur keputusan/review hanoman tetap berlaku: `spec-driven-development` hanya menyusun spec pada fase Spec, jangan menjalankan Plan atau Execute dari fase itu. Simpan spec di `docs/agent-skills/specs/` dan plan beserta SELURUH checklist task `- [ ]` di `docs/agent-skills/plans/`, dengan id backlog pada nama berkas; ini menggantikan default `SPEC.md`, `tasks/plan.md`, dan `tasks/todo.md` upstream. Jangan menimpa plan lain yang belum tuntas atau membuat tiket di tracker eksternal: hanoman adalah issue tracker-nya. Centang task di berkas plan yang sama setelah implementasi dan verifikasi. Hal ambigu yang mempengaruhi hasil mengikuti jalur tanya prompt ini; bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu.";
4176
4177
  METHODS = {
4177
4178
  // Isi `PHASE_SKILLS` (SPEC-166) dipindah APA ADANYA. Objective & Spec adalah keluaran skill
4178
4179
  // brainstorming yang di-invoke di fase Brainstorm — sengaja tak punya entri sendiri. Fase reverse
@@ -4253,6 +4254,44 @@ var init_method_catalog = __esm({
4253
4254
  "codex plugin add superpowers@openai-curated"
4254
4255
  ]
4255
4256
  }
4257
+ },
4258
+ "agent-skills": {
4259
+ id: "agent-skills",
4260
+ label: "Agent Skills (Addy Osmani)",
4261
+ planDir: "docs/agent-skills/plans",
4262
+ specDir: "docs/agent-skills/specs",
4263
+ phaseSkills: {
4264
+ Brainstorm: ["agent-skills:idea-refine"],
4265
+ Spec: ["agent-skills:spec-driven-development"],
4266
+ Audit: [
4267
+ "agent-skills:debugging-and-error-recovery",
4268
+ "agent-skills:code-review-and-quality"
4269
+ ],
4270
+ Plan: ["agent-skills:planning-and-task-breakdown"],
4271
+ Execute: [
4272
+ "agent-skills:incremental-implementation",
4273
+ "agent-skills:test-driven-development",
4274
+ "agent-skills:code-review-and-quality"
4275
+ ],
4276
+ Verifikasi: [VERIFICATION_GATE]
4277
+ },
4278
+ exitSkills: [VERIFICATION_GATE],
4279
+ extraClause: AGENT_SKILLS_CLAUSE,
4280
+ requires: ["agent-skills", "superpowers"],
4281
+ // Manifest upstream: marketplace Claude = addy-agent-skills, Codex = agent-skills.
4282
+ install: {
4283
+ claude: [
4284
+ "claude plugin marketplace add addyosmani/agent-skills",
4285
+ "claude plugin install agent-skills@addy-agent-skills",
4286
+ "claude plugin marketplace add obra/superpowers-marketplace",
4287
+ "claude plugin install superpowers@superpowers-marketplace"
4288
+ ],
4289
+ codex: [
4290
+ "codex plugin marketplace add addyosmani/agent-skills",
4291
+ "codex plugin add agent-skills@agent-skills",
4292
+ "codex plugin add superpowers@openai-curated"
4293
+ ]
4294
+ }
4256
4295
  }
4257
4296
  };
4258
4297
  METHOD_IDS = Object.keys(METHODS);
@@ -4786,7 +4825,7 @@ function cmpVersion(a, b) {
4786
4825
  }
4787
4826
  return 0;
4788
4827
  }
4789
- var zProject, zBriefPayload, zQaPayload, zGoalPayload, zSpecBlocker, zSourceChange, zManualDone, zSpec, zSpecListItem, zSpecSlim, NOTIFY_SOUNDS, zCodex, CODEX_DEFAULTS, zSourceCommon, zScheduler, SCHEDULER_DEFAULTS, zGoal, GOAL_DEFAULTS, zConflict, CONFLICT_DEFAULTS, CHANGELOG_ENGINE_DEFAULTS, zLeadEngine, zLead, LEAD_DEFAULTS, zPortalChat, PORTAL_CHAT_DEFAULTS, zPhaseCell, PHASE_OVERRIDE_LIMITS, zPhaseOverride, zPhaseOverrides, zFlowOrchestration, zOrchestration, ORCHESTRATION_DEFAULTS, zSetting, zNotification, zDocFile, zDeviceTokenView;
4828
+ var zProject, zBriefPayload, zQaPayload, zGoalPayload, zSpecBlocker, zSourceChange, zManualDone, zSpec, zSpecListItem, zSpecSlim, NOTIFY_SOUNDS, zCodex, CODEX_DEFAULTS, zSourceCommon, zScheduler, SCHEDULER_DEFAULTS, zGoal, GOAL_DEFAULTS, zConflict, CONFLICT_DEFAULTS, zLeadEngine, zLead, LEAD_DEFAULTS, zPortalChat, PORTAL_CHAT_DEFAULTS, zPhaseCell, PHASE_OVERRIDE_LIMITS, zPhaseOverride, zPhaseOverrides, zFlowOrchestration, zOrchestration, ORCHESTRATION_DEFAULTS, zSetting, zNotification, zDocFile, zDeviceTokenView;
4790
4829
  var init_entities = __esm({
4791
4830
  "../shared/src/entities.ts"() {
4792
4831
  "use strict";
@@ -4954,7 +4993,6 @@ var init_entities = __esm({
4954
4993
  effort: external_exports.string().default("xhigh")
4955
4994
  });
4956
4995
  CONFLICT_DEFAULTS = zConflict.parse({});
4957
- CHANGELOG_ENGINE_DEFAULTS = zAgentEngine.parse({});
4958
4996
  zLeadEngine = zAgentEngine;
4959
4997
  zLead = external_exports.object({
4960
4998
  enabled: external_exports.boolean().default(false),
@@ -5075,8 +5113,6 @@ var init_entities = __esm({
5075
5113
  // SPEC-409 · ADR-0091 · hanoman-lead (default mati)
5076
5114
  telegram: zTelegramSettings.default(TELEGRAM_DEFAULTS),
5077
5115
  // SPEC-476 · ADR-0096 · gateway Telegram (default mati)
5078
- changelog: zAgentEngine.default(CHANGELOG_ENGINE_DEFAULTS),
5079
- // SPEC-518 · agen pembuat changelog (opt-in, mati)
5080
5116
  portalChat: zPortalChat.default(PORTAL_CHAT_DEFAULTS),
5081
5117
  // SPEC-854 · ADR-0130 · chat portal klien (opt-in, mati)
5082
5118
  orchestration: zOrchestration.default(ORCHESTRATION_DEFAULTS),
@@ -7527,6 +7563,7 @@ var init_api = __esm({
7527
7563
  qaAttachments: (pid, rid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/attachments`,
7528
7564
  qaAttachment: (pid, rid, aid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/attachments/${encodeURIComponent(aid)}`,
7529
7565
  qaFindingBacklog: (pid, rid, fid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/findings/${encodeURIComponent(fid)}/backlog`,
7566
+ qaFindingSession: (pid, rid, fid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/findings/${encodeURIComponent(fid)}/session`,
7530
7567
  qaReportBacklog: (pid, rid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/backlog`,
7531
7568
  qaCasesImport: (pid, rid) => `${API}/projects/${encodeURIComponent(pid)}/qa/reports/${encodeURIComponent(rid)}/cases/import`,
7532
7569
  qaImport: (pid) => `${API}/projects/${encodeURIComponent(pid)}/qa/import`,
@@ -7577,10 +7614,6 @@ var init_api = __esm({
7577
7614
  // SPEC-471 · ADR-0095 · tarik & triase issue GitHub (di belakang gate cookie, capability `support`).
7578
7615
  // hanoman TIDAK PERNAH menulis ke GitHub — tak ada path komentar/close di sini, dan itu disengaja.
7579
7616
  githubPull: (id) => `${API}/projects/${encodeURIComponent(id)}/github/pull`,
7580
- // SPEC-516 · ADR-0105 · changelog per project
7581
- changelog: (id) => `${API}/projects/${encodeURIComponent(id)}/changelog`,
7582
- changelogSources: (id) => `${API}/projects/${encodeURIComponent(id)}/changelog/sources`,
7583
- changelogItem: (id, cid) => `${API}/projects/${encodeURIComponent(id)}/changelog/${encodeURIComponent(cid)}`,
7584
7617
  githubIssues: (id) => `${API}/projects/${encodeURIComponent(id)}/github/issues`,
7585
7618
  githubIssuesAccept: `${API}/github-issues/accept`,
7586
7619
  githubIssueAccept: (id) => `${API}/github-issues/${encodeURIComponent(id)}/accept`,
@@ -9457,7 +9490,7 @@ var init_docs = __esm({
9457
9490
  required: ["project", "prd"]
9458
9491
  }),
9459
9492
  // `breakdown` hidup di berkas route docs.ts, TAPI `capabilityForRoute` memetakan sub-path
9460
- // `projects/:id/*` yang tak terdaftar ke `projects:*` — hanya `docs`, `prds`, dan `changelog`
9493
+ // `projects/:id/*` yang tak terdaftar ke `projects:*` — hanya `docs` dan `prds`
9461
9494
  // yang dipetakan ke `docs:*`. Menuliskannya `docs:read` membuat uji kontrak merah, dan itulah
9462
9495
  // yang terjadi saat tool ini pertama ditulis.
9463
9496
  mode: "read",
@@ -9470,116 +9503,6 @@ var init_docs = __esm({
9470
9503
  query: query({ prd: s(a.prd) })
9471
9504
  }),
9472
9505
  shape: (raw) => raw
9473
- },
9474
- {
9475
- name: "hanoman_changelog_sources",
9476
- title: "Sumber changelog yang tersedia",
9477
- description: "Bahan mentah yang bisa dipakai membuat changelog: daftar tag git, HEAD, dan rentang backlog yang sudah selesai. Panggil ini SEBELUM hanoman_changelog_create \u2014 ia memberitahu mode mana yang mungkin (`hasRepo: false` berarti mode commit & version tak akan jalan) dan `defaultRange` yang masuk akal.",
9478
- inputSchema: obj({ properties: { project: PROJECT }, required: ["project"] }),
9479
- mode: "read",
9480
- capability: "docs:read",
9481
- samplePath: "/projects/hanoman/changelog/sources",
9482
- sampleMethod: "GET",
9483
- build: (a) => ({ method: "GET", path: `/projects/${enc(String(a.project))}/changelog/sources` }),
9484
- shape: (raw) => raw
9485
- },
9486
- {
9487
- name: "hanoman_changelog_list",
9488
- title: "Daftar changelog project",
9489
- description: "Changelog yang sudah dibuat untuk sebuah project, terbaru dulu, berhalaman. `q` menyaring judul & isi.",
9490
- inputSchema: obj({
9491
- properties: {
9492
- project: PROJECT,
9493
- q: str("Kata kunci penyaring judul & isi changelog. Kosongkan untuk semua."),
9494
- page: int("Halaman, mulai 1.", { minimum: 1 }),
9495
- limit: int("Item per halaman.", { minimum: 1, maximum: 200 })
9496
- },
9497
- required: ["project"]
9498
- }),
9499
- mode: "read",
9500
- capability: "docs:read",
9501
- samplePath: "/projects/hanoman/changelog",
9502
- sampleMethod: "GET",
9503
- build: (a) => ({
9504
- method: "GET",
9505
- path: `/projects/${enc(String(a.project))}/changelog`,
9506
- query: query({ q: s(a.q), page: n(a.page)?.toString(), limit: n(a.limit)?.toString() })
9507
- }),
9508
- shape: (raw) => raw
9509
- },
9510
- {
9511
- name: "hanoman_changelog_get",
9512
- title: "Baca satu changelog",
9513
- description: "Satu entri changelog beserta isinya, dicari menurut id di dalam project tersebut.",
9514
- inputSchema: obj({
9515
- properties: { project: PROJECT, changelog: str("Id changelog, dari hanoman_changelog_list.") },
9516
- required: ["project", "changelog"]
9517
- }),
9518
- mode: "read",
9519
- capability: "docs:read",
9520
- samplePath: "/projects/hanoman/changelog/c1",
9521
- sampleMethod: "GET",
9522
- build: (a) => ({ method: "GET", path: `/projects/${enc(String(a.project))}/changelog/${enc(String(a.changelog))}` }),
9523
- shape: (raw) => raw
9524
- },
9525
- {
9526
- name: "hanoman_changelog_create",
9527
- title: "Buat changelog",
9528
- description: "Membuat changelog baru dari salah satu dari tiga sumber. `mode` menentukan field mana yang WAJIB menyertainya: `backlog` memakai rentang tanggal (`from`/`to`, boleh kosong = seluruhnya), `commit` memakai dua sha, `version` memakai tag. Server menjawab 422 bila sumbernya tak tersedia \u2014 panggil hanoman_changelog_sources lebih dulu.",
9529
- inputSchema: obj({
9530
- properties: {
9531
- project: PROJECT,
9532
- mode: enumStr(["backlog", "commit", "version"], "Sumber changelog. Field yang menyertainya ditentukan nilai ini."),
9533
- from: str("Mode `backlog`: tanggal awal `YYYY-MM-DD`. Kosongkan untuk tanpa batas awal."),
9534
- to: str("Mode `backlog`: tanggal akhir `YYYY-MM-DD`. Harus >= `from`."),
9535
- fromSha: str("Mode `commit`: sha awal, minimal 4 karakter."),
9536
- toSha: str("Mode `commit`: sha akhir, minimal 4 karakter."),
9537
- fromTag: str("Mode `version`: tag awal. Kosongkan untuk mulai dari tag terawal."),
9538
- toTag: str("Mode `version`: tag akhir. WAJIB.")
9539
- },
9540
- required: ["project", "mode"],
9541
- // Skema ketat DI KLIEN: validator SDK menolak pasangan yang salah sebelum permintaan lahir,
9542
- // jadi agen dibimbing ke panggilan yang sah alih-alih menemukannya lewat 400 (ADR-0099 #2).
9543
- allOf: [
9544
- {
9545
- if: { properties: { mode: { const: "backlog" } }, required: ["mode"] },
9546
- then: { properties: { from: { type: "string" }, to: { type: "string" } } }
9547
- },
9548
- {
9549
- if: { properties: { mode: { const: "commit" } }, required: ["mode"] },
9550
- then: { required: ["fromSha", "toSha"] }
9551
- },
9552
- {
9553
- if: { properties: { mode: { const: "version" } }, required: ["mode"] },
9554
- then: { required: ["toTag"] }
9555
- }
9556
- ]
9557
- }),
9558
- mode: "write",
9559
- capability: "docs:write",
9560
- samplePath: "/projects/hanoman/changelog",
9561
- sampleMethod: "POST",
9562
- build: (a) => {
9563
- const mode = String(a.mode);
9564
- const body = mode === "commit" ? { mode, fromSha: String(a.fromSha), toSha: String(a.toSha) } : mode === "version" ? { mode, ...s(a.fromTag) ? { fromTag: s(a.fromTag) } : {}, toTag: String(a.toTag) } : { mode, ...s(a.from) ? { from: s(a.from) } : {}, ...s(a.to) ? { to: s(a.to) } : {} };
9565
- return { method: "POST", path: `/projects/${enc(String(a.project))}/changelog`, body };
9566
- },
9567
- shape: (raw) => raw
9568
- },
9569
- {
9570
- name: "hanoman_changelog_delete",
9571
- title: "Hapus changelog (BERBAHAYA)",
9572
- description: "BERBAHAYA \u2014 menghapus satu entri changelog secara permanen. Isinya tak tersimpan di tempat lain: changelog lahir dari generator dan tak bisa dipulihkan tanpa membuatnya ulang. Hanya muncul saat tingkat `--danger` menyala.",
9573
- inputSchema: obj({
9574
- properties: { project: PROJECT, changelog: str("Id changelog yang akan dihapus.") },
9575
- required: ["project", "changelog"]
9576
- }),
9577
- mode: "danger",
9578
- capability: "docs:write",
9579
- samplePath: "/projects/hanoman/changelog/c1",
9580
- sampleMethod: "DELETE",
9581
- build: (a) => ({ method: "DELETE", path: `/projects/${enc(String(a.project))}/changelog/${enc(String(a.changelog))}` }),
9582
- shape: (raw) => raw
9583
9506
  }
9584
9507
  ];
9585
9508
  }
@@ -12317,6 +12240,18 @@ var init_qa2 = __esm({
12317
12240
  build: (a) => ({ method: "PATCH", path: `${one(a)}/findings/${enc(String(a.finding))}`, body: findingBody(a) }),
12318
12241
  shape: (raw) => raw
12319
12242
  },
12243
+ {
12244
+ name: "hanoman_qa_finding_start_session",
12245
+ title: "Kerjakan temuan QA langsung",
12246
+ description: "Membuka sesi agen terisolasi dari temuan QA tanpa membuat backlog, membawa langkah uji dan lampiran. Memerlukan qa:write DAN sessions:write. Klik ulang memakai sesi aktif yang sama. Temuan wontfix atau sudah terkait backlog ditolak; laporan closed boleh.",
12247
+ inputSchema: obj({ properties: { project: PROJECT3, report: REPORT, finding: FINDING }, required: ["project", "report", "finding"] }),
12248
+ mode: "write",
12249
+ capability: "qa:write",
12250
+ samplePath: "/projects/p1/qa/reports/r1/findings/f1/session",
12251
+ sampleMethod: "POST",
12252
+ build: (a) => ({ method: "POST", path: `${one(a)}/findings/${enc(String(a.finding))}/session`, body: {} }),
12253
+ shape: (raw) => raw
12254
+ },
12320
12255
  {
12321
12256
  name: "hanoman_qa_finding_to_backlog",
12322
12257
  title: "Kirim temuan QA ke backlog",
@@ -12482,7 +12417,7 @@ var init_mcp = __esm({
12482
12417
  init_mcp_shape();
12483
12418
  init_mcp_catalog();
12484
12419
  init_mcp_catalog();
12485
- MCP_TOOL_SCHEMA_VERSION = 1;
12420
+ MCP_TOOL_SCHEMA_VERSION = 2;
12486
12421
  MCP_INSTRUCTIONS = [
12487
12422
  `hanoman \u2014 orchestrator backlog + dashboard. Skema tool versi ${MCP_TOOL_SCHEMA_VERSION}.`,
12488
12423
  "",
@@ -12495,42 +12430,6 @@ var init_mcp = __esm({
12495
12430
  }
12496
12431
  });
12497
12432
 
12498
- // ../shared/src/changelog.ts
12499
- var CHANGELOG_MODES, zChangelogMode, zDay, zChangelogRequest, zChangelogView;
12500
- var init_changelog = __esm({
12501
- "../shared/src/changelog.ts"() {
12502
- "use strict";
12503
- init_zod();
12504
- CHANGELOG_MODES = ["backlog", "commit", "version"];
12505
- zChangelogMode = external_exports.enum(CHANGELOG_MODES);
12506
- zDay = external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/, "format tanggal harus YYYY-MM-DD");
12507
- zChangelogRequest = external_exports.discriminatedUnion("mode", [
12508
- external_exports.object({ mode: external_exports.literal("backlog"), from: zDay.optional(), to: zDay.optional() }),
12509
- external_exports.object({ mode: external_exports.literal("commit"), fromSha: external_exports.string().trim().min(4), toSha: external_exports.string().trim().min(4) }),
12510
- external_exports.object({ mode: external_exports.literal("version"), fromTag: external_exports.string().trim().min(1).optional(), toTag: external_exports.string().trim().min(1) })
12511
- ]).superRefine((v, ctx) => {
12512
- if (v.mode === "backlog" && v.from && v.to && v.from > v.to)
12513
- ctx.addIssue({
12514
- code: external_exports.ZodIssueCode.custom,
12515
- path: ["from"],
12516
- message: "rentang tanggal terbalik \u2014 `from` harus lebih awal atau sama dengan `to`"
12517
- });
12518
- });
12519
- zChangelogView = external_exports.object({
12520
- id: external_exports.string(),
12521
- projectId: external_exports.string(),
12522
- mode: zChangelogMode,
12523
- title: external_exports.string(),
12524
- params: external_exports.unknown(),
12525
- body: external_exports.string(),
12526
- generator: external_exports.enum(["agent", "fallback"]),
12527
- warning: external_exports.string().nullable(),
12528
- itemCount: external_exports.number().int(),
12529
- createdAt: external_exports.string()
12530
- });
12531
- }
12532
- });
12533
-
12534
12433
  // ../shared/src/terminal-workspace.ts
12535
12434
  var zSessionId, zTrackSizes, zTerminalGroup, zTerminalWorkspaceV1, zTerminalWorkspaceWrite, zTerminalWorkspaceSnapshot;
12536
12435
  var init_terminal_workspace = __esm({
@@ -12795,7 +12694,6 @@ var init_src = __esm({
12795
12694
  init_mcp();
12796
12695
  init_auto_merge();
12797
12696
  init_handled_by();
12798
- init_changelog();
12799
12697
  init_cron_expr();
12800
12698
  init_terminal_workspace();
12801
12699
  init_terminal_io();
@@ -34882,6 +34780,7 @@ function createCaller(cfg, fetchImpl) {
34882
34780
  const init = {
34883
34781
  method: req.method,
34884
34782
  headers: {
34783
+ ...req.headers ?? {},
34885
34784
  Authorization: `Bearer ${cfg.token}`,
34886
34785
  Accept: "application/json",
34887
34786
  ...req.body !== void 0 ? { "Content-Type": "application/json" } : {}
@@ -34975,9 +34874,9 @@ Butuh capability \`${tool.capability}\` pada agent token.` : tool.description,
34975
34874
  problems: cfg.problems
34976
34875
  }, cfg.maxBytes));
34977
34876
  }
34978
- const req = tool.build(args);
34979
- if (!req) return text(`Tool ${tool.name} tak punya panggilan REST.`, true);
34980
- const r = await call(req, tool.name);
34877
+ const built = tool.build(args);
34878
+ if (!built) return text(`Tool ${tool.name} tak punya panggilan REST.`, true);
34879
+ const r = await call(built, tool.name);
34981
34880
  if (!r.ok) return text(r.message, true);
34982
34881
  return text(renderResult(tool.shape(r.body, args), cfg.maxBytes));
34983
34882
  }
@@ -35292,9 +35191,6 @@ var init_migrate_pg = __esm({
35292
35191
  // ADR-0159 · AgentInvocation sesudah CustomAgent: `customAgentId` menunjuk ke sana (tanpa FK).
35293
35192
  // LOCAL-only dan lazimnya TIDAK ada di sumber Postgres lama — jalur 42P01 = nol baris.
35294
35193
  "AgentInvocation",
35295
- // SPEC-516 · ADR-0105 · Changelog sesudah Project (FK projectId). Tabel ini LOCAL-only dan
35296
- // lazimnya TIDAK ada di sumber Postgres lama — jalur 42P01 memperlakukannya sebagai nol baris.
35297
- "Changelog",
35298
35194
  // SPEC-617 · ADR-0110 · ClientProjectAccess sesudah User DAN Project (FK ke keduanya).
35299
35195
  "User",
35300
35196
  "ClientProjectAccess",
@@ -35319,7 +35215,7 @@ var init_migrate_pg = __esm({
35319
35215
  "SyncConflict",
35320
35216
  "SyncTombstone",
35321
35217
  // SPEC-1215 · ADR-0166 · LOCAL-only, tanpa FK. Tabel ini tak ada di sumber Postgres lama — jalur
35322
- // 42P01 memperlakukannya sebagai nol baris (cermin AgentInvocation/Changelog). Tetap WAJIB
35218
+ // 42P01 memperlakukannya sebagai nol baris (cermin AgentInvocation). Tetap WAJIB
35323
35219
  // terdaftar: test migrate-pg menuntut PG_ORDER = seluruh model DMMF.
35324
35220
  "LogEntry",
35325
35221
  "LogCursor",
@@ -35347,7 +35243,7 @@ var init_migrate_pg = __esm({
35347
35243
  "TicketAttachment",
35348
35244
  // SPEC-843 · ADR-0124 · SpecAttachment WAJIB sesudah Spec (FK specId, cascade). Tabel ini
35349
35245
  // LOCAL-only dan lazimnya TIDAK ada di sumber Postgres lama — jalur 42P01 memperlakukannya
35350
- // sebagai nol baris, cermin Changelog.
35246
+ // sebagai nol baris, cermin SessionHistory.
35351
35247
  "SpecAttachment",
35352
35248
  // SPEC-471 · ADR-0095 · GithubIssue sesudah Project (FK projectId) DAN sesudah Spec: `specId`
35353
35249
  // memang tanpa FK, tapi memindahkannya lebih awal membuat urutan tabel tak lagi mencerminkan
@@ -35363,7 +35259,7 @@ var init_migrate_pg = __esm({
35363
35259
  "WebhookDelivery",
35364
35260
  // Workspace QA · ADR-0174 · QaReport sesudah Project (FK projectId, cascade); QaCase/QaFinding/
35365
35261
  // QaAttachment sesudah QaReport (FK reportId, cascade). Keempatnya LOCAL-only dan TIDAK ada di
35366
- // sumber Postgres lama — jalur 42P01 memperlakukannya sebagai nol baris (cermin Changelog).
35262
+ // sumber Postgres lama — jalur 42P01 memperlakukannya sebagai nol baris (cermin SessionHistory).
35367
35263
  "QaReport",
35368
35264
  "QaCase",
35369
35265
  "QaFinding",