hanoman 0.5.0 → 0.6.0

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 (25) hide show
  1. package/README.md +2 -0
  2. package/dist/build-info.json +3 -3
  3. package/dist/cli.js +213 -27
  4. package/dist/server.js +529 -155
  5. package/package.json +1 -1
  6. package/web/assets/{ChangelogScreen-CqVppy70.js → ChangelogScreen-DVMpzy2Y.js} +1 -1
  7. package/web/assets/{DalangHanomanScreen-DRFC8ZdR.js → DalangHanomanScreen-aY89PmaJ.js} +1 -1
  8. package/web/assets/{DocPreviewModal-Di28IHju.js → DocPreviewModal-BTwj2rmX.js} +1 -1
  9. package/web/assets/{DocsWorkspace-DY0x50eq.js → DocsWorkspace-CgM5rgcr.js} +1 -1
  10. package/web/assets/{IdeScreen-BpSi7o5r.js → IdeScreen-B7oDlNQ0.js} +1 -1
  11. package/web/assets/{LeadScreen-BRzdha5a.js → LeadScreen-BzNU_kBC.js} +1 -1
  12. package/web/assets/{ReviewScreen-D2SwZTqF.js → ReviewScreen-Dk0Zy4jJ.js} +1 -1
  13. package/web/assets/{SchedulerScreen-w6hID1yX.js → SchedulerScreen-CxYqEqnw.js} +1 -1
  14. package/web/assets/SettingsScreen-D1Fop_V6.js +62 -0
  15. package/web/assets/{TeamScreen-D0W-oNAi.js → TeamScreen-DwtrDuZG.js} +1 -1
  16. package/web/assets/TerminalScreen-CViC7rot.js +9 -0
  17. package/web/assets/{TriageScreen-CmVGUNpA.js → TriageScreen-DjCXx0F4.js} +1 -1
  18. package/web/assets/{VpsScreen-BKoJ_dAB.js → VpsScreen-C2WoJQ_j.js} +1 -1
  19. package/web/assets/{diff-view-B_pIZnWa.js → diff-view-Bep86yt6.js} +1 -1
  20. package/web/assets/index-Bd9gXx1g.js +923 -0
  21. package/web/assets/{live-DJzk8BTb.js → live-BlNZnTbo.js} +1 -1
  22. package/web/index.html +1 -1
  23. package/web/assets/SettingsScreen-DC4OFYQ-.js +0 -62
  24. package/web/assets/TerminalScreen-B2keWEDd.js +0 -9
  25. package/web/assets/index-C_-gADIr.js +0 -923
package/README.md CHANGED
@@ -107,6 +107,8 @@ hanoman update # npm i -g hanoman@latest --prefer-online
107
107
  ```
108
108
 
109
109
  Sesudah `hanoman update`, instance yang berjalan perlu di-restart (mis. `systemctl restart hanoman`).
110
+ Saat boot pertama sesudah install/update, Hanoman menyegarkan default model/effort bawaan dan
111
+ matriks subagent. Nilai yang pernah diedit user ditandai dan dipertahankan; tidak perlu migration SQL.
110
112
 
111
113
  ## Konfigurasi
112
114
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.5.0",
3
- "sha": "c507df84",
4
- "builtAt": "2026-09-14T23:17:43.632Z"
2
+ "version": "0.6.0",
3
+ "sha": "61bc006c",
4
+ "builtAt": "2026-09-17T03:44:44.300Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4534,6 +4534,189 @@ var init_logs = __esm({
4534
4534
  }
4535
4535
  });
4536
4536
 
4537
+ // ../shared/src/orchestration.ts
4538
+ var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName;
4539
+ var init_orchestration = __esm({
4540
+ "../shared/src/orchestration.ts"() {
4541
+ "use strict";
4542
+ ORCHESTRATION_FLOWS = [
4543
+ "feature",
4544
+ "qa",
4545
+ "scaffold",
4546
+ "reverse",
4547
+ "prd",
4548
+ "audit",
4549
+ "breakdown",
4550
+ "goal",
4551
+ "no_effort"
4552
+ ];
4553
+ FLOW_PHASES = {
4554
+ feature: ["Brainstorm", "Objective", "Spec", "Plan", "Execute"],
4555
+ qa: ["Audit", "Spec", "Plan", "Execute"],
4556
+ scaffold: ["Brainstorm", "Objective", "Doc index"],
4557
+ reverse: ["Scan", "Docs teknis", "Wawancara", "Konvensi & index", "Serah terima"],
4558
+ prd: ["Brainstorm", "PRD"],
4559
+ audit: ["Audit", "Laporan"],
4560
+ breakdown: ["Analisis", "Breakdown"],
4561
+ // SPEC-337 · ADR-0075 · audit lintas project: fase & stage-map identik audit-only, scope-nya
4562
+ // yang berbeda (project utama + tetangga ProjectLink).
4563
+ // SPEC-407 · ADR-0089 · backlog goal: tak ada fase perencanaan sama sekali. `Goal` = kerjakan,
4564
+ // `Verifikasi` = buktikan. Kedua nama unik lintas daftar ini — syarat peta REACHED di server,
4565
+ // yang berkunci nama fase saja.
4566
+ goal: ["Goal", "Verifikasi"],
4567
+ // SPEC-825 · ADR-0123 · task remeh: SATU fase. Nama `Kerjakan` unik lintas daftar ini — syarat
4568
+ // peta REACHED server, yang berkunci nama fase saja.
4569
+ no_effort: ["Kerjakan"]
4570
+ };
4571
+ PHASE_AGENT_PREFIX = "hanoman-fase-";
4572
+ isPhaseAgentName = (name) => name.startsWith(PHASE_AGENT_PREFIX);
4573
+ }
4574
+ });
4575
+
4576
+ // ../shared/src/runtime-defaults.ts
4577
+ var RUNTIME_DEFAULTS_VERSION, zRuntimeDefaultState, zBuiltinRuntimeDefaults, cell, flow, BUILTIN_ORCHESTRATION_DEFAULTS, seededFlows, BUILTIN_RUNTIME_DEFAULTS;
4578
+ var init_runtime_defaults = __esm({
4579
+ "../shared/src/runtime-defaults.ts"() {
4580
+ "use strict";
4581
+ init_orchestration();
4582
+ init_zod();
4583
+ RUNTIME_DEFAULTS_VERSION = "2026-09-17-v1";
4584
+ zRuntimeDefaultState = external_exports.enum(["seeded", "user"]);
4585
+ zBuiltinRuntimeDefaults = external_exports.object({
4586
+ version: external_exports.string().default(RUNTIME_DEFAULTS_VERSION),
4587
+ claude: external_exports.object({
4588
+ model: zRuntimeDefaultState.default("seeded"),
4589
+ effort: zRuntimeDefaultState.default("seeded")
4590
+ }).default({}),
4591
+ codex: external_exports.object({
4592
+ model: zRuntimeDefaultState.default("seeded"),
4593
+ effort: zRuntimeDefaultState.default("seeded")
4594
+ }).default({}),
4595
+ orchestration: external_exports.record(external_exports.string(), zRuntimeDefaultState).default({})
4596
+ });
4597
+ cell = (model, effort) => ({ model, effort });
4598
+ flow = (claude, codex, enabled = true) => ({ enabled, claude, codex });
4599
+ BUILTIN_ORCHESTRATION_DEFAULTS = {
4600
+ feature: flow(
4601
+ {
4602
+ Brainstorm: cell("claude-sonnet-5", "medium"),
4603
+ Objective: cell("claude-sonnet-5", "medium"),
4604
+ Spec: cell("claude-opus-5", "medium"),
4605
+ Plan: cell("claude-sonnet-5", "medium"),
4606
+ Execute: cell("claude-sonnet-5", "medium")
4607
+ },
4608
+ {
4609
+ Brainstorm: cell("gpt-5.6-terra", "medium"),
4610
+ Objective: cell("gpt-5.6-terra", "medium"),
4611
+ Spec: cell("gpt-5.6-sol", "medium"),
4612
+ Plan: cell("gpt-5.6-terra", "medium"),
4613
+ Execute: cell("gpt-5.6-terra", "medium")
4614
+ }
4615
+ ),
4616
+ qa: flow(
4617
+ {
4618
+ Audit: cell("claude-sonnet-5", "medium"),
4619
+ Spec: cell("claude-opus-5", "medium"),
4620
+ Plan: cell("claude-sonnet-5", "medium"),
4621
+ Execute: cell("claude-sonnet-5", "medium")
4622
+ },
4623
+ {
4624
+ Audit: cell("gpt-5.6-terra", "medium"),
4625
+ Spec: cell("gpt-5.6-sol", "medium"),
4626
+ Plan: cell("gpt-5.6-terra", "medium"),
4627
+ Execute: cell("gpt-5.6-terra", "medium")
4628
+ }
4629
+ ),
4630
+ scaffold: flow(
4631
+ {
4632
+ Brainstorm: cell("claude-sonnet-5", "medium"),
4633
+ Objective: cell("claude-sonnet-5", "medium"),
4634
+ "Doc index": cell("claude-opus-5", "medium")
4635
+ },
4636
+ {
4637
+ Brainstorm: cell("gpt-5.6-terra", "medium"),
4638
+ Objective: cell("gpt-5.6-terra", "medium"),
4639
+ "Doc index": cell("gpt-5.6-sol", "medium")
4640
+ }
4641
+ ),
4642
+ reverse: flow(
4643
+ {
4644
+ Scan: cell("claude-sonnet-5", "medium"),
4645
+ "Docs teknis": cell("claude-sonnet-5", "medium"),
4646
+ Wawancara: cell("claude-sonnet-5", "medium"),
4647
+ "Konvensi & index": cell("claude-sonnet-5", "medium"),
4648
+ "Serah terima": cell("claude-sonnet-5", "medium")
4649
+ },
4650
+ {
4651
+ Scan: cell("gpt-5.6-terra", "medium"),
4652
+ "Docs teknis": cell("gpt-5.6-terra", "medium"),
4653
+ Wawancara: cell("gpt-5.6-terra", "medium"),
4654
+ "Konvensi & index": cell("gpt-5.6-terra", "medium"),
4655
+ "Serah terima": cell("gpt-5.6-terra", "medium")
4656
+ }
4657
+ ),
4658
+ prd: flow(
4659
+ {
4660
+ Brainstorm: cell("claude-sonnet-5", "medium"),
4661
+ PRD: cell("claude-opus-5", "medium")
4662
+ },
4663
+ {
4664
+ Brainstorm: cell("gpt-5.6-terra", "medium"),
4665
+ PRD: cell("gpt-5.6-sol", "medium")
4666
+ }
4667
+ ),
4668
+ audit: flow(
4669
+ {
4670
+ Audit: cell("claude-sonnet-5", "medium"),
4671
+ Laporan: cell("claude-sonnet-5", "medium")
4672
+ },
4673
+ {
4674
+ Audit: cell("gpt-5.6-terra", "medium"),
4675
+ Laporan: cell("gpt-5.6-terra", "medium")
4676
+ }
4677
+ ),
4678
+ breakdown: flow(
4679
+ {
4680
+ Analisis: cell("claude-opus-5", "medium"),
4681
+ Breakdown: cell("claude-opus-5", "medium")
4682
+ },
4683
+ {
4684
+ Analisis: cell("gpt-5.6-sol", "medium"),
4685
+ Breakdown: cell("gpt-5.6-sol", "medium")
4686
+ }
4687
+ ),
4688
+ goal: flow(
4689
+ {
4690
+ Goal: cell("claude-sonnet-5", "medium"),
4691
+ Verifikasi: cell("claude-sonnet-5", "medium")
4692
+ },
4693
+ {
4694
+ Goal: cell("gpt-5.6-terra", "medium"),
4695
+ Verifikasi: cell("gpt-5.6-terra", "medium")
4696
+ }
4697
+ ),
4698
+ no_effort: flow(
4699
+ { Kerjakan: cell("claude-haiku-4-5", "low") },
4700
+ { Kerjakan: cell("gpt-5.6-terra", "low") },
4701
+ false
4702
+ )
4703
+ };
4704
+ seededFlows = Object.fromEntries(ORCHESTRATION_FLOWS.flatMap((flow2) => [
4705
+ [`${flow2}.enabled`, "seeded"],
4706
+ ...["claude", "codex"].flatMap((runtime) => FLOW_PHASES[flow2].flatMap((phase) => [
4707
+ [`${flow2}.${runtime}.${phase}.model`, "seeded"],
4708
+ [`${flow2}.${runtime}.${phase}.effort`, "seeded"]
4709
+ ]))
4710
+ ]));
4711
+ BUILTIN_RUNTIME_DEFAULTS = {
4712
+ version: RUNTIME_DEFAULTS_VERSION,
4713
+ claude: { model: "seeded", effort: "seeded" },
4714
+ codex: { model: "seeded", effort: "seeded" },
4715
+ orchestration: seededFlows
4716
+ };
4717
+ }
4718
+ });
4719
+
4537
4720
  // ../shared/src/entities.ts
4538
4721
  function cmpVersion(a, b) {
4539
4722
  const pa = a.split(".").map(Number);
@@ -4544,7 +4727,7 @@ function cmpVersion(a, b) {
4544
4727
  }
4545
4728
  return 0;
4546
4729
  }
4547
- var zProject, zBriefPayload, zQaPayload, zGoalPayload, zSpecBlocker, zSourceChange, zManualDone, zSpec, 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, zFlowOrchestration, zOrchestration, ORCHESTRATION_DEFAULTS, zSetting, zNotification, zDocFile, zDeviceTokenView;
4730
+ var zProject, zBriefPayload, zQaPayload, zGoalPayload, zSpecBlocker, zSourceChange, zManualDone, zSpec, 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, zPhaseOverride, zPhaseOverrides, zFlowOrchestration, zOrchestration, ORCHESTRATION_DEFAULTS, zSetting, zNotification, zDocFile, zDeviceTokenView;
4548
4731
  var init_entities = __esm({
4549
4732
  "../shared/src/entities.ts"() {
4550
4733
  "use strict";
@@ -4556,6 +4739,7 @@ var init_entities = __esm({
4556
4739
  init_method_catalog();
4557
4740
  init_relay();
4558
4741
  init_logs();
4742
+ init_runtime_defaults();
4559
4743
  zProject = external_exports.object({
4560
4744
  id: external_exports.string(),
4561
4745
  name: external_exports.string(),
@@ -4666,8 +4850,8 @@ var init_entities = __esm({
4666
4850
  "fanfare"
4667
4851
  ];
4668
4852
  zCodex = external_exports.object({
4669
- model: external_exports.string().default("gpt-5.6-sol"),
4670
- effort: external_exports.string().default("xhigh")
4853
+ model: external_exports.string().default("gpt-5.6-terra"),
4854
+ effort: external_exports.string().default("medium")
4671
4855
  });
4672
4856
  CODEX_DEFAULTS = zCodex.parse({});
4673
4857
  zSourceCommon = { enabled: external_exports.boolean().default(false) };
@@ -4758,6 +4942,11 @@ var init_entities = __esm({
4758
4942
  model: external_exports.string().nullable().default(null),
4759
4943
  effort: external_exports.string().nullable().default(null)
4760
4944
  });
4945
+ zPhaseOverride = external_exports.object({
4946
+ model: external_exports.string().optional(),
4947
+ effort: external_exports.string().optional()
4948
+ });
4949
+ zPhaseOverrides = external_exports.record(external_exports.string(), zPhaseOverride);
4761
4950
  zFlowOrchestration = external_exports.object({
4762
4951
  enabled: external_exports.boolean().default(true),
4763
4952
  claude: external_exports.record(external_exports.string(), zPhaseCell).default({}),
@@ -4774,10 +4963,10 @@ var init_entities = __esm({
4774
4963
  goal: zFlowOrchestration.default({}),
4775
4964
  no_effort: zFlowOrchestration.default({})
4776
4965
  });
4777
- ORCHESTRATION_DEFAULTS = zOrchestration.parse({});
4966
+ ORCHESTRATION_DEFAULTS = zOrchestration.parse(BUILTIN_ORCHESTRATION_DEFAULTS);
4778
4967
  zSetting = external_exports.object({
4779
- model: external_exports.string().default("claude-opus-5"),
4780
- effort: external_exports.string().default("xhigh"),
4968
+ model: external_exports.string().default("claude-sonnet-5"),
4969
+ effort: external_exports.string().default("medium"),
4781
4970
  autoDefault: external_exports.boolean(),
4782
4971
  autoScaffold: external_exports.boolean(),
4783
4972
  notifyFail: external_exports.boolean(),
@@ -4838,7 +5027,10 @@ var init_entities = __esm({
4838
5027
  builtinAgents: external_exports.record(external_exports.string(), external_exports.string()).default({}),
4839
5028
  // SPEC-950 · marker safety policy lokal. Terpisah dari fingerprint konten agar policy sekali
4840
5029
  // jalan tidak membuat seed memperlakukan konfigurasi operator sebagai bawaan.
4841
- builtinAgentPolicies: external_exports.record(external_exports.string(), external_exports.string()).default({})
5030
+ builtinAgentPolicies: external_exports.record(external_exports.string(), external_exports.string()).default({}),
5031
+ // Marker lokal per bagian: `seeded` boleh menerima rekomendasi baru saat update, `user` harus
5032
+ // dipertahankan. Setting tidak ikut sync, sehingga keputusan operator tetap milik mesin ini.
5033
+ builtinRuntimeDefaults: zBuiltinRuntimeDefaults.default(BUILTIN_RUNTIME_DEFAULTS)
4842
5034
  });
4843
5035
  zNotification = external_exports.object({
4844
5036
  id: external_exports.string(),
@@ -4872,16 +5064,6 @@ var init_entities = __esm({
4872
5064
  }
4873
5065
  });
4874
5066
 
4875
- // ../shared/src/orchestration.ts
4876
- var PHASE_AGENT_PREFIX, isPhaseAgentName;
4877
- var init_orchestration = __esm({
4878
- "../shared/src/orchestration.ts"() {
4879
- "use strict";
4880
- PHASE_AGENT_PREFIX = "hanoman-fase-";
4881
- isPhaseAgentName = (name) => name.startsWith(PHASE_AGENT_PREFIX);
4882
- }
4883
- });
4884
-
4885
5067
  // ../shared/src/orchestration-plan.ts
4886
5068
  function codexNativeAgentsSupported(version3) {
4887
5069
  const parsed = version3 ? /(\d+)\.(\d+)\.(\d+)/.exec(version3)?.[0] : null;
@@ -6347,6 +6529,9 @@ var init_dto = __esm({
6347
6529
  flow: zFlow,
6348
6530
  model: external_exports.string().optional(),
6349
6531
  effort: external_exports.string().optional(),
6532
+ // Override model/effort subagent hanya berlaku untuk sesi ini; kosong berarti memakai
6533
+ // rekomendasi bawaan atau matriks Settings pada fase tersebut.
6534
+ phaseOverrides: zPhaseOverrides.optional(),
6350
6535
  goal: external_exports.boolean().optional(),
6351
6536
  goalCondition: external_exports.string().max(4e3).optional(),
6352
6537
  agent: zAgent.optional(),
@@ -10414,9 +10599,9 @@ var init_sessions = __esm({
10414
10599
  }
10415
10600
  const project = String(a.project);
10416
10601
  if (a.shell === true) return { method: "POST", path: "/terminal/sessions", body: { project, shell: true } };
10417
- const flow = s(a.flow);
10418
- if (flow === "breakdown") return { method: "POST", path: "/terminal/sessions", body: { project, flow, prdPath: String(a.prdPath) } };
10419
- if (flow === "reverse" || flow === "scaffold") return { method: "POST", path: "/terminal/sessions", body: { project, flow } };
10602
+ const flow2 = s(a.flow);
10603
+ if (flow2 === "breakdown") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2, prdPath: String(a.prdPath) } };
10604
+ if (flow2 === "reverse" || flow2 === "scaffold") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2 } };
10420
10605
  const body = { project };
10421
10606
  for (const k of ["agent", "model", "effort"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
10422
10607
  return { method: "POST", path: "/terminal/sessions", body };
@@ -11638,6 +11823,7 @@ var init_src = __esm({
11638
11823
  init_pending();
11639
11824
  init_team();
11640
11825
  init_model_catalog();
11826
+ init_runtime_defaults();
11641
11827
  }
11642
11828
  });
11643
11829
 
@@ -22103,11 +22289,11 @@ function scanXMcpHeaderDeclarations(inputSchema) {
22103
22289
  function pathName(path) {
22104
22290
  return path.length === 0 ? "<root>" : path.join(".");
22105
22291
  }
22106
- function rejection(rung, cell, httpStatus, error2, settled) {
22292
+ function rejection(rung, cell2, httpStatus, error2, settled) {
22107
22293
  return {
22108
22294
  kind: "reject",
22109
22295
  rung,
22110
- cell,
22296
+ cell: cell2,
22111
22297
  httpStatus,
22112
22298
  code: error2.code,
22113
22299
  message: error2.message,
@@ -23790,10 +23976,10 @@ var init_src_CX2iR2pK = __esm({
23790
23976
  * `Server` instances never receive `input_required` responses on their
23791
23977
  * outbound legs and leave the base behavior in place.
23792
23978
  */
23793
- _resolveNonCompleteResult(decoded, flow) {
23794
- return Promise.reject(new SdkError(SdkErrorCode.UnsupportedResultType, `Unsupported result type '${decoded.kind}' for ${flow.request.method}`, {
23979
+ _resolveNonCompleteResult(decoded, flow2) {
23980
+ return Promise.reject(new SdkError(SdkErrorCode.UnsupportedResultType, `Unsupported result type '${decoded.kind}' for ${flow2.request.method}`, {
23795
23981
  resultType: decoded.kind,
23796
- method: flow.request.method
23982
+ method: flow2.request.method
23797
23983
  }));
23798
23984
  }
23799
23985
  /**
@@ -24233,7 +24419,7 @@ var init_src_CX2iR2pK = __esm({
24233
24419
  if (decoded.kind === "invalid") return reject(decoded.error);
24234
24420
  if (decoded.kind === "input_required") {
24235
24421
  if (options?.allowInputRequired === true) return resolve5(manualInputRequiredValue(decoded));
24236
- const flow = {
24422
+ const flow2 = {
24237
24423
  codec,
24238
24424
  request,
24239
24425
  resultSchema,
@@ -24244,7 +24430,7 @@ var init_src_CX2iR2pK = __esm({
24244
24430
  params
24245
24431
  }, resultSchema, legOptions)
24246
24432
  };
24247
- return resolve5(this._resolveNonCompleteResult(decoded, flow));
24433
+ return resolve5(this._resolveNonCompleteResult(decoded, flow2));
24248
24434
  }
24249
24435
  const result = decoded.result;
24250
24436
  validateStandardSchema(resultSchema, result).then((parseResult) => {