hanoman 0.1.56 → 0.1.58
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 +1 -0
- package/dist/build-info.json +3 -3
- package/dist/cli.js +100 -2
- package/dist/server.js +23044 -29923
- package/docs/agent-integration.md +8 -2
- package/package.json +1 -1
- package/scripts/vps/agent.Containerfile +3 -1
- package/web/assets/hnm-blencong-v01-CBBfchr0.webp +0 -0
- package/web/assets/hnm-dalang-six-arms-v01-DeBacuq8.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ml-v01-Kts3pjTf.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-mr-v01-DQgnE6bD.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ul-v01-CIAWAxFe.webp +0 -0
- package/web/assets/hnm-hero-rig-arm-ur-v01-C0R0CZnp.webp +0 -0
- package/web/assets/hnm-hero-rig-body-v01-DmbKJJHB.webp +0 -0
- package/web/assets/hnm-pet-anoman-atlas-v02-ClJhW17L.webp +0 -0
- package/web/assets/hnm-wayang-panakawan-v01-1LGv-V8N.webp +0 -0
- package/web/assets/hnm-wayang-project-v01-BG9EZqzn.webp +0 -0
- package/web/assets/hnm-wayang-putri-v01-F6p69kHq.webp +0 -0
- package/web/assets/hnm-wayang-satria-alus-v01-CpfoXKTy.webp +0 -0
- package/web/assets/hnm-wayang-satria-gagah-v01-bLfIYAsv.webp +0 -0
- package/web/assets/index-8XHy3DCx.css +41 -0
- package/web/assets/{index-CEx5JlqP.js → index-qxiC8dAD.js} +1562 -1550
- package/web/index.html +2 -2
- package/web/assets/hnm-pet-anoman-atlas-v01-CjC2cwyV.webp +0 -0
- package/web/assets/index-BHwSnJpk.css +0 -41
package/README.md
CHANGED
|
@@ -31,6 +31,7 @@ sebagai root. Nyalakan hardening dari wizard (atau Settings → Setup awal) begi
|
|
|
31
31
|
| `git` | tiap sesi jalan di git worktree terisolasi |
|
|
32
32
|
| `tmux` | sesi agen hidup di tmux, selamat dari restart server |
|
|
33
33
|
| `claude` **atau** `codex` | agen yang mengerjakan backlog |
|
|
34
|
+
| `curl` | hook sesi mengirim pertanyaan agen ke server — tanpanya **hanoman-lead tak menerima satu pun pertanyaan** (SPEC-909/ADR-0146). Tidak fatal: hook selalu `exit 0` dan tak pernah memblokir agen, jadi sesi cuma kembali menunggu manusia — dan justru karena senyap, `doctor` menandainya `!` alih-alih `✗` |
|
|
34
35
|
|
|
35
36
|
`hanoman doctor` melaporkan mana yang belum ada, dan keluar dengan kode ≠ 0 bila ada yang wajib.
|
|
36
37
|
|
package/dist/build-info.json
CHANGED
package/dist/cli.js
CHANGED
|
@@ -5326,7 +5326,7 @@ var init_cron_expr = __esm({
|
|
|
5326
5326
|
});
|
|
5327
5327
|
|
|
5328
5328
|
// ../shared/src/dto.ts
|
|
5329
|
-
var zIssueDeviceToken, zSessionResult, zSessionHistory, zCreateProject, zProjectId, zRenameProject, zUpdateProject, zCreateSpec, zPatchSpec, zChangeSpecSource, zMarkSpecDone, zIntegrate, zSessionSummary, zProjectView, zSchedulerQueueItem, zSchedulerSourceView, zSchedulerSessionView, zSchedulerQueueCounts, zSchedulerState, zLeadDecisionView, zLeadFlowView, zLeadAnswer, zLeadProjectStatus, zLeadStatusView, zFlow, zPrdBrief, zPrdDoc, zBreakdownItem, zBreakdownDoc, zBatchCreateSpec, zEscalationTarget, zEscalationPrefill, zAuditEscalation, zAuditEscalationView, zTerminalSession, zDocFileContent, zDocIndexCat, zDocIndex, HOST_RE, USER_RE, zCreateVps, zPatchVps, USER_ROLES, zUserRole, zLogin, zSignup, zSetup, zSetupApply, zChangePassword, zCreateClientAccount, zUpdateClientAccount, zVpsCheck, zMarkNa, zMarkNaBulk, zAttest, zRemediate, PROVISION_PROFILES, COMPONENT_IDS, zProvision, UPDATE_RESTART_EXIT, CONFIG_RESTART_EXIT, zUpdateApplyBody, zTicketView, zTicketAttachmentView, zSpecAttachmentView, zTicketDetail, zTicketEditInput, zHelpInfo, zPublicTicketStatus, zCronExpr, zCreateCron, zPatchCron, zSchedulerCron, zSchedulerCronRun;
|
|
5329
|
+
var zIssueDeviceToken, zSessionResult, zSessionHistory, zCreateProject, zProjectId, zRenameProject, zUpdateProject, zCreateSpec, zPatchSpec, zChangeSpecSource, zMarkSpecDone, zIntegrate, zSessionSummary, zProjectView, zSchedulerQueueItem, zSchedulerSourceView, zSchedulerSessionView, zSchedulerQueueCounts, zSchedulerState, zLeadDecisionView, zLeadFlowView, zLeadAnswer, zLeadProjectStatus, zLeadStatusView, zFlow, zPrdBrief, zPrdDoc, zBreakdownItem, zBreakdownDoc, zBatchCreateSpec, zEscalationTarget, zEscalationPrefill, zAuditEscalation, zAuditEscalationView, zTerminalSession, zDocFileContent, zDocIndexCat, zDocIndex, HOST_RE, USER_RE, zCreateVps, zPatchVps, USER_ROLES, zUserRole, zLogin, zSignup, zSetup, zSetupApply, zChangePassword, zCreateClientAccount, zUpdateClientAccount, zVpsCheck, zMarkNa, zMarkNaBulk, zAttest, zRemediate, PROVISION_PROFILES, COMPONENT_IDS, zProvision, UPDATE_RESTART_EXIT, CONFIG_RESTART_EXIT, zUpdateApplyBody, MAX_SUBS, zSubPage, zSubLimit, zTopicParams, zEventsClientMsg, zTicketView, zTicketAttachmentView, zSpecAttachmentView, zTicketDetail, zTicketEditInput, zHelpInfo, zPublicTicketStatus, zCronExpr, zCreateCron, zPatchCron, zSchedulerCron, zSchedulerCronRun;
|
|
5330
5330
|
var init_dto = __esm({
|
|
5331
5331
|
"../shared/src/dto.ts"() {
|
|
5332
5332
|
"use strict";
|
|
@@ -5502,6 +5502,7 @@ var init_dto = __esm({
|
|
|
5502
5502
|
specId: external_exports.string(),
|
|
5503
5503
|
flow: external_exports.string().optional(),
|
|
5504
5504
|
branch: external_exports.string().optional(),
|
|
5505
|
+
// SPEC-903 · ADR-0143 · keadaan turunan yang sama dengan pil Terminal & pose pet, bukan isi marker.
|
|
5505
5506
|
decision: external_exports.boolean(),
|
|
5506
5507
|
exited: external_exports.boolean()
|
|
5507
5508
|
});
|
|
@@ -5601,8 +5602,10 @@ var init_dto = __esm({
|
|
|
5601
5602
|
// id sesi yang sedang disusun keputusannya (AC-3)
|
|
5602
5603
|
queued: external_exports.array(external_exports.string()).default([]),
|
|
5603
5604
|
// SPEC-479 · id sesi yang menunggu SLOT, bukan manusia
|
|
5605
|
+
// SPEC-903 · ADR-0143 · id sesi yang bit "menunggu"-nya TURUNAN (marker terisi DAN pane diam),
|
|
5606
|
+
// bukan daftar marker mentah — sumbernya `liveDecisions().waiting`, bit yang sama dengan pil
|
|
5607
|
+
// Terminal. Membangunnya ulang dari marker menghasilkan superset yang berselisih tanpa error.
|
|
5604
5608
|
waiting: external_exports.array(external_exports.string()),
|
|
5605
|
-
// id sesi ber-marker keputusan terisi
|
|
5606
5609
|
lastPulseAt: external_exports.string().nullable(),
|
|
5607
5610
|
// SPEC-479 (QA) · keadaan gerbang konkurensi. Batas yang tak terlihat operator terbaca sebagai
|
|
5608
5611
|
// "lead diam" — persis salah baca yang melahirkan tiket itu. `.default()` supaya klien lama
|
|
@@ -5831,6 +5834,44 @@ var init_dto = __esm({
|
|
|
5831
5834
|
UPDATE_RESTART_EXIT = 75;
|
|
5832
5835
|
CONFIG_RESTART_EXIT = 76;
|
|
5833
5836
|
zUpdateApplyBody = external_exports.object({ confirm: external_exports.boolean().optional() });
|
|
5837
|
+
MAX_SUBS = 16;
|
|
5838
|
+
zSubPage = external_exports.number().int().min(1).max(1e4);
|
|
5839
|
+
zSubLimit = external_exports.number().int().min(1).max(200);
|
|
5840
|
+
zTopicParams = {
|
|
5841
|
+
schedulerState: external_exports.object({}).strict(),
|
|
5842
|
+
schedulerQueue: external_exports.object({
|
|
5843
|
+
status: external_exports.enum(["queued", "launched", "done", "failed", "canceled"]),
|
|
5844
|
+
page: zSubPage,
|
|
5845
|
+
limit: zSubLimit
|
|
5846
|
+
}).strict(),
|
|
5847
|
+
tickets: external_exports.object({
|
|
5848
|
+
project: external_exports.string().max(120).optional(),
|
|
5849
|
+
status: external_exports.string().max(40).optional(),
|
|
5850
|
+
q: external_exports.string().max(200).optional(),
|
|
5851
|
+
page: zSubPage,
|
|
5852
|
+
limit: zSubLimit
|
|
5853
|
+
}).strict(),
|
|
5854
|
+
lead: external_exports.object({
|
|
5855
|
+
projectId: external_exports.string().max(120).optional(),
|
|
5856
|
+
decPage: zSubPage,
|
|
5857
|
+
flowPage: zSubPage,
|
|
5858
|
+
limit: zSubLimit
|
|
5859
|
+
}).strict(),
|
|
5860
|
+
git: external_exports.object({
|
|
5861
|
+
projectId: external_exports.string().max(120),
|
|
5862
|
+
limit: external_exports.number().int().min(1).max(2e4),
|
|
5863
|
+
branch: external_exports.string().max(200),
|
|
5864
|
+
showRemote: external_exports.boolean(),
|
|
5865
|
+
showTags: external_exports.boolean()
|
|
5866
|
+
}).strict()
|
|
5867
|
+
};
|
|
5868
|
+
zEventsClientMsg = external_exports.object({
|
|
5869
|
+
t: external_exports.literal("sub"),
|
|
5870
|
+
subs: external_exports.array(external_exports.object({
|
|
5871
|
+
topic: external_exports.string().max(40),
|
|
5872
|
+
params: external_exports.record(external_exports.unknown())
|
|
5873
|
+
})).max(MAX_SUBS)
|
|
5874
|
+
}).strict();
|
|
5834
5875
|
zTicketView = external_exports.object({
|
|
5835
5876
|
id: external_exports.string(),
|
|
5836
5877
|
projectId: external_exports.string(),
|
|
@@ -6050,6 +6091,8 @@ var init_api = __esm({
|
|
|
6050
6091
|
// baris pun perubahan di services/agent-capabilities.ts.
|
|
6051
6092
|
terminalDialog: (id) => `${API}/terminal/sessions/${id}/dialog`,
|
|
6052
6093
|
terminalDialogAnswer: (id) => `${API}/terminal/sessions/${id}/dialog/answer`,
|
|
6094
|
+
// SPEC-909 · ADR-0146 · hentikan hanoman-lead untuk sesi ini sebelum ia mengetik ke pane.
|
|
6095
|
+
terminalDialogTakeover: (id) => `${API}/terminal/sessions/${id}/dialog/takeover`,
|
|
6053
6096
|
terminalPhases: (id) => `${API}/terminal/sessions/${id}/phases`,
|
|
6054
6097
|
// SPEC-230 · review + integrate ber-skop sesi (sesi project-level PRD, tanpa Spec).
|
|
6055
6098
|
sessionReview: (id) => `${API}/terminal/sessions/${id}/review`,
|
|
@@ -7673,6 +7716,41 @@ var init_session_dialog = __esm({
|
|
|
7673
7716
|
}
|
|
7674
7717
|
});
|
|
7675
7718
|
|
|
7719
|
+
// ../shared/src/session-ask.ts
|
|
7720
|
+
var ASK_MAX_QUESTIONS, ASK_MAX_OPTIONS, zOption, zQuestion, zAskTool, zTurnEnd;
|
|
7721
|
+
var init_session_ask = __esm({
|
|
7722
|
+
"../shared/src/session-ask.ts"() {
|
|
7723
|
+
"use strict";
|
|
7724
|
+
init_zod();
|
|
7725
|
+
ASK_MAX_QUESTIONS = 8;
|
|
7726
|
+
ASK_MAX_OPTIONS = 32;
|
|
7727
|
+
zOption = external_exports.object({
|
|
7728
|
+
label: external_exports.string().min(1),
|
|
7729
|
+
description: external_exports.string().optional()
|
|
7730
|
+
});
|
|
7731
|
+
zQuestion = external_exports.object({
|
|
7732
|
+
question: external_exports.string().min(1),
|
|
7733
|
+
header: external_exports.string().default(""),
|
|
7734
|
+
multiSelect: external_exports.boolean().default(false),
|
|
7735
|
+
options: external_exports.array(zOption).max(ASK_MAX_OPTIONS).default([])
|
|
7736
|
+
});
|
|
7737
|
+
zAskTool = external_exports.object({
|
|
7738
|
+
hook_event_name: external_exports.literal("PreToolUse"),
|
|
7739
|
+
tool_name: external_exports.literal("AskUserQuestion"),
|
|
7740
|
+
tool_use_id: external_exports.string().min(1),
|
|
7741
|
+
tool_input: external_exports.object({ questions: external_exports.array(zQuestion).min(1).max(ASK_MAX_QUESTIONS) })
|
|
7742
|
+
});
|
|
7743
|
+
zTurnEnd = external_exports.object({
|
|
7744
|
+
hook_event_name: external_exports.literal("Stop"),
|
|
7745
|
+
turn_id: external_exports.string().min(1),
|
|
7746
|
+
last_assistant_message: external_exports.string().optional(),
|
|
7747
|
+
// Codex menyalakan bendera ini saat Stop dipicu oleh hook Stop lain. Melayani giliran yang
|
|
7748
|
+
// dibangkitkan gate mode goal (ADR-0074) berarti lead menjawab dirinya sendiri.
|
|
7749
|
+
stop_hook_active: external_exports.boolean().optional()
|
|
7750
|
+
});
|
|
7751
|
+
}
|
|
7752
|
+
});
|
|
7753
|
+
|
|
7676
7754
|
// ../shared/src/index.ts
|
|
7677
7755
|
var init_src = __esm({
|
|
7678
7756
|
"../shared/src/index.ts"() {
|
|
@@ -7711,6 +7789,7 @@ var init_src = __esm({
|
|
|
7711
7789
|
init_terminal_workspace();
|
|
7712
7790
|
init_terminal_io();
|
|
7713
7791
|
init_session_dialog();
|
|
7792
|
+
init_session_ask();
|
|
7714
7793
|
}
|
|
7715
7794
|
});
|
|
7716
7795
|
|
|
@@ -7843,9 +7922,18 @@ var init_git = __esm({
|
|
|
7843
7922
|
});
|
|
7844
7923
|
|
|
7845
7924
|
// ../runner/src/settings.ts
|
|
7925
|
+
var EVENT_HOOK_COMMAND;
|
|
7846
7926
|
var init_settings = __esm({
|
|
7847
7927
|
"../runner/src/settings.ts"() {
|
|
7848
7928
|
"use strict";
|
|
7929
|
+
EVENT_HOOK_COMMAND = [
|
|
7930
|
+
'curl -sS -m 2 -X POST "$HANOMAN_EVENT_URL"',
|
|
7931
|
+
"-H 'content-type: application/json'",
|
|
7932
|
+
'-H "authorization: Bearer $HANOMAN_EVENT_TOKEN"',
|
|
7933
|
+
'-H "x-hanoman-session: $HANOMAN_SESSION_ID"',
|
|
7934
|
+
'${HANOMAN_EVENT_HOST:+-H "host: $HANOMAN_EVENT_HOST"}',
|
|
7935
|
+
"--data-binary @- >/dev/null 2>&1; exit 0"
|
|
7936
|
+
].join(" ");
|
|
7849
7937
|
}
|
|
7850
7938
|
});
|
|
7851
7939
|
|
|
@@ -7865,6 +7953,7 @@ var init_codex_settings = __esm({
|
|
|
7865
7953
|
"use strict";
|
|
7866
7954
|
init_src();
|
|
7867
7955
|
init_prompt();
|
|
7956
|
+
init_settings();
|
|
7868
7957
|
}
|
|
7869
7958
|
});
|
|
7870
7959
|
|
|
@@ -8749,6 +8838,14 @@ function doctorReport(p) {
|
|
|
8749
8838
|
text: p.gh ? `gh ${p.gh}` : "gh \u2014 tak ada (tarik issue akan lewat HTTP + GITHUB_TOKEN)",
|
|
8750
8839
|
fatal: false
|
|
8751
8840
|
},
|
|
8841
|
+
// SPEC-909 · ADR-0146 · NON-FATAL dan itu disengaja: tanpa `curl` hook tetap `exit 0` — ia tak
|
|
8842
|
+
// pernah memblokir agen — tapi hanoman-lead tak akan menerima SATU PUN pertanyaan sesi, dan tak
|
|
8843
|
+
// ada error di mana pun yang akan mengatakannya. Kegagalan senyap justru yang layak dilaporkan.
|
|
8844
|
+
{
|
|
8845
|
+
mark: p.curl ? "\u2713" : "!",
|
|
8846
|
+
text: p.curl ? `curl ${p.curl}` : "curl \u2014 TAK ADA: hanoman-lead tak akan menerima pertanyaan sesi (SPEC-909)",
|
|
8847
|
+
fatal: false
|
|
8848
|
+
},
|
|
8752
8849
|
// Direktori turunan lahir saat dipakai, jadi izin tulis yang belum ada di situ adalah
|
|
8753
8850
|
// peringatan — bukan alasan menyatakan hanoman tak bisa menjalankan sesi. Home tetap fatal.
|
|
8754
8851
|
...p.dirs.map((d) => ({
|
|
@@ -8836,6 +8933,7 @@ async function doctor(_argv, ctx) {
|
|
|
8836
8933
|
claude,
|
|
8837
8934
|
codex,
|
|
8838
8935
|
gh: version(ctx.env.HANOMAN_GH_BIN ?? "gh", ["--version"]),
|
|
8936
|
+
curl: version("curl", ["--version"]),
|
|
8839
8937
|
dirs,
|
|
8840
8938
|
web: layout.web !== null,
|
|
8841
8939
|
db,
|