hanoman 0.4.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 (28) hide show
  1. package/README.md +2 -0
  2. package/dist/build-info.json +3 -3
  3. package/dist/cli.js +362 -28
  4. package/dist/server.js +2521 -1070
  5. package/docs/agent-integration.md +4 -0
  6. package/package.json +1 -1
  7. package/prisma/migrations/20260915120000_log_terpusat/migration.sql +34 -0
  8. package/prisma/schema.prisma +39 -0
  9. package/web/assets/{ChangelogScreen-aqsJmmfe.js → ChangelogScreen-DVMpzy2Y.js} +1 -1
  10. package/web/assets/{DalangHanomanScreen-D3rNURz7.js → DalangHanomanScreen-aY89PmaJ.js} +1 -1
  11. package/web/assets/{DocPreviewModal-B7r_7p8N.js → DocPreviewModal-BTwj2rmX.js} +1 -1
  12. package/web/assets/{DocsWorkspace-_w6pncu9.js → DocsWorkspace-CgM5rgcr.js} +1 -1
  13. package/web/assets/{IdeScreen-etZ2QyO-.js → IdeScreen-B7oDlNQ0.js} +1 -1
  14. package/web/assets/{LeadScreen-Bo0K2-ML.js → LeadScreen-BzNU_kBC.js} +1 -1
  15. package/web/assets/{ReviewScreen-lRf2FW30.js → ReviewScreen-Dk0Zy4jJ.js} +1 -1
  16. package/web/assets/{SchedulerScreen-D75twy4J.js → SchedulerScreen-CxYqEqnw.js} +1 -1
  17. package/web/assets/SettingsScreen-D1Fop_V6.js +62 -0
  18. package/web/assets/{TeamScreen-nsttkE2J.js → TeamScreen-DwtrDuZG.js} +1 -1
  19. package/web/assets/TerminalScreen-CViC7rot.js +9 -0
  20. package/web/assets/{TriageScreen-7eM8gjr_.js → TriageScreen-DjCXx0F4.js} +1 -1
  21. package/web/assets/{VpsScreen-C29j52Tu.js → VpsScreen-C2WoJQ_j.js} +1 -1
  22. package/web/assets/{diff-view-RZNZ9Nz6.js → diff-view-Bep86yt6.js} +1 -1
  23. package/web/assets/index-Bd9gXx1g.js +923 -0
  24. package/web/assets/{live-CniaVDeP.js → live-BlNZnTbo.js} +1 -1
  25. package/web/index.html +1 -1
  26. package/web/assets/SettingsScreen-rMIR22vv.js +0 -62
  27. package/web/assets/TerminalScreen-BG9vRE1-.js +0 -9
  28. package/web/assets/index-BHI_f9DD.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.4.0",
3
- "sha": "67478d09",
4
- "builtAt": "2026-09-14T09:24:41.787Z"
2
+ "version": "0.6.0",
3
+ "sha": "61bc006c",
4
+ "builtAt": "2026-09-17T03:44:44.300Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4412,6 +4412,311 @@ var init_auto_merge = __esm({
4412
4412
  }
4413
4413
  });
4414
4414
 
4415
+ // ../shared/src/relay.ts
4416
+ function utf8Bytes(s2) {
4417
+ let n2 = 0;
4418
+ for (let i = 0; i < s2.length; i++) {
4419
+ const cp = s2.codePointAt(i);
4420
+ n2 += cpBytes(cp);
4421
+ if (cp > 65535) i++;
4422
+ }
4423
+ return n2;
4424
+ }
4425
+ var RELAY_PART_MAX_BYTES, RELAY_RESPONSE_MAX_BYTES, RELAY_REASSEMBLY_MAX_BYTES, RELAY_REQUEST_BODY_MAX_BYTES, RELAY_CREDIT_INITIAL, RELAY_CREDIT_REFILL_BELOW, RELAY_SOCKET_MAX_BUFFERED, RELAY_UNSUPPORTED_RETRY_MS, REMOTE_CAPABILITIES, zRemoteCapability, zRemoteControl, REMOTE_CONTROL_DEFAULTS, cpBytes, zRelayActor, zId, UNSAFE_PATH, zRelayPath, zPart, RELAY_METHODS, zWelcome, zReq, zCancel, zOpen, zHubData, zCredit, zClose, zHubToClientFrame, zHello, zRes, zGeometryFields, zOpened, zGeometry, zClientData, zClientToHubFrame, zRemoteControlPut;
4426
+ var init_relay = __esm({
4427
+ "../shared/src/relay.ts"() {
4428
+ "use strict";
4429
+ init_zod();
4430
+ RELAY_PART_MAX_BYTES = 32 * 1024;
4431
+ RELAY_RESPONSE_MAX_BYTES = 1024 * 1024;
4432
+ RELAY_REASSEMBLY_MAX_BYTES = 1024 * 1024;
4433
+ RELAY_REQUEST_BODY_MAX_BYTES = 32 * 1024;
4434
+ RELAY_CREDIT_INITIAL = 256 * 1024;
4435
+ RELAY_CREDIT_REFILL_BELOW = 64 * 1024;
4436
+ RELAY_SOCKET_MAX_BUFFERED = 1024 * 1024;
4437
+ RELAY_UNSUPPORTED_RETRY_MS = 30 * 6e4;
4438
+ REMOTE_CAPABILITIES = [
4439
+ "sessions:read",
4440
+ "sessions:write",
4441
+ "sessions:spawn",
4442
+ "backlog:read",
4443
+ "backlog:write",
4444
+ "ide:read"
4445
+ ];
4446
+ zRemoteCapability = external_exports.enum(REMOTE_CAPABILITIES);
4447
+ zRemoteControl = external_exports.object({
4448
+ enabled: external_exports.boolean().default(false),
4449
+ capabilities: external_exports.array(zRemoteCapability).default([])
4450
+ });
4451
+ REMOTE_CONTROL_DEFAULTS = { enabled: false, capabilities: [] };
4452
+ cpBytes = (cp) => cp < 128 ? 1 : cp < 2048 ? 2 : cp < 65536 ? 3 : 4;
4453
+ zRelayActor = external_exports.object({
4454
+ hubOrigin: external_exports.string().min(1).max(200),
4455
+ userId: external_exports.string().min(1).max(200),
4456
+ email: external_exports.string().min(1).max(320)
4457
+ }).strict();
4458
+ zId = external_exports.string().min(1).max(64);
4459
+ UNSAFE_PATH = /(^|\/)\.\.?(\/|$)|%2e|%2f|%5c|\\|[?#]/i;
4460
+ zRelayPath = external_exports.string().max(2048).regex(/^\/api\//).refine((p3) => !UNSAFE_PATH.test(p3), "path relay tak sah");
4461
+ zPart = external_exports.string().refine((s2) => utf8Bytes(s2) <= RELAY_PART_MAX_BYTES, "part relay > 32 KiB");
4462
+ RELAY_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
4463
+ zWelcome = external_exports.object({ t: external_exports.literal("welcome"), v: external_exports.literal(1), protocol: external_exports.number().int(), version: external_exports.string().max(40) }).strict();
4464
+ zReq = external_exports.object({
4465
+ t: external_exports.literal("req"),
4466
+ id: zId,
4467
+ method: external_exports.enum(RELAY_METHODS),
4468
+ path: zRelayPath,
4469
+ query: external_exports.string().max(2048).optional(),
4470
+ body: external_exports.unknown().optional(),
4471
+ actor: zRelayActor
4472
+ }).strict();
4473
+ zCancel = external_exports.object({ t: external_exports.literal("cancel"), id: zId }).strict();
4474
+ zOpen = external_exports.object({ t: external_exports.literal("open"), sid: zId, path: zRelayPath, mode: external_exports.enum(["read", "write"]), actor: zRelayActor }).strict();
4475
+ zHubData = external_exports.object({ t: external_exports.literal("data"), sid: zId, d: zPart }).strict();
4476
+ zCredit = external_exports.object({ t: external_exports.literal("credit"), sid: zId, n: external_exports.number().int().min(1).max(4 * 1024 * 1024) }).strict();
4477
+ zClose = external_exports.object({ t: external_exports.literal("close"), sid: zId, code: external_exports.number().int().min(1e3).max(4999), reason: external_exports.string().max(120).optional() }).strict();
4478
+ zHubToClientFrame = external_exports.discriminatedUnion("t", [zWelcome, zReq, zCancel, zOpen, zHubData, zCredit, zClose]);
4479
+ zHello = external_exports.object({
4480
+ t: external_exports.literal("hello"),
4481
+ v: external_exports.literal(1),
4482
+ // Sengaja number, bukan literal: hub harus bisa MELIHAT protokol yang beda untuk menutup 4001
4483
+ // dan menampilkan "protocol-mismatch", bukan membuang frame-nya senyap.
4484
+ protocol: external_exports.number().int(),
4485
+ version: external_exports.string().max(40),
4486
+ capabilities: external_exports.array(zRemoteCapability).max(REMOTE_CAPABILITIES.length)
4487
+ }).strict();
4488
+ zRes = external_exports.object({
4489
+ t: external_exports.literal("res"),
4490
+ id: zId,
4491
+ status: external_exports.number().int().min(100).max(599).optional(),
4492
+ contentType: external_exports.string().max(200).optional(),
4493
+ part: zPart,
4494
+ end: external_exports.boolean()
4495
+ }).strict();
4496
+ zGeometryFields = { cols: external_exports.number().int().min(1).max(1e3), rows: external_exports.number().int().min(1).max(1e3) };
4497
+ zOpened = external_exports.object({ t: external_exports.literal("opened"), sid: zId, geometry: external_exports.object(zGeometryFields).strict().optional() }).strict();
4498
+ zGeometry = external_exports.object({ t: external_exports.literal("geometry"), sid: zId, ...zGeometryFields }).strict();
4499
+ zClientData = external_exports.object({ t: external_exports.literal("data"), sid: zId, d: zPart, more: external_exports.literal(true).optional() }).strict();
4500
+ zClientToHubFrame = external_exports.discriminatedUnion("t", [zHello, zRes, zOpened, zGeometry, zClientData, zClose]);
4501
+ zRemoteControlPut = external_exports.object({
4502
+ control: external_exports.object({ enabled: external_exports.boolean(), capabilities: external_exports.array(external_exports.string().max(40)).max(20) }).strict().optional(),
4503
+ logs: external_exports.object({ event: external_exports.boolean(), server: external_exports.boolean(), transcript: external_exports.boolean() }).strict().optional()
4504
+ }).strict();
4505
+ }
4506
+ });
4507
+
4508
+ // ../shared/src/logs.ts
4509
+ var LOG_LANES, zLogLane, LOG_LEVELS, zLogLevel, LOG_MSG_MAX_BYTES, LOG_DATA_MAX_BYTES, LOG_SHIPPING_DEFAULTS, zLogShipping, LOG_RETENTION_DEFAULTS, days, zLogRetention;
4510
+ var init_logs = __esm({
4511
+ "../shared/src/logs.ts"() {
4512
+ "use strict";
4513
+ init_zod();
4514
+ LOG_LANES = ["event", "server", "transcript"];
4515
+ zLogLane = external_exports.enum(LOG_LANES);
4516
+ LOG_LEVELS = ["debug", "info", "warn", "error"];
4517
+ zLogLevel = external_exports.enum(LOG_LEVELS);
4518
+ LOG_MSG_MAX_BYTES = 4 * 1024;
4519
+ LOG_DATA_MAX_BYTES = 8 * 1024;
4520
+ LOG_SHIPPING_DEFAULTS = { event: true, server: false, transcript: false };
4521
+ zLogShipping = external_exports.object({
4522
+ event: external_exports.boolean().default(true),
4523
+ server: external_exports.boolean().default(false),
4524
+ transcript: external_exports.boolean().default(false)
4525
+ });
4526
+ LOG_RETENTION_DEFAULTS = { eventDays: 90, serverDays: 7, transcriptDays: 30, maxBytes: 256 * 1024 ** 2 };
4527
+ days = (d) => external_exports.number().int().min(1).max(365).default(d);
4528
+ zLogRetention = external_exports.object({
4529
+ eventDays: days(90),
4530
+ serverDays: days(7),
4531
+ transcriptDays: days(30),
4532
+ maxBytes: external_exports.number().int().min(16 * 1024 ** 2).max(4 * 1024 ** 3).default(256 * 1024 ** 2)
4533
+ });
4534
+ }
4535
+ });
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
+
4415
4720
  // ../shared/src/entities.ts
4416
4721
  function cmpVersion(a, b) {
4417
4722
  const pa = a.split(".").map(Number);
@@ -4422,7 +4727,7 @@ function cmpVersion(a, b) {
4422
4727
  }
4423
4728
  return 0;
4424
4729
  }
4425
- 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;
4426
4731
  var init_entities = __esm({
4427
4732
  "../shared/src/entities.ts"() {
4428
4733
  "use strict";
@@ -4432,6 +4737,9 @@ var init_entities = __esm({
4432
4737
  init_agent_engine();
4433
4738
  init_auto_merge();
4434
4739
  init_method_catalog();
4740
+ init_relay();
4741
+ init_logs();
4742
+ init_runtime_defaults();
4435
4743
  zProject = external_exports.object({
4436
4744
  id: external_exports.string(),
4437
4745
  name: external_exports.string(),
@@ -4542,8 +4850,8 @@ var init_entities = __esm({
4542
4850
  "fanfare"
4543
4851
  ];
4544
4852
  zCodex = external_exports.object({
4545
- model: external_exports.string().default("gpt-5.6-sol"),
4546
- effort: external_exports.string().default("xhigh")
4853
+ model: external_exports.string().default("gpt-5.6-terra"),
4854
+ effort: external_exports.string().default("medium")
4547
4855
  });
4548
4856
  CODEX_DEFAULTS = zCodex.parse({});
4549
4857
  zSourceCommon = { enabled: external_exports.boolean().default(false) };
@@ -4634,6 +4942,11 @@ var init_entities = __esm({
4634
4942
  model: external_exports.string().nullable().default(null),
4635
4943
  effort: external_exports.string().nullable().default(null)
4636
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);
4637
4950
  zFlowOrchestration = external_exports.object({
4638
4951
  enabled: external_exports.boolean().default(true),
4639
4952
  claude: external_exports.record(external_exports.string(), zPhaseCell).default({}),
@@ -4650,10 +4963,10 @@ var init_entities = __esm({
4650
4963
  goal: zFlowOrchestration.default({}),
4651
4964
  no_effort: zFlowOrchestration.default({})
4652
4965
  });
4653
- ORCHESTRATION_DEFAULTS = zOrchestration.parse({});
4966
+ ORCHESTRATION_DEFAULTS = zOrchestration.parse(BUILTIN_ORCHESTRATION_DEFAULTS);
4654
4967
  zSetting = external_exports.object({
4655
- model: external_exports.string().default("claude-opus-5"),
4656
- effort: external_exports.string().default("xhigh"),
4968
+ model: external_exports.string().default("claude-sonnet-5"),
4969
+ effort: external_exports.string().default("medium"),
4657
4970
  autoDefault: external_exports.boolean(),
4658
4971
  autoScaffold: external_exports.boolean(),
4659
4972
  notifyFail: external_exports.boolean(),
@@ -4695,6 +5008,15 @@ var init_entities = __esm({
4695
5008
  // SPEC-854 · ADR-0130 · chat portal klien (opt-in, mati)
4696
5009
  orchestration: zOrchestration.default(ORCHESTRATION_DEFAULTS),
4697
5010
  // ADR-0164 · orkestrasi subagent per fase (default aktif)
5011
+ // SPEC-1215 · ADR-0165/0166 · LOCAL-only (setting tak ada di SYNCED) dan TAK ditulis `PUT /settings`
5012
+ // (routes/settings.ts mempertahankan nilai tersimpan). Pengelolanya `PUT /api/remote-control` dan,
5013
+ // kelak, `PUT /api/logs/retention` — keduanya COOKIE_ONLY.
5014
+ remoteControl: zRemoteControl.default(REMOTE_CONTROL_DEFAULTS),
5015
+ // grant kendali jarak jauh (default mati)
5016
+ logShipping: zLogShipping.default(LOG_SHIPPING_DEFAULTS),
5017
+ // lajur log ke hub (SPEC-1217)
5018
+ logRetention: zLogRetention.default(LOG_RETENTION_DEFAULTS),
5019
+ // retensi log di hub (SPEC-1217)
4698
5020
  // SPEC-881 · ADR-0136 · sidik jari isi bawaan yang TERAKHIR ditulis seed di mesin ini, per nama
4699
5021
  // agen. Dipakai seed untuk membedakan "belum pernah disunting operator" dari "sudah". WAJIB
4700
5022
  // dideklarasikan di sini: zod membuang kunci tak dikenal dan `PUT /settings` menulis balik hasil
@@ -4705,7 +5027,10 @@ var init_entities = __esm({
4705
5027
  builtinAgents: external_exports.record(external_exports.string(), external_exports.string()).default({}),
4706
5028
  // SPEC-950 · marker safety policy lokal. Terpisah dari fingerprint konten agar policy sekali
4707
5029
  // jalan tidak membuat seed memperlakukan konfigurasi operator sebagai bawaan.
4708
- 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)
4709
5034
  });
4710
5035
  zNotification = external_exports.object({
4711
5036
  id: external_exports.string(),
@@ -4739,16 +5064,6 @@ var init_entities = __esm({
4739
5064
  }
4740
5065
  });
4741
5066
 
4742
- // ../shared/src/orchestration.ts
4743
- var PHASE_AGENT_PREFIX, isPhaseAgentName;
4744
- var init_orchestration = __esm({
4745
- "../shared/src/orchestration.ts"() {
4746
- "use strict";
4747
- PHASE_AGENT_PREFIX = "hanoman-fase-";
4748
- isPhaseAgentName = (name) => name.startsWith(PHASE_AGENT_PREFIX);
4749
- }
4750
- });
4751
-
4752
5067
  // ../shared/src/orchestration-plan.ts
4753
5068
  function codexNativeAgentsSupported(version3) {
4754
5069
  const parsed = version3 ? /(\d+)\.(\d+)\.(\d+)/.exec(version3)?.[0] : null;
@@ -6214,6 +6529,9 @@ var init_dto = __esm({
6214
6529
  flow: zFlow,
6215
6530
  model: external_exports.string().optional(),
6216
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(),
6217
6535
  goal: external_exports.boolean().optional(),
6218
6536
  goalCondition: external_exports.string().max(4e3).optional(),
6219
6537
  agent: zAgent.optional(),
@@ -6647,6 +6965,8 @@ var init_api = __esm({
6647
6965
  // SPEC-213 · device token + activity log
6648
6966
  deviceTokens: `${API}/device-tokens`,
6649
6967
  deviceToken: (id) => `${API}/device-tokens/${id}`,
6968
+ // SPEC-1215 · ADR-0165 · grant kendali jarak jauh mesin ini (cookie-only)
6969
+ remoteControl: `${API}/remote-control`,
6650
6970
  sessionResults: (projectId) => `${API}/session-results${projectId ? `?projectId=${encodeURIComponent(projectId)}` : ""}`,
6651
6971
  // SPEC-215 · config runtime
6652
6972
  config: `${API}/config`,
@@ -10279,9 +10599,9 @@ var init_sessions = __esm({
10279
10599
  }
10280
10600
  const project = String(a.project);
10281
10601
  if (a.shell === true) return { method: "POST", path: "/terminal/sessions", body: { project, shell: true } };
10282
- const flow = s(a.flow);
10283
- if (flow === "breakdown") return { method: "POST", path: "/terminal/sessions", body: { project, flow, prdPath: String(a.prdPath) } };
10284
- 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 } };
10285
10605
  const body = { project };
10286
10606
  for (const k of ["agent", "model", "effort"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
10287
10607
  return { method: "POST", path: "/terminal/sessions", body };
@@ -11407,11 +11727,12 @@ var init_session_ask = __esm({
11407
11727
  });
11408
11728
 
11409
11729
  // ../shared/src/presence.ts
11410
- var PRESENCE_PROTOCOL, MAX_PRESENCE_SESSIONS, PRESENCE_MAX_FRAME_BYTES, zPresenceSession, zPresenceFrame;
11730
+ var PRESENCE_PROTOCOL, MAX_PRESENCE_SESSIONS, PRESENCE_MAX_FRAME_BYTES, zPresenceSession, zPresenceFrame, zCapacityFrame;
11411
11731
  var init_presence = __esm({
11412
11732
  "../shared/src/presence.ts"() {
11413
11733
  "use strict";
11414
11734
  init_zod();
11735
+ init_session_admission();
11415
11736
  PRESENCE_PROTOCOL = 1;
11416
11737
  MAX_PRESENCE_SESSIONS = 100;
11417
11738
  PRESENCE_MAX_FRAME_BYTES = 32 * 1024;
@@ -11431,6 +11752,11 @@ var init_presence = __esm({
11431
11752
  v: external_exports.literal(PRESENCE_PROTOCOL),
11432
11753
  sessions: external_exports.array(zPresenceSession).max(MAX_PRESENCE_SESSIONS)
11433
11754
  }).strict();
11755
+ zCapacityFrame = external_exports.object({
11756
+ t: external_exports.literal("capacity"),
11757
+ v: external_exports.literal(PRESENCE_PROTOCOL),
11758
+ admission: zLaunchStatus
11759
+ }).strict();
11434
11760
  }
11435
11761
  });
11436
11762
 
@@ -11492,9 +11818,12 @@ var init_src = __esm({
11492
11818
  init_session_dialog();
11493
11819
  init_session_ask();
11494
11820
  init_presence();
11821
+ init_relay();
11822
+ init_logs();
11495
11823
  init_pending();
11496
11824
  init_team();
11497
11825
  init_model_catalog();
11826
+ init_runtime_defaults();
11498
11827
  }
11499
11828
  });
11500
11829
 
@@ -21960,11 +22289,11 @@ function scanXMcpHeaderDeclarations(inputSchema) {
21960
22289
  function pathName(path) {
21961
22290
  return path.length === 0 ? "<root>" : path.join(".");
21962
22291
  }
21963
- function rejection(rung, cell, httpStatus, error2, settled) {
22292
+ function rejection(rung, cell2, httpStatus, error2, settled) {
21964
22293
  return {
21965
22294
  kind: "reject",
21966
22295
  rung,
21967
- cell,
22296
+ cell: cell2,
21968
22297
  httpStatus,
21969
22298
  code: error2.code,
21970
22299
  message: error2.message,
@@ -23647,10 +23976,10 @@ var init_src_CX2iR2pK = __esm({
23647
23976
  * `Server` instances never receive `input_required` responses on their
23648
23977
  * outbound legs and leave the base behavior in place.
23649
23978
  */
23650
- _resolveNonCompleteResult(decoded, flow) {
23651
- 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}`, {
23652
23981
  resultType: decoded.kind,
23653
- method: flow.request.method
23982
+ method: flow2.request.method
23654
23983
  }));
23655
23984
  }
23656
23985
  /**
@@ -24090,7 +24419,7 @@ var init_src_CX2iR2pK = __esm({
24090
24419
  if (decoded.kind === "invalid") return reject(decoded.error);
24091
24420
  if (decoded.kind === "input_required") {
24092
24421
  if (options?.allowInputRequired === true) return resolve5(manualInputRequiredValue(decoded));
24093
- const flow = {
24422
+ const flow2 = {
24094
24423
  codec,
24095
24424
  request,
24096
24425
  resultSchema,
@@ -24101,7 +24430,7 @@ var init_src_CX2iR2pK = __esm({
24101
24430
  params
24102
24431
  }, resultSchema, legOptions)
24103
24432
  };
24104
- return resolve5(this._resolveNonCompleteResult(decoded, flow));
24433
+ return resolve5(this._resolveNonCompleteResult(decoded, flow2));
24105
24434
  }
24106
24435
  const result = decoded.result;
24107
24436
  validateStandardSchema(resultSchema, result).then((parseResult) => {
@@ -33955,6 +34284,11 @@ var init_migrate_pg = __esm({
33955
34284
  "SyncState",
33956
34285
  "SyncConflict",
33957
34286
  "SyncTombstone",
34287
+ // SPEC-1215 · ADR-0166 · LOCAL-only, tanpa FK. Tabel ini tak ada di sumber Postgres lama — jalur
34288
+ // 42P01 memperlakukannya sebagai nol baris (cermin AgentInvocation/Changelog). Tetap WAJIB
34289
+ // terdaftar: test migrate-pg menuntut PG_ORDER = seluruh model DMMF.
34290
+ "LogEntry",
34291
+ "LogCursor",
33958
34292
  // SPEC-485 · ADR-0102 · LeadFlow SEBELUM LeadDecision: `flowId` menunjuk ke sana. Tanpa FK, tapi
33959
34293
  // urutan tabel harus tetap mencerminkan arah tautannya bagi pembaca berikutnya.
33960
34294
  // SPEC-646 · ADR-0112 · SchedulerCron SEBELUM SchedulerCronRun: `cronId` menunjuk ke sana. Tanpa