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.
- package/README.md +2 -0
- package/dist/build-info.json +3 -3
- package/dist/cli.js +362 -28
- package/dist/server.js +2521 -1070
- package/docs/agent-integration.md +4 -0
- package/package.json +1 -1
- package/prisma/migrations/20260915120000_log_terpusat/migration.sql +34 -0
- package/prisma/schema.prisma +39 -0
- package/web/assets/{ChangelogScreen-aqsJmmfe.js → ChangelogScreen-DVMpzy2Y.js} +1 -1
- package/web/assets/{DalangHanomanScreen-D3rNURz7.js → DalangHanomanScreen-aY89PmaJ.js} +1 -1
- package/web/assets/{DocPreviewModal-B7r_7p8N.js → DocPreviewModal-BTwj2rmX.js} +1 -1
- package/web/assets/{DocsWorkspace-_w6pncu9.js → DocsWorkspace-CgM5rgcr.js} +1 -1
- package/web/assets/{IdeScreen-etZ2QyO-.js → IdeScreen-B7oDlNQ0.js} +1 -1
- package/web/assets/{LeadScreen-Bo0K2-ML.js → LeadScreen-BzNU_kBC.js} +1 -1
- package/web/assets/{ReviewScreen-lRf2FW30.js → ReviewScreen-Dk0Zy4jJ.js} +1 -1
- package/web/assets/{SchedulerScreen-D75twy4J.js → SchedulerScreen-CxYqEqnw.js} +1 -1
- package/web/assets/SettingsScreen-D1Fop_V6.js +62 -0
- package/web/assets/{TeamScreen-nsttkE2J.js → TeamScreen-DwtrDuZG.js} +1 -1
- package/web/assets/TerminalScreen-CViC7rot.js +9 -0
- package/web/assets/{TriageScreen-7eM8gjr_.js → TriageScreen-DjCXx0F4.js} +1 -1
- package/web/assets/{VpsScreen-C29j52Tu.js → VpsScreen-C2WoJQ_j.js} +1 -1
- package/web/assets/{diff-view-RZNZ9Nz6.js → diff-view-Bep86yt6.js} +1 -1
- package/web/assets/index-Bd9gXx1g.js +923 -0
- package/web/assets/{live-CniaVDeP.js → live-BlNZnTbo.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/SettingsScreen-rMIR22vv.js +0 -62
- package/web/assets/TerminalScreen-BG9vRE1-.js +0 -9
- 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
|
|
package/dist/build-info.json
CHANGED
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-
|
|
4546
|
-
effort: external_exports.string().default("
|
|
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-
|
|
4656
|
-
effort: external_exports.string().default("
|
|
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
|
|
10283
|
-
if (
|
|
10284
|
-
if (
|
|
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,
|
|
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,
|
|
23651
|
-
return Promise.reject(new SdkError(SdkErrorCode.UnsupportedResultType, `Unsupported result type '${decoded.kind}' for ${
|
|
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:
|
|
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
|
|
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,
|
|
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
|