hanoman 0.3.3 → 0.5.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/dist/build-info.json +3 -3
  2. package/dist/cli.js +269 -9
  3. package/dist/server.js +3408 -1695
  4. package/docs/agent-integration.md +4 -0
  5. package/package.json +1 -1
  6. package/prisma/migrations/20260914120000_agent_invocation_phase/migration.sql +3 -0
  7. package/prisma/migrations/20260915120000_log_terpusat/migration.sql +34 -0
  8. package/prisma/schema.prisma +42 -0
  9. package/web/assets/{ChangelogScreen-D_-RmJkz.js → ChangelogScreen-CqVppy70.js} +1 -1
  10. package/web/assets/{DalangHanomanScreen-pVfnLx9z.js → DalangHanomanScreen-DRFC8ZdR.js} +1 -1
  11. package/web/assets/{DocPreviewModal-ZFjISCL0.js → DocPreviewModal-Di28IHju.js} +1 -1
  12. package/web/assets/{DocsWorkspace-Vp_vik3v.js → DocsWorkspace-DY0x50eq.js} +1 -1
  13. package/web/assets/{IdeScreen-DQSRs3fr.js → IdeScreen-BpSi7o5r.js} +1 -1
  14. package/web/assets/{LeadScreen-Bv5LiudD.js → LeadScreen-BRzdha5a.js} +1 -1
  15. package/web/assets/{ReviewScreen-Cime4Tci.js → ReviewScreen-D2SwZTqF.js} +1 -1
  16. package/web/assets/{SchedulerScreen-DKmRNbTs.js → SchedulerScreen-w6hID1yX.js} +1 -1
  17. package/web/assets/SettingsScreen-DC4OFYQ-.js +62 -0
  18. package/web/assets/{TeamScreen-5ugoXsOv.js → TeamScreen-D0W-oNAi.js} +1 -1
  19. package/web/assets/TerminalScreen-B2keWEDd.js +9 -0
  20. package/web/assets/{TriageScreen-BajACF5K.js → TriageScreen-CmVGUNpA.js} +1 -1
  21. package/web/assets/{VpsScreen-C7muNRX5.js → VpsScreen-BKoJ_dAB.js} +1 -1
  22. package/web/assets/{diff-view-CsZPBznT.js → diff-view-B_pIZnWa.js} +1 -1
  23. package/web/assets/index-C_-gADIr.js +923 -0
  24. package/web/assets/{live-DVDstDzi.js → live-DJzk8BTb.js} +1 -1
  25. package/web/index.html +1 -1
  26. package/web/assets/SettingsScreen-Bh8XhyVQ.js +0 -62
  27. package/web/assets/TerminalScreen-DsAn5dlH.js +0 -9
  28. package/web/assets/index-DI7G_sit.js +0 -923
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.3.3",
3
- "sha": "05978c6d",
4
- "builtAt": "2026-09-10T15:23:15.388Z"
2
+ "version": "0.5.0",
3
+ "sha": "c507df84",
4
+ "builtAt": "2026-09-14T23:17:43.632Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4412,6 +4412,128 @@ 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
+
4415
4537
  // ../shared/src/entities.ts
4416
4538
  function cmpVersion(a, b) {
4417
4539
  const pa = a.split(".").map(Number);
@@ -4422,7 +4544,7 @@ function cmpVersion(a, b) {
4422
4544
  }
4423
4545
  return 0;
4424
4546
  }
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, zSetting, zNotification, zDocFile, zDeviceTokenView;
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;
4426
4548
  var init_entities = __esm({
4427
4549
  "../shared/src/entities.ts"() {
4428
4550
  "use strict";
@@ -4432,6 +4554,8 @@ var init_entities = __esm({
4432
4554
  init_agent_engine();
4433
4555
  init_auto_merge();
4434
4556
  init_method_catalog();
4557
+ init_relay();
4558
+ init_logs();
4435
4559
  zProject = external_exports.object({
4436
4560
  id: external_exports.string(),
4437
4561
  name: external_exports.string(),
@@ -4630,6 +4754,27 @@ var init_entities = __esm({
4630
4754
  timeoutSec: external_exports.number().int().min(10).max(900).default(180)
4631
4755
  });
4632
4756
  PORTAL_CHAT_DEFAULTS = zPortalChat.parse({});
4757
+ zPhaseCell = external_exports.object({
4758
+ model: external_exports.string().nullable().default(null),
4759
+ effort: external_exports.string().nullable().default(null)
4760
+ });
4761
+ zFlowOrchestration = external_exports.object({
4762
+ enabled: external_exports.boolean().default(true),
4763
+ claude: external_exports.record(external_exports.string(), zPhaseCell).default({}),
4764
+ codex: external_exports.record(external_exports.string(), zPhaseCell).default({})
4765
+ });
4766
+ zOrchestration = external_exports.object({
4767
+ feature: zFlowOrchestration.default({}),
4768
+ qa: zFlowOrchestration.default({}),
4769
+ scaffold: zFlowOrchestration.default({}),
4770
+ reverse: zFlowOrchestration.default({}),
4771
+ prd: zFlowOrchestration.default({}),
4772
+ audit: zFlowOrchestration.default({}),
4773
+ breakdown: zFlowOrchestration.default({}),
4774
+ goal: zFlowOrchestration.default({}),
4775
+ no_effort: zFlowOrchestration.default({})
4776
+ });
4777
+ ORCHESTRATION_DEFAULTS = zOrchestration.parse({});
4633
4778
  zSetting = external_exports.object({
4634
4779
  model: external_exports.string().default("claude-opus-5"),
4635
4780
  effort: external_exports.string().default("xhigh"),
@@ -4672,6 +4817,17 @@ var init_entities = __esm({
4672
4817
  // SPEC-518 · agen pembuat changelog (opt-in, mati)
4673
4818
  portalChat: zPortalChat.default(PORTAL_CHAT_DEFAULTS),
4674
4819
  // SPEC-854 · ADR-0130 · chat portal klien (opt-in, mati)
4820
+ orchestration: zOrchestration.default(ORCHESTRATION_DEFAULTS),
4821
+ // ADR-0164 · orkestrasi subagent per fase (default aktif)
4822
+ // SPEC-1215 · ADR-0165/0166 · LOCAL-only (setting tak ada di SYNCED) dan TAK ditulis `PUT /settings`
4823
+ // (routes/settings.ts mempertahankan nilai tersimpan). Pengelolanya `PUT /api/remote-control` dan,
4824
+ // kelak, `PUT /api/logs/retention` — keduanya COOKIE_ONLY.
4825
+ remoteControl: zRemoteControl.default(REMOTE_CONTROL_DEFAULTS),
4826
+ // grant kendali jarak jauh (default mati)
4827
+ logShipping: zLogShipping.default(LOG_SHIPPING_DEFAULTS),
4828
+ // lajur log ke hub (SPEC-1217)
4829
+ logRetention: zLogRetention.default(LOG_RETENTION_DEFAULTS),
4830
+ // retensi log di hub (SPEC-1217)
4675
4831
  // SPEC-881 · ADR-0136 · sidik jari isi bawaan yang TERAKHIR ditulis seed di mesin ini, per nama
4676
4832
  // agen. Dipakai seed untuk membedakan "belum pernah disunting operator" dari "sudah". WAJIB
4677
4833
  // dideklarasikan di sini: zod membuang kunci tak dikenal dan `PUT /settings` menulis balik hasil
@@ -4716,6 +4872,31 @@ var init_entities = __esm({
4716
4872
  }
4717
4873
  });
4718
4874
 
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
+ // ../shared/src/orchestration-plan.ts
4886
+ function codexNativeAgentsSupported(version3) {
4887
+ const parsed = version3 ? /(\d+)\.(\d+)\.(\d+)/.exec(version3)?.[0] : null;
4888
+ return parsed ? cmpVersion(parsed, CODEX_NATIVE_AGENTS_MIN_CLIENT) >= 0 : false;
4889
+ }
4890
+ var CODEX_NATIVE_AGENTS_MIN_CLIENT;
4891
+ var init_orchestration_plan = __esm({
4892
+ "../shared/src/orchestration-plan.ts"() {
4893
+ "use strict";
4894
+ init_entities();
4895
+ init_orchestration();
4896
+ CODEX_NATIVE_AGENTS_MIN_CLIENT = "0.151.0";
4897
+ }
4898
+ });
4899
+
4719
4900
  // ../shared/src/agent.ts
4720
4901
  var CAPABILITY_IDS, zCapability, zCapabilityInfo, zAgentTokenView, zAgentTokenCreate, zAgentTokenPatch;
4721
4902
  var init_agent = __esm({
@@ -4819,6 +5000,7 @@ var init_custom_agent = __esm({
4819
5000
  "../shared/src/custom-agent.ts"() {
4820
5001
  "use strict";
4821
5002
  init_zod();
5003
+ init_orchestration();
4822
5004
  AGENT_RUNTIMES = ["claude", "codex"];
4823
5005
  zAgentRuntime = external_exports.enum(AGENT_RUNTIMES);
4824
5006
  AGENT_ACTIVATIONS = ["always", "smart"];
@@ -4858,7 +5040,9 @@ var init_custom_agent = __esm({
4858
5040
  });
4859
5041
  zCreateCustomAgentFields = external_exports.object({
4860
5042
  projectId: external_exports.string().nullable().optional(),
4861
- name: external_exports.string().regex(AGENT_NAME_RE),
5043
+ // ADR-0164 · awalan agen fase dicadangkan — registry native berkunci nama, jadi custom agent
5044
+ // bernama sama akan menimpa agen fase sesi orchestrator tanpa satu pun galat.
5045
+ name: external_exports.string().regex(AGENT_NAME_RE).refine((n2) => !isPhaseAgentName(n2), { message: `awalan ${PHASE_AGENT_PREFIX} dicadangkan untuk agen fase hanoman` }),
4862
5046
  description: external_exports.string().trim().min(1).max(500),
4863
5047
  instructions: external_exports.string().trim().min(1).max(2e4),
4864
5048
  tools: external_exports.array(external_exports.string()).nullable().optional(),
@@ -6596,6 +6780,8 @@ var init_api = __esm({
6596
6780
  // SPEC-213 · device token + activity log
6597
6781
  deviceTokens: `${API}/device-tokens`,
6598
6782
  deviceToken: (id) => `${API}/device-tokens/${id}`,
6783
+ // SPEC-1215 · ADR-0165 · grant kendali jarak jauh mesin ini (cookie-only)
6784
+ remoteControl: `${API}/remote-control`,
6599
6785
  sessionResults: (projectId) => `${API}/session-results${projectId ? `?projectId=${encodeURIComponent(projectId)}` : ""}`,
6600
6786
  // SPEC-215 · config runtime
6601
6787
  config: `${API}/config`,
@@ -11356,11 +11542,12 @@ var init_session_ask = __esm({
11356
11542
  });
11357
11543
 
11358
11544
  // ../shared/src/presence.ts
11359
- var PRESENCE_PROTOCOL, MAX_PRESENCE_SESSIONS, PRESENCE_MAX_FRAME_BYTES, zPresenceSession, zPresenceFrame;
11545
+ var PRESENCE_PROTOCOL, MAX_PRESENCE_SESSIONS, PRESENCE_MAX_FRAME_BYTES, zPresenceSession, zPresenceFrame, zCapacityFrame;
11360
11546
  var init_presence = __esm({
11361
11547
  "../shared/src/presence.ts"() {
11362
11548
  "use strict";
11363
11549
  init_zod();
11550
+ init_session_admission();
11364
11551
  PRESENCE_PROTOCOL = 1;
11365
11552
  MAX_PRESENCE_SESSIONS = 100;
11366
11553
  PRESENCE_MAX_FRAME_BYTES = 32 * 1024;
@@ -11380,6 +11567,11 @@ var init_presence = __esm({
11380
11567
  v: external_exports.literal(PRESENCE_PROTOCOL),
11381
11568
  sessions: external_exports.array(zPresenceSession).max(MAX_PRESENCE_SESSIONS)
11382
11569
  }).strict();
11570
+ zCapacityFrame = external_exports.object({
11571
+ t: external_exports.literal("capacity"),
11572
+ v: external_exports.literal(PRESENCE_PROTOCOL),
11573
+ admission: zLaunchStatus
11574
+ }).strict();
11383
11575
  }
11384
11576
  });
11385
11577
 
@@ -11408,6 +11600,8 @@ var init_src = __esm({
11408
11600
  init_method_status();
11409
11601
  init_agent_engine();
11410
11602
  init_entities();
11603
+ init_orchestration();
11604
+ init_orchestration_plan();
11411
11605
  init_agent();
11412
11606
  init_custom_agent();
11413
11607
  init_builtin_agents();
@@ -11439,6 +11633,8 @@ var init_src = __esm({
11439
11633
  init_session_dialog();
11440
11634
  init_session_ask();
11441
11635
  init_presence();
11636
+ init_relay();
11637
+ init_logs();
11442
11638
  init_pending();
11443
11639
  init_team();
11444
11640
  init_model_catalog();
@@ -11651,10 +11847,6 @@ var init_runtime_profile = __esm({
11651
11847
  });
11652
11848
 
11653
11849
  // ../runner/src/codex-agent-config.ts
11654
- function codexNativeAgentsSupported(version3) {
11655
- const parsed = version3 ? /(\d+)\.(\d+)\.(\d+)/.exec(version3)?.[0] : null;
11656
- return parsed ? cmpVersion(parsed, CODEX_NATIVE_AGENTS_MIN_CLIENT) >= 0 : false;
11657
- }
11658
11850
  function codexNativeVersionProbe(env, codexBin = env.HANOMAN_CODEX_BIN ?? "codex") {
11659
11851
  const sandbox = env.HANOMAN_SESSION_SANDBOX ?? (resolveHardening(env) ? "required" : "off");
11660
11852
  if (sandbox !== "podman") return { bin: codexBin, args: ["--version"] };
@@ -11675,14 +11867,13 @@ function codexNativeVersionProbe(env, codexBin = env.HANOMAN_CODEX_BIN ?? "codex
11675
11867
  ]
11676
11868
  };
11677
11869
  }
11678
- var CODEX_NATIVE_AGENTS_MIN_CLIENT, shellQuote;
11870
+ var shellQuote;
11679
11871
  var init_codex_agent_config = __esm({
11680
11872
  "../runner/src/codex-agent-config.ts"() {
11681
11873
  "use strict";
11682
11874
  init_src();
11683
11875
  init_custom_agents();
11684
11876
  init_runtime_profile();
11685
- CODEX_NATIVE_AGENTS_MIN_CLIENT = "0.151.0";
11686
11877
  shellQuote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
11687
11878
  }
11688
11879
  });
@@ -11704,6 +11895,33 @@ var init_agent_definition = __esm({
11704
11895
  }
11705
11896
  });
11706
11897
 
11898
+ // ../runner/src/phase-agents.ts
11899
+ var PHASE_AGENT_RULES, PHASE_AGENT_REPORT;
11900
+ var init_phase_agents = __esm({
11901
+ "../runner/src/phase-agents.ts"() {
11902
+ "use strict";
11903
+ init_src();
11904
+ init_prompt();
11905
+ init_reverse_standard();
11906
+ PHASE_AGENT_RULES = [
11907
+ "Batas peran fase:",
11908
+ "- JANGAN menulis `$HANOMAN_PHASE_FILE` \u2014 orchestrator satu-satunya penulis marker fase.",
11909
+ "- JANGAN `git push` \u2014 push milik orchestrator. Commit artefak fasemu sendiri sebelum melapor.",
11910
+ `- JANGAN memanggil agen berawalan \`${PHASE_AGENT_PREFIX}\`. Custom agent lain boleh dipanggil bila relevan.`,
11911
+ "- Kerjakan HANYA fase ini; fase lain dikerjakan agen fasenya sendiri."
11912
+ ].join("\n");
11913
+ PHASE_AGENT_REPORT = [
11914
+ "Kontrak laporan (wajib, di akhir):",
11915
+ "- Baris pertama: `Status: selesai | sebagian | terhalang`.",
11916
+ "- `Artefak:` path berkas yang kamu tulis/ubah.",
11917
+ "- `Bukti:` perintah yang dijalankan beserta hasil yang benar-benar kamu baca.",
11918
+ "- `Pertanyaan untuk manusia:` (opsional) SATU pertanyaan; bila ada, berhenti di situ.",
11919
+ "- `Rekomendasi fase:` (opsional) mis. `jalur-cepat` sesudah Audit qa.",
11920
+ "Klaim tanpa bukti bukan bukti. Maksimal 1200 kata."
11921
+ ].join("\n");
11922
+ }
11923
+ });
11924
+
11707
11925
  // ../runner/src/custom-agent-eval-evidence.ts
11708
11926
  var init_custom_agent_eval_evidence = __esm({
11709
11927
  "../runner/src/custom-agent-eval-evidence.ts"() {
@@ -12158,6 +12376,41 @@ var init_sandbox_probe = __esm({
12158
12376
  }
12159
12377
  });
12160
12378
 
12379
+ // ../runner/src/subagent-statusline.ts
12380
+ var SUBAGENT_STATUSLINE_SCRIPT;
12381
+ var init_subagent_statusline = __esm({
12382
+ "../runner/src/subagent-statusline.ts"() {
12383
+ "use strict";
12384
+ init_src();
12385
+ SUBAGENT_STATUSLINE_SCRIPT = [
12386
+ 'const fs = require("node:fs");',
12387
+ "const labelsPath = process.argv[2];",
12388
+ 'let raw = "";',
12389
+ 'process.stdin.setEncoding("utf8");',
12390
+ 'process.stdin.on("data", (c) => { raw += c; });',
12391
+ 'process.stdin.on("end", () => {',
12392
+ " try {",
12393
+ ' const labels = JSON.parse(fs.readFileSync(labelsPath, "utf8"));',
12394
+ " const tasks = JSON.parse(raw).tasks || [];",
12395
+ " const rows = [];",
12396
+ " for (const t of tasks) {",
12397
+ ' if (!t || typeof t.id !== "string" || typeof t.model !== "string") continue;',
12398
+ ' const parts = [t.label || t.description || "subagent", labels[t.model] || t.model];',
12399
+ ' if (typeof t.effort === "string") parts.push(t.effort);',
12400
+ ' if (typeof t.startTime === "number") {',
12401
+ " const s = Math.max(0, Math.round((Date.now() - t.startTime) / 1000));",
12402
+ ' parts.push(s >= 60 ? Math.floor(s / 60) + "m" + String(s % 60).padStart(2, "0") + "s" : s + "s");',
12403
+ " }",
12404
+ ' if (typeof t.tokenCount === "number" && t.tokenCount > 0) parts.push(Math.round(t.tokenCount / 1000) + "k tok");',
12405
+ ' rows.push(JSON.stringify({ id: t.id, content: parts.join(" \xB7 ") }));',
12406
+ " }",
12407
+ ' if (rows.length) process.stdout.write(rows.join("\\n") + "\\n");',
12408
+ " } catch {}",
12409
+ "});"
12410
+ ].join("\n");
12411
+ }
12412
+ });
12413
+
12161
12414
  // ../runner/src/index.ts
12162
12415
  var init_src2 = __esm({
12163
12416
  "../runner/src/index.ts"() {
@@ -12173,6 +12426,7 @@ var init_src2 = __esm({
12173
12426
  init_agent_cli();
12174
12427
  init_custom_agents();
12175
12428
  init_agent_definition();
12429
+ init_phase_agents();
12176
12430
  init_agent_readonly();
12177
12431
  init_codex_agent_config();
12178
12432
  init_custom_agent_eval();
@@ -12185,6 +12439,7 @@ var init_src2 = __esm({
12185
12439
  init_config_env();
12186
12440
  init_runtime_profile();
12187
12441
  init_sandbox_probe();
12442
+ init_subagent_statusline();
12188
12443
  }
12189
12444
  });
12190
12445
 
@@ -33843,6 +34098,11 @@ var init_migrate_pg = __esm({
33843
34098
  "SyncState",
33844
34099
  "SyncConflict",
33845
34100
  "SyncTombstone",
34101
+ // SPEC-1215 · ADR-0166 · LOCAL-only, tanpa FK. Tabel ini tak ada di sumber Postgres lama — jalur
34102
+ // 42P01 memperlakukannya sebagai nol baris (cermin AgentInvocation/Changelog). Tetap WAJIB
34103
+ // terdaftar: test migrate-pg menuntut PG_ORDER = seluruh model DMMF.
34104
+ "LogEntry",
34105
+ "LogCursor",
33846
34106
  // SPEC-485 · ADR-0102 · LeadFlow SEBELUM LeadDecision: `flowId` menunjuk ke sana. Tanpa FK, tapi
33847
34107
  // urutan tabel harus tetap mencerminkan arah tautannya bagi pembaca berikutnya.
33848
34108
  // SPEC-646 · ADR-0112 · SchedulerCron SEBELUM SchedulerCronRun: `cronId` menunjuk ke sana. Tanpa