hanoman 0.1.56 → 0.1.57

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 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
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.56",
3
- "sha": "5fe3c6ff",
4
- "builtAt": "2026-08-22T15:22:43.448Z"
2
+ "version": "0.1.57",
3
+ "sha": "adc91bbe",
4
+ "builtAt": "2026-08-23T01:27:34.157Z"
5
5
  }
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,