@tocca-systems/twp-cli 0.64.0 → 0.66.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 (113) hide show
  1. package/CHANGELOG.public.md +24 -0
  2. package/README.md +116 -8
  3. package/command-model/wiki.json +2 -2
  4. package/dist/agent-SFX3ZVOB.js +160 -0
  5. package/dist/{agent-loop-GPPUR2WD.js → agent-loop-6JO4PJRG.js} +23 -20
  6. package/dist/{ai-dispatch-FZDFJ4TN.js → ai-dispatch-YICIA4NI.js} +3 -3
  7. package/dist/analysis-HMOECNWG.js +5 -0
  8. package/dist/{announcement-ASKS53LL.js → announcement-Q642UMYK.js} +1 -1
  9. package/dist/{api-command-N2OJNJBC.js → api-command-4CUGQQI3.js} +4 -4
  10. package/dist/{app-QA2HKG6E.js → app-BBPK653N.js} +4 -4
  11. package/dist/{attendance-correct-KBNPGFGR.js → attendance-correct-DWVFYL2Y.js} +2 -2
  12. package/dist/{attendance-lists-C7TO3GQ2.js → attendance-lists-772Y3ZWA.js} +2 -2
  13. package/dist/{backlog-AWOTTGPB.js → backlog-FG3Y5JTE.js} +38 -28
  14. package/dist/{budget-Z6ILL7AU.js → budget-5WUQAAAZ.js} +2 -2
  15. package/dist/capacity-report-command-PBE73I43.js +15 -0
  16. package/dist/chunk-2OG4LAGD.js +41 -0
  17. package/dist/{chunk-T4QZO6RQ.js → chunk-5SONMN6K.js} +1 -1
  18. package/dist/chunk-6CS5L24D.js +4 -0
  19. package/dist/chunk-6OLZMQBK.js +11 -0
  20. package/dist/chunk-6PAZUW73.js +16 -0
  21. package/dist/{chunk-YKI7NYBD.js → chunk-7EJOKJLV.js} +57 -18
  22. package/dist/{chunk-3WFZOOXZ.js → chunk-AGI5KT4C.js} +1 -1
  23. package/dist/{chunk-LAAKI3GS.js → chunk-APPYZQNC.js} +1 -1
  24. package/dist/{chunk-4CR64SNH.js → chunk-CCBNU5Y3.js} +2 -2
  25. package/dist/{chunk-RWR7OHVP.js → chunk-DAOC7VRM.js} +1 -1
  26. package/dist/{chunk-JYCJ4N6T.js → chunk-F4PGPJOI.js} +1 -1
  27. package/dist/{chunk-AEJHDFXB.js → chunk-FABDZBDZ.js} +5 -5
  28. package/dist/{chunk-PIB6MGG5.js → chunk-FAHDBWW2.js} +1 -1
  29. package/dist/{chunk-234WHKGS.js → chunk-FDVWV3AY.js} +2 -2
  30. package/dist/chunk-G4TZFGNN.js +41 -0
  31. package/dist/{chunk-NQWTPHUO.js → chunk-GLKZ4ZZY.js} +1 -1
  32. package/dist/{worker-agent-XCJGZHMT.js → chunk-HBEOI456.js} +3 -3
  33. package/dist/{chunk-ITRTFBV3.js → chunk-HNG6MF26.js} +52 -49
  34. package/dist/{chunk-QSXS5SB2.js → chunk-HPPIVCK3.js} +3 -2
  35. package/dist/chunk-KDH3KWPO.js +4 -0
  36. package/dist/chunk-LJVAOWZI.js +65 -0
  37. package/dist/{chunk-UIHNYBME.js → chunk-NVMJXFBT.js} +1 -1
  38. package/dist/{chunk-FITASHOM.js → chunk-OMWCSE4P.js} +2 -2
  39. package/dist/{chunk-XPPT3MUY.js → chunk-P2DSHLHD.js} +2 -2
  40. package/dist/chunk-P6M2MCZJ.js +97 -0
  41. package/dist/{chunk-RROCQRRY.js → chunk-QJAZLPA3.js} +1 -1
  42. package/dist/chunk-SPZ3GBYC.js +16 -0
  43. package/dist/chunk-VIWQMDGG.js +91 -0
  44. package/dist/{chunk-S5DEP2HA.js → chunk-W2AIT5FJ.js} +5 -5
  45. package/dist/{chunk-FDRXS6ZU.js → chunk-WBUYPDJH.js} +1 -1
  46. package/dist/{chunk-5LPELULJ.js → chunk-WMEGP2BT.js} +1 -1
  47. package/dist/{chunk-NXWXTUU6.js → chunk-X6L5LUC4.js} +1 -1
  48. package/dist/{chunk-6PQO3AYP.js → chunk-XCPZ4R65.js} +1 -1
  49. package/dist/{chunk-VV4GTQ2L.js → chunk-XGYOJHZC.js} +16 -13
  50. package/dist/cli.js +100 -11
  51. package/dist/{commands-WIQVCMQE.js → commands-4C6TJ4WG.js} +1 -1
  52. package/dist/{commands-HK7DUMUJ.js → commands-62NWF7GA.js} +105 -155
  53. package/dist/{company-YPDJZ3SE.js → company-4DHVAW25.js} +2 -2
  54. package/dist/{completion-7RHQKR5U.js → completion-WR2GXZE7.js} +5 -4
  55. package/dist/{contract-2Y5VN3TR.js → contract-PT7VW4IE.js} +2 -2
  56. package/dist/{department-K4EFC6NW.js → department-C6WIZPBS.js} +1 -1
  57. package/dist/{deposit-NTLHIMJL.js → deposit-OEYFPEZG.js} +1 -1
  58. package/dist/{estimate-C5LUNIWR.js → estimate-4BUJQ3TP.js} +3 -3
  59. package/dist/{evaluation-ZWUHSENB.js → evaluation-GLXQ54F6.js} +1 -1
  60. package/dist/{expense-BXJ7QYMP.js → expense-QE3WIJTN.js} +1 -1
  61. package/dist/fiscal-year-YJWFQN4P.js +17 -0
  62. package/dist/{inquiry-KHPPTYN6.js → inquiry-ORB3ROAJ.js} +1 -1
  63. package/dist/{invoice-VV2NT4A3.js → invoice-XLX5KS2T.js} +3 -3
  64. package/dist/{job-title-RCSL5Y2Z.js → job-title-UDF6I3BP.js} +1 -1
  65. package/dist/{knowledge-BLU6RHS5.js → knowledge-4QPIGJEE.js} +32 -27
  66. package/dist/{leave-RJBCHZCQ.js → leave-3BJMXI7Q.js} +3 -3
  67. package/dist/license-OMIZUUTW.js +56 -0
  68. package/dist/{logout-guard-GQBF3GQH.js → logout-guard-2Y7HPIKN.js} +2 -1
  69. package/dist/{media-OIAOW546.js → media-77LTBOQX.js} +3 -3
  70. package/dist/{notification-KPMGELOR.js → notification-2IESSY5E.js} +1 -1
  71. package/dist/{oneshot-OWEBFX5O.js → oneshot-4XO5HIJR.js} +1 -1
  72. package/dist/{outlook-AAS5DXYQ.js → outlook-KYTXHDAV.js} +1 -1
  73. package/dist/plan-submit-T5KHXNGH.js +4 -0
  74. package/dist/{position-NY5LRELH.js → position-CR6P4WC5.js} +1 -1
  75. package/dist/{project-4MEGZ326.js → project-JJEMEO2W.js} +1 -1
  76. package/dist/{prospect-7D2WK56K.js → prospect-QG6X7ALK.js} +2 -2
  77. package/dist/{purchase-S7W67LJP.js → purchase-Z6ENEOZM.js} +3 -3
  78. package/dist/{receivable-GFJTEELC.js → receivable-ZBDXXMHX.js} +1 -1
  79. package/dist/{redmine-P3EMFFHY.js → redmine-EIFHMLNE.js} +1 -1
  80. package/dist/{registry-GRRRT3I6.js → registry-BIJNO3HE.js} +1 -1
  81. package/dist/{report-FUIVLC7B.js → report-TTXGXSR3.js} +1 -1
  82. package/dist/revision-command-PM7FQUVF.js +31 -0
  83. package/dist/{run-LSWFO4IY.js → run-TYKHDD6N.js} +2 -2
  84. package/dist/{sales-ai-review-P36TTQRO.js → sales-ai-review-6TDJFHDL.js} +1 -1
  85. package/dist/{sales-master-3CGHEFKF.js → sales-master-H5HMVBJV.js} +3 -3
  86. package/dist/{sales-numbering-3M2C2MAI.js → sales-numbering-Q5KRM63Y.js} +1 -1
  87. package/dist/{schedule-command-R5KTFAVZ.js → schedule-command-2HCOGYJW.js} +1 -1
  88. package/dist/{search-U3QNPR4D.js → search-GRAWP2LX.js} +1 -1
  89. package/dist/segment-YOUY4PZC.js +6 -0
  90. package/dist/server-settings-LJBDUOTV.js +4 -0
  91. package/dist/{server-skills-IFTDV3IQ.js → server-skills-KX236POI.js} +1 -1
  92. package/dist/{setup-MUPUY2AX.js → setup-HHPKB6N4.js} +3 -3
  93. package/dist/{skill-C4TGG7SH.js → skill-RH5MBRXZ.js} +1 -1
  94. package/dist/{supplier-payment-KG57PNWJ.js → supplier-payment-EJTFKAKY.js} +2 -2
  95. package/dist/{support-BRVAJ7IH.js → support-FR3KY63E.js} +1 -1
  96. package/dist/{task-RYBYPM4N.js → task-O7K6725Y.js} +3 -3
  97. package/dist/{teams-GPJ6HMIX.js → teams-QRVCFJS4.js} +1 -1
  98. package/dist/{user-3DE46776.js → user-PRGHG3HM.js} +15 -103
  99. package/dist/user-contract-type-K7CLKCEE.js +32 -0
  100. package/dist/worker-agent-WDYZTQ5C.js +4 -0
  101. package/dist/{workflow-MMEOWZJC.js → workflow-S25JXGWN.js} +1 -1
  102. package/package.json +1 -1
  103. package/dist/agent-UAOZYMQM.js +0 -100
  104. package/dist/analysis-RKWGO7UY.js +0 -4
  105. package/dist/chunk-2B7A3OY7.js +0 -102
  106. package/dist/chunk-4P7EYEL5.js +0 -4
  107. package/dist/chunk-AT432SCP.js +0 -15
  108. package/dist/chunk-QEWCTKPV.js +0 -15
  109. package/dist/chunk-QHX5YFMM.js +0 -23
  110. package/dist/chunk-RZ2NZE4U.js +0 -36
  111. package/dist/chunk-THOBFX2S.js +0 -10
  112. package/dist/plan-submit-AWMD7XOY.js +0 -3
  113. package/dist/server-settings-3YD7RR3A.js +0 -3
@@ -0,0 +1,97 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{placeholderTaskKey,stepToItem}from"./chunk-6PAZUW73.js";import{describeError,pick,pickString}from"./chunk-SPZ3GBYC.js";import{localDate}from"./chunk-LJVAOWZI.js";import{normalizeSkillName,skillOfItem}from"./chunk-FABDZBDZ.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE,setSkillPrefix,skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{isTaskKey}from"./chunk-II5RVJQN.js";import{createHash,randomBytes}from"crypto";import fs2 from"fs";import path2 from"path";var INFLIGHT_STALE_HOURS=3;function staleFloorHours(aiTimeoutSec){return Math.ceil(aiTimeoutSec*2/3600)}function inflightStaleHours(aiTimeoutSec,baseHours=INFLIGHT_STALE_HOURS){const base=Number.isFinite(baseHours)&&baseHours>0?baseHours:INFLIGHT_STALE_HOURS;return Math.max(base,staleFloorHours(aiTimeoutSec))}function ageMinutesOf(item,now){for(const raw of[item.started_at,item.updated_at,item.dequeued_at,item.created_at]){if(!raw)continue;const ts=Date.parse(raw);if(Number.isNaN(ts))continue;return Math.
4
+ floor((now.getTime()-ts)/6e4)}return null}function inflightEntries(items,now=new Date,staleHours=INFLIGHT_STALE_HOURS){const staleMinutes=staleHours*60;const byKey=new Map;for(const item of items){const key=(item.task_key??"").trim();if(!key)continue;const ageMinutes=ageMinutesOf(item,now);if(ageMinutes!==null&&ageMinutes>staleMinutes)continue;const entry={key,runner:item.runner_id??"-",ageMinutes,label:(item.label??"").slice(0,60)};const prev=byKey.get(key);if(!prev||(entry.ageMinutes??-1)>(prev.
5
+ ageMinutes??-1))byKey.set(key,entry)}return[...byKey.values()].sort((a,b)=>a.key.localeCompare(b.key))}function formatInflightEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.key} runner=${entry.runner} \u7D4C\u904E=${age}`}import fs from"fs";import path from"path";async function createItem(api,body){const res=await api.create(body);if(!res.ok)return{itemId:null,detail:describeError(res)};for(const p of["item_id","id","item.item_id","item.id","data.item_id","data.id"]){const v=pickString(res.json,p);if(v)return{itemId:v,detail:""}}return{itemId:null,detail:`item_id \u3092\u8AAD\u3081\u307E\u305B\u3093: ${res.raw.slice(0,200)}`}}function reorderSucceeded(targetId,json){if(pick(json,"result")===true)return true;const raw=Array.isArray(json)?json:pick(json,"i\
6
+ tems");if(!Array.isArray(raw)||raw.length===0)return false;const items=raw;const orderOf=it=>typeof it.sort_order==="number"?it.sort_order:Number.POSITIVE_INFINITY;const hit=items.find(it=>(it.item_id??"")===targetId);if(!hit)return false;return orderOf(hit)===Math.min(...items.map(orderOf))}function queueContainsKey(items,key){const re=new RegExp(`${key.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![0-9])`);return items.some(it=>re.test(`${it.label??""}
7
+ ${it.prompt??""}
8
+ ${it.task_key??""}`))}function localTimestamp(at=new Date){const p2=n=>String(n).padStart(2,"0");const offsetMin=-at.getTimezoneOffset();const sign=offsetMin>=0?"+":"-";const abs=Math.abs(offsetMin);return`${at.getFullYear()}-${p2(at.getMonth()+1)}-${p2(at.getDate())}T${p2(at.getHours())}:${p2(at.getMinutes())}:${p2(at.getSeconds())}${sign}${p2(Math.trunc(abs/60))}${p2(abs%60)}`}var ReleaseOutcomeLog=class{constructor(file){this.file=file}file;record(result,phase,reason,ai){const clean=reason.replace(
9
+ /[\t\n]/g," ").slice(0,200);const line=`${localTimestamp()} ${result} ${phase||"unknown"} ${ai||"unknown"} ${clean}
10
+ `;try{fs.mkdirSync(path.dirname(this.file),{recursive:true});fs.appendFileSync(this.file,line)}catch{}}};function parseReleaseResult(logText){const matches=[...logText.matchAll(/RELEASE_RESULT:[^|\n]*\|[^|\n]*\|[^\n]*/g)];const line=matches.at(-1)?.[0];if(!line)return null;const parts=line.split("|").map(s=>s.trim());return{executed:!/NOT_EXECUTED/.test(parts[0]??""),phase:parts[1]??"",reason:parts[2]??"",line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];
11
+ const last=matches.at(-1);if(last===void 0)return null;const value=(last[2]??"").trim();return value===""?null:`${last[1]??""}: ${value}`}var RECOVER_KEY_RE=/RECOVER:[ \t]*([^\s|、,,]+-\d+)/;function parseRecoverKey(line){const raw=RECOVER_KEY_RE.exec(line)?.[1];if(raw===void 0)return null;if(!raw.includes("%"))return raw;try{const key=decodeURIComponent(raw);return isTaskKey(key)&&key.trim()===key?key:null}catch{return null}}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.
12
+ exec(line);return m?.[1]??null}function parsePhase5Pending(line){const m=/PHASE5_PENDING:\s*(\d+)/.exec(line);return m?.[1]??null}function parseKeysLine(logText,keysLine){const prefix=keysLine.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");const matches=[...logText.matchAll(new RegExp(`${prefix}:[ \\t]*([A-Za-z0-9,_-]*)`,"g"))];const raw=matches.at(-1)?.[1];if(raw===void 0)return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;
13
+ var PARTIAL_MERGE_ESCALATION_MAX=1;var TANI_USER_ID="2f391dda-f0e3-42f8-a9fd-8ffc271be765";var STATUS_HUMAN_DECISION="35e2d271-8a6e-4f3f-8bb6-1588a2d5a894";async function enqueueBlockerRecovery(deps,releaseLine){const{api,config,log}=deps;const key=parseRecoverKey(releaseLine);if(!key)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");
14
+ log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");return}if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);
15
+ return}const today=localDate(config.counterTimezone);const res=await api.consumeCounter(`blocker_recovery.${key}`,today,config.blockerRecoveryMaxPerDay);if(!res.ok){if(res.status!==null&&res.status>=400&&res.status<500){log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002**\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u307E\u305B\u3093**`);log.log(` \u78BA\u8A8D:\
16
+ \u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u73FE\u5728 ${config.counterTimezone}\u30FB\u9001\u4FE1\u3057\u305F\u65E5\u4ED8 ${today}\uFF09\uFF0F\u4E0A\u9650\uFF08\u73FE\u5728 ${config.blockerRecoveryMaxPerDay}\uFF09`)}else{log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}
17
+ return}const granted=pickString(res.json,"granted");const count=pickString(res.json,"counter.count");if(granted===""){log.log(` \u26D4 ${key} \u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306F\u672C\u65E5 ${count||
18
+ "?"} \u56DE\u6295\u5165\u6E08\u307F\uFF08\u4E0A\u9650 ${config.blockerRecoveryMaxPerDay}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u4EBA\u9593\u5224\u65AD\u3078\u5BC4\u305B\u3066\u304F\u3060\u3055\u3044`);return}const{itemId,detail}=await createItem(api,{label:`[\u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC] ${key} \u306E\u4FEE\u6B63\uFF08\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u89E3\u9664\u306E\u305F\u3081\u6700\u512A\u5148\uFF09 #ai:complex`,prompt:skillCommand(
19
+ "task-investigate-and-fix",key),ai_type:"claude",task_key:key});if(!itemId){log.log(` \u26A0\uFE0F ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB \u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC ${key}\
20
+ \u306E\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u306B\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(` \u26A0\uFE0F ${key} \u306E\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09`)}}function queueContainsSkill(items,skillCommand2){
21
+ return items.some(it=>(it.prompt??"").includes(skillCommand2))}async function enqueueReleasePhase5Recovery(deps,releaseLine){const{api,config,log}=deps;const releaseId=parsePhase5Pending(releaseLine);if(!releaseId)return;const recoverySkill=config.operations.releaseRecoverySkill;if(!recoverySkill)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");
22
+ log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u304C\u4E8C\u91CD\u306B\u8D70\u308A\u307E\u3059\uFF09");return}if(queueContainsSkill(queued,recoverySkill)){log.log(" \u23ED \u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7");
23
+ return}const today=localDate(config.counterTimezone);const res=await api.consumeCounter(`release_phase5.${releaseId}`,today,PHASE5_RECOVERY_MAX);if(!res.ok){log.log(` \u26D4 release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u5B9A\u671F\u67A0\u304C\u62FE\u3044\u307E\u3059\uFF09`);return}const granted=pickString(
24
+ res.json,"granted");if(granted===""){log.log(` \u26D4 release ${releaseId} \u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306F\u4E0A\u9650\uFF08${PHASE5_RECOVERY_MAX}\
25
+ \u56DE/\u65E5\uFF09\u306B\u9054\u3057\u3066\u3044\u307E\u3059 \u2192 \u5B9A\u671F\u67A0\u306B\u59D4\u306D\u307E\u3059`);return}const{itemId,detail}=await createItem(api,{label:`[\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE] release ${releaseId} \u306E\u672C\u756A\u53CD\u6620\u78BA\u8A8D\u30FB\u30B9\u30C6\u30FC\u30BF\u30B9\u66F4\u65B0\u304C\u672A\u5B9F\u65BD #ai:complex`,prompt:recoverySkill,ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);
26
+ return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u306B\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(` \u26A0\uFE0F release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09`)}}
27
+ async function enqueueReleasePartialMergeRerun(deps,releaseLine){const{api,config,log}=deps;const recoverySkill=config.operations.releaseRecoverySkill;if(!recoverySkill)return;const cause=parsePartialMergeCause(releaseLine);if(!cause)return;log.log(` \u{1F9E9} \u90E8\u5206\u30DE\u30FC\u30B8\u3092\u691C\u77E5\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\uFF09\u3002\u5224\u65AD\u6839\u62E0: ${releaseLine.slice(0,240)}`);if(parseRecoverKey(releaseLine)){log.log(" \u23ED \u540C\u3058\u884C\u306B RECOVER\
28
+ : \u304C\u3042\u308A\u307E\u3059 \u2192 \u5148\u306B\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u3092\u901A\u3057\u307E\u3059\uFF08\u518D\u5B9F\u884C\u306F\u305D\u306E\u5F8C\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u5224\u5B9A\uFF09");return}if(!config.releaseRerunAutoEnqueue){log.log(" \u23ED \u81EA\u52D5\u518D\u5B9F\u884C\u306F\u7121\u52B9\u3067\u3059\uFF08RELEASE_RERUN_AUTOENQUEUE_ENABLED=false\uFF09\u2192 \u5F93\u6765\u3069\u304A\u308A\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059");await escalatePartialMerge(
29
+ deps,cause,"0",releaseLine,"disabled");return}if(config.safeMode){log.log(" \u23ED \u5B89\u5168\u30E2\u30FC\u30C9\uFF08SAFE=1\uFF09\u306E\u305F\u3081\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u306E\u518D\u5B9F\u884C\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u90E8\u5206\u30DE\u30FC\u30B8\u306F\u6B8B\u3063\u305F\u307E\u307E\u306A\u306E\u3067\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059");await escalatePartialMerge(deps,cause,"0",releaseLine,"safe-mode");return}const queued=await api.queuedSnapshot();
30
+ if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");
31
+ return}if(queueContainsSkill(queued,recoverySkill)){log.log(" \u23ED \u30EA\u30EA\u30FC\u30B9\u5B9F\u884C\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u518D\u5B9F\u884C\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7\uFF08\u305D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u5DEE\u3092\u57CB\u3081\u307E\u3059\uFF09");return}const today=localDate(config.counterTimezone);const slug=causeCounterSlug(cause);const res=await api.consumeCounter(`releas\
32
+ e_rerun.${slug}`,today,config.releaseRerunMaxPerCause);if(!res.ok){if(res.status!==null&&res.status>=400&&res.status<500){log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002**\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u307E\u305B\u3093**`);log.log(` \u78BA\u8A8D: \u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u73FE\u5728 ${config.counterTimezone}\u30FB\u9001\u4FE1\u3057\u305F\u65E5\u4ED8 ${today}\
33
+ \uFF09\uFF0F\u4E0A\u9650\uFF08\u73FE\u5728 ${config.releaseRerunMaxPerCause}\uFF09`)}else{log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}return}const granted=pickString(res.json,"granted");const count=pickString(res.json,"counte\
34
+ r.count");if(granted===""){log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED \u539F\u56E0\u30AD\u30FC ${cause} \u306E\u81EA\u52D5\u518D\u5B9F\u884C\u306F\u4E0A\u9650\uFF08${config.
35
+ releaseRerunMaxPerCause}\u56DE\uFF09\u306B\u9054\u3057\u3066\u3044\u307E\u3059 \u2192 \u81EA\u52D5\u6295\u5165\u3092\u6B62\u3081\u3066\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059`);await escalatePartialMerge(deps,cause,count||String(config.releaseRerunMaxPerCause),releaseLine,"limit");return}const attempt=count||"1";const{itemId,detail}=await createItem(api,{label:`[P0] \u672C\u756A\u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\uFF08\u90E8\u5206\u30DE\u30FC\u30B8\u89E3\u6D88\u30FB\u539F\u56E0\u30AD\u30FC ${cause}\
36
+ \u30FB${attempt}/${config.releaseRerunMaxPerCause}\u56DE\u76EE\uFF09 #ai:complex`,prompt:`${recoverySkill} ${rerunArgs(cause,attempt,config.releaseRerunMaxPerCause,releaseLine)}`,ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u306E\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);await escalatePartialMerge(deps,cause,attempt,
37
+ releaseLine,"create-failed",detail);return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u3092\u30AD\u30E5\u30FC\u5148\u982D\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB\u672C\u65E5 ${attempt}/${config.releaseRerunMaxPerCause} \u56DE\u76EE\u30FB\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(" \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\
38
+ \u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09")}}function causeCounterSlug(cause){return cause.replace(/[^A-Za-z0-9_-]/g,"_")}function rerunArgs(cause,attempt,max,releaseLine){return`\u90E8\u5206\u30DE\u30FC\u30B8\u89E3\u6D88\u306E\u81EA\u52D5\u518D\u5B9F\u884C\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB\u672C\u65E5${attempt}\
39
+ /${max}\u56DE\u76EE\uFF09\u3002 \u76F4\u524D\u306E\u30EA\u30EA\u30FC\u30B9\u304C\u675F\u306E\u9014\u4E2D\u3067\u5931\u6557\u3057\u3001\u4E00\u90E8\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u3060\u3051\u304C main \u306B\u5165\u3063\u3066\u3044\u307E\u3059\uFF08\u672C\u756A\u304C\u300C\u4E00\u90E8\u3060\u3051\u65B0\u3057\u3044\u300D\u72B6\u614B\uFF09\u3002\u524D\u56DE\u306E\u7D50\u679C\u884C: ${releaseLine.slice(0,400)} \u307E\u305A mcp__twp-aiops__release_get \u306E partial_merge \u3067\u300Cmain \u306B\u5165\u3063\u305F/\u5165\u3063\u3066\u3044\u306A\u3044\u300D\u3092\u78BA\u8A8D\u3057\u3001\u901A\u5E38\u306E Phase 1 \u304B\
40
+ \u3089\u3084\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u500B\u5225\u30DE\u30FC\u30B8\u30FBrevert \u306F\u3057\u306A\u3044\uFF09\u3002\u540C\u3058\u539F\u56E0\u3067\u518D\u3073\u5931\u6557\u3057\u305F\u5834\u5408\u306F\u3001\u305D\u306E\u65E8\u3092 RELEASE_RESULT \u306E\u7406\u7531\u6B04\u306B\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}async function escalatePartialMerge(deps,cause,count,releaseLine,reason,createDetail=""){const{api,config,log}=deps;const today=localDate(config.
41
+ counterTimezone);const slug=causeCounterSlug(cause);const counterKey=`release_rerun_escalation.${slug}`;const delivered=await escalationDeliveredToday(api,counterKey,today);if(delivered===true){log.log(` \u23ED \u539F\u56E0\u30AD\u30FC ${cause} \u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u306F\u672C\u65E5\u6295\u5165\u6E08\u307F\u3067\u3059 \u2192 \u91CD\u306D\u307E\u305B\u3093\uFF08\u4EBA\u9593\u306E\u56DE\u7B54\u5F85\u3061\uFF09`);return}if(delivered===null){log.log(" \u26A0\uFE0F \u5F15\u304D\u6E21\u3057\u6E08\u307F\u304B\
42
+ \u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AB\u30A6\u30F3\u30BF\u4E00\u89A7\u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u6C88\u9ED9\u3088\u308A\u91CD\u8907\u3092\u9078\u3073\u3001\u6295\u5165\u3092\u8A66\u307F\u307E\u3059")}const{itemId,detail}=await createItem(api,{label:`[P0] \u672C\u756A\u306E\u90E8\u5206\u30DE\u30FC\u30B8\u304C\u672A\u89E3\u6D88\u3067\u3059\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB${ESCALATION_SUBJECT[reason]}\uFF09\u2014 \u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057 #ai:complex`,
43
+ prompt:escalationPrompt(cause,count,config.releaseRerunMaxPerCause,releaseLine,reason,createDetail),ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F \u90E8\u5206\u30DE\u30FC\u30B8\u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08**\u672C\u65E5\u306E\u67A0\u306F\u6D88\u8CBB\u3057\u3066\u3044\u307E\u305B\u3093**\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\u884C\u3057\u307E\u3059\uFF09: ${detail}`);
44
+ return}const marked=await api.consumeCounter(counterKey,today,PARTIAL_MERGE_ESCALATION_MAX);if(!marked.ok||pickString(marked.json,"granted")!=="true"){log.log(` \u26A0\uFE0F \u5F15\u304D\u6E21\u3057\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u300C\u672C\u65E5\u6295\u5165\u6E08\u307F\u300D\u3092\u8A18\u9332\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(marked)}\uFF09\u2192 \u540C\u3058\u539F\u56E0\u3067\u91CD\u306D\u3066\u6295\u5165\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`)}
45
+ const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u{1F64B} \u90E8\u5206\u30DE\u30FC\u30B8\u3092\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\uFF08\u7406\u7531 ${reason}\uFF09\u3001\u4EBA\u9593\u3078\u306E\u5F15\u304D\u6E21\u3057\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\uFF09`)}else{log.log(` \u{1F64B} \u90E8\u5206\u30DE\u30FC\u30B8\u306E\u5F15\u304D\u6E21\u3057\u30A2\u30A4\u30C6\u30E0\u3092\u6295\u5165\u3057\u307E\u3057\u305F\
46
+ \uFF08\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306F\u5931\u6557\u30FB\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF0F\u539F\u56E0\u30AD\u30FC ${cause}\uFF09`)}}async function escalationDeliveredToday(api,key,today){const res=await api.listCounters(today);if(!res.ok)return null;const rows=pick(res.json,"counters")??pick(res.json,"data.counters");if(!Array.isArray(rows))return null;for(const row of rows){if(!row||typeof row!=="object")continue;const r=row;if(r.
47
+ key!==key)continue;if(typeof r.date==="string"&&r.date!==today)continue;const n=typeof r.count==="number"?r.count:Number(r.count);if(!Number.isFinite(n))return null;return n>=PARTIAL_MERGE_ESCALATION_MAX}return false}var ESCALATION_HEADLINE={limit:max=>`\u540C\u4E00\u539F\u56E0\u3067\u306E\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u4E0A\u9650\uFF08${max}\u56DE\uFF09\u306B\u9054\u3057\u305F\u305F\u3081\u3001\u81EA\u52D5\u6295\u5165\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
48
+ disabled:()=>"\u81EA\u52D5\u518D\u5B9F\u884C\u306F\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059\uFF08RELEASE_RERUN_AUTOENQUEUE_ENABLED=false\uFF09\u3002\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002","safe-mode":()=>"\u5B89\u5168\u30E2\u30FC\u30C9\uFF08SAFE=1\uFF09\u306E\u305F\u3081\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
49
+ "create-failed":()=>"\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u306E\u6295\u5165\u305D\u306E\u3082\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F\u6D88\u8CBB\u6E08\u307F\uFF09\u3002\u81EA\u52D5\u3067\u306F\u57CB\u307E\u3089\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002"};var ESCALATION_SUBJECT={limit:"\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F",
50
+ disabled:"\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u7121\u52B9\u306E\u305F\u3081\u672A\u89E3\u6D88\u3067\u3059","safe-mode":"\u5B89\u5168\u30E2\u30FC\u30C9\u306E\u305F\u3081\u672A\u89E3\u6D88\u3067\u3059","create-failed":"\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u3092\u6295\u5165\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"};function escalationPrompt(cause,count,max,releaseLine,reason,createDetail=""){return["\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u304C\u675F\u306E\u9014\u4E2D\u3067\u5931\u6557\u3057\u3001\u4E00\u90E8\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u3060\u3051\u304C main \u306B\u5165\u3063\u305F\u72B6\u614B\uFF08\u90E8\u5206\u30DE\u30FC\u30B8\uFF09\u304C\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002",
51
+ ESCALATION_HEADLINE[reason](max),"",`\u539F\u56E0\u30AD\u30FC: ${cause}\uFF08\`<\u5931\u6557\u30EA\u30DD\u30B8\u30C8\u30EA>:<\u5931\u6557\u30B9\u30C6\u30C3\u30D7>:<\u30A8\u30E9\u30FC\u7A2E\u5225>\`\u3002\u30EA\u30EA\u30FC\u30B9ID\u306F\u542B\u307F\u307E\u305B\u3093\uFF09`,reason==="limit"?`\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: ${count}\u56DE\uFF08\u4E0A\u9650 ${max}\uFF09`:reason==="create-failed"?`\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: ${count}\u56DE\u3076\u3093\u306E\u67A0\u3092\u6D88\u8CBB\u6E08\u307F\uFF08\u4E0A\u9650 ${max}\
52
+ \uFF09\u3002\u305F\u3060\u3057**\u3053\u306E\u56DE\u306E\u6295\u5165\u306F\u6210\u529F\u3092\u78BA\u8A8D\u3067\u304D\u3066\u304A\u3089\u305A\u3001\u3053\u306E\u67A0\u3076\u3093\u304C\u5B9F\u884C\u3055\u308C\u305F\u304B\u306F\u672A\u78BA\u8A8D**\u3067\u3059`:"\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: \u672A\u8A66\u884C\uFF08\u81EA\u52D5\u6295\u5165\u3092\u884C\u308F\u306A\u3044\u8A2D\u5B9A\u306E\u305F\u3081\u3001\u3053\u306E\u56DE\u3067\u306F\u8A66\u3057\u3066\u3044\u307E\u305B\u3093\uFF09",
53
+ ...reason==="create-failed"&&createDetail?[`\u6295\u5165\u306B\u5931\u6557\u3057\u305F\u7406\u7531\uFF08\u4F5C\u6210API\u306E\u5FDC\u7B54\uFF09: ${createDetail.slice(0,300)}`]:[],`\u76F4\u524D\u306E\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u884C: ${releaseLine.slice(0,400)}`,"","**\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u3067\u306F\u30EA\u30EA\u30FC\u30B9\u3092\u5B9F\u884C\u3057\u306A\u3044\u3053\u3068\u3002** \u3084\u308B\u306E\u306F\u5F15\u304D\u6E21\u3057\u3060\u3051\u3067\u3059\u3002","","1. `mcp__t\
54
+ wp-aiops__release_list` \u2192 `release_get` \u3067\u76F4\u8FD1\u306E\u5931\u6557\u30EA\u30EA\u30FC\u30B9\u3092\u7279\u5B9A\u3057\u3001"," `partial_merge` \u30D5\u30A3\u30FC\u30EB\u30C9\uFF08detected / merged_repos / unmerged_repos / failed_repo /"," failed_step / error_kind / cause_key\uFF09\u3092\u305D\u306E\u307E\u307E\u8AAD\u3080\u3002\u30ED\u30B0\u6587\u5B57\u5217\u3092 grep \u3057\u306A\u3044",'2. `list_tasks(project_id, keyword="[\u30EA\u30EA\u30FC\u30B9\u90E8\u5206\u30DE\u30FC\u30B8]", summary=true)` \u3067\u540C\u3058\u539F\u56E0\u30AD\u30FC\u306E',
55
+ " \u672A\u5B8C\u4E86\u30BF\u30B9\u30AF\u304C\u65E2\u306B\u3042\u308B\u304B\u78BA\u8A8D\u3059\u308B\uFF08\u3042\u308C\u3070\u518D\u8D77\u7968\u305B\u305A\u305D\u308C\u3092\u4F7F\u3046\u3002`create_task` \u306F\u975E\u51AA\u7B49\uFF09","3. \u7121\u3051\u308C\u3070 `create_task` \u3067\u8D77\u7968\u3059\u308B:",` - subject: \`[\u30EA\u30EA\u30FC\u30B9\u90E8\u5206\u30DE\u30FC\u30B8] ${cause} \u2014 ${ESCALATION_SUBJECT[reason]}\``," - description: main \u306B\u5165\u3063\u305F\u30EA\u30DD\u30B8\u30C8\u30EA\uFF08merge SHA \u4ED8\u304D\uFF09\uFF0F\u5165\u3063\u3066\u3044\u306A\u3044\u30EA\u30DD\u30B8\u30C8\u30EA\uFF0F",
56
+ " \u5931\u6557\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u5931\u6557\u30B9\u30C6\u30C3\u30D7\u30FB\u30A8\u30E9\u30FC\u5168\u6587\uFF0F\u8A72\u5F53 release_id \uFF0F\u81EA\u52D5\u518D\u5B9F\u884C\u306E\u56DE\u6570"," - priority: 1\uFF08\u672C\u756A\u304C\u4E00\u90E8\u3060\u3051\u65B0\u3057\u3044\u72B6\u614B\uFF1D\u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC\uFF09",'4. \u305D\u306E\u30BF\u30B9\u30AF\u306B `comment_type: "ask_question"` \u3067**1\u554F\u3060\u3051**\u6295\u7A3F\u3059\u308B\u3002\u80CC\u666F\u30FB\u5404\u9078\u629E\u80A2\u306E\u5F71\u97FF\u30FB',
57
+ " AI\u306E\u63A8\u5968\u3092\u672C\u6587\u306B\u66F8\u304F\u3053\u3068\uFF08\u8AD6\u70B9\u3092\u66F8\u304B\u305A\u9078\u629E\u80A2\u3060\u3051\u4E26\u3079\u305F\u77ED\u6587\u306F\u6295\u7A3F\u3057\u306A\u3044\uFF09\u3002"," option \u306E `key` \u306F10\u6587\u5B57\u4EE5\u5185\u3002`mentioned_user_ids` \u306B\u8C37 \u6A39\u3092\u542B\u3081\u308B",`5. \u540C\u3058\u30BF\u30FC\u30F3\u3067\u30B9\u30C6\u30FC\u30BF\u30B9\u3092 \`\u4EBA\u9593\u5224\u65AD\u5F85\u3061\`\uFF08${STATUS_HUMAN_DECISION}\uFF09\
58
+ \u30FB`,` \u62C5\u5F53\u3092\u8C37 \u6A39\uFF08${TANI_USER_ID}\uFF09\u306B\u3059\u308B`,"","\u6700\u7D42\u51FA\u529B\u306E1\u884C\u76EE\u306B `PARTIAL_MERGE_ESCALATED: <TWP\u30AD\u30FC>` \u3092\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\u3002"].join("\n")}async function enqueueDevVerifyForMerged(deps,logText,followUp){const{api,log}=deps;const{skill:verifySkill,keysLine}=followUp;if(keysLine===null){log.log(` \u2139\uFE0F ${verifySkill} \u306E\u5F8C\u7D9A\u6295\u5165\u306F keys_line \u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u3001\u30AD\u30FC\u5358\u4F4D\u306E\u6295\u5165\u306F\u3057\u307E\u305B\u3093`);
59
+ return}const keys=parseKeysLine(logText,keysLine);if(keys===null){log.log(` \u26A0\uFE0F \u5B8C\u4E86\u3057\u305F\u30B9\u30AD\u30EB\u304C ${keysLine} \u884C\u3092\u51FA\u529B\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09\u2192 ${verifySkill} \u306E\u81EA\u52D5\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059`);return}if(keys.length===0){log.log(` \u2139\uFE0F \u5BFE\u8C61\u30AD\u30FC\u306F\u3042\u308A\u307E\u305B\u3093\uFF08${keysLine}: none\uFF09\u2192\
60
+ ${verifySkill} \u306E\u81EA\u52D5\u6295\u5165\u306A\u3057`);return}const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 dev\u691C\u8A3C\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(" \uFF08\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u540C\u4E00\u30BF\u30B9\u30AF\u306Edev\u691C\u8A3C\u304C\u4E8C\u91CD\u306B\u8D70\u308A\u307E\u3059\uFF09");
61
+ return}let enqueued=0;const seen=new Set;for(const key of keys){if(seen.has(key))continue;seen.add(key);if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 dev\u691C\u8A3C\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);continue}const{itemId,detail}=await createItem(api,{label:`[P1] ${key} \u306Edev\u691C\u8A3C\uFF08develop\u30DE\u30FC\u30B8\u76F4\u5F8C\u30FB\u6DF7\u5165\u30DE\u30FC\u30B8\u9632\u6B62\u306E\u305F\u3081\u81EA\u52D5\u6295\u5165\uFF09 #ai:verify`,
62
+ prompt:`${verifySkill} ${key}`,ai_type:"claude",task_key:key});if(!itemId){log.log(` \u26A0\uFE0F ${key} \u306Edev\u691C\u8A3C\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${detail}`);continue}enqueued+=1;log.log(` \u{1F50E} ${key} \u306Edev\u691C\u8A3C\u3092\u30AD\u30E5\u30FC\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08${itemId}\uFF09`)}if(enqueued>0){log.log(` \u2192 develop\u30DE\u30FC\u30B8\u6E08\u307F ${enqueued} \u4EF6\u306Edev\u691C\u8A3C\u3092\u81EA\u52D5\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u8A08\u753BAI\u306E\u5224\u65AD\u306B\u59D4\u306D\u306A\u3044\uFF09`)}}var RECENT_ADVANCE_WINDOW_HOURS=6;function normalizeOutcomeCode(raw){const m=/\b([A-Z][A-Z0-9_]*_RESULT)\s*:\s*([A-Za-z_][A-Za-z0-9_]*)/.exec(raw??"");if(!m)return null;return`${m[1]}: ${(m[2]??"").toUpperCase()}`}function skillOfLedgerItem(item){const explicit=(item.skill??"").trim();if(explicit)return normalizeSkillName(explicit);return skillOfItem(item)}function advanceKey(taskKey,skill){return`${taskKey}#${normalizeSkillName(skill)}`}function buildRecentCandidateIndex(items,opts={}){const nowMicros=(opts.
63
+ now??new Date).getTime()*1e3;const latest=new Map;for(const item of items){if(item.status!==void 0&&item.status!=="completed")continue;const taskKey=(item.task_key??"").trim();if(taskKey==="")continue;const skill=skillOfLedgerItem(item);if(skill==="")continue;const sortOrder=typeof item.sort_order==="number"?item.sort_order:0;const key=advanceKey(taskKey,skill);const prev=latest.get(key);if(prev&&prev.sortOrder>=sortOrder)continue;latest.set(key,{sortOrder,candidate:{taskKey,skill,itemId:item.item_id,
64
+ outcomeCode:normalizeOutcomeCode(item.outcome_code),ageMinutes:sortOrder>0?Math.floor((nowMicros-sortOrder)/6e7):null}})}const index=new Map;for(const[key,value]of latest)index.set(key,value.candidate);return index}function findRecentCandidate(index,taskKey,skill){if(taskKey.trim()===""||skill.trim()==="")return null;return index.get(advanceKey(taskKey.trim(),skill))??null}async function resolveRecentAdvance(candidate,fetchResult,advancing){if(advancing.size===0)return null;let outcome=candidate.
65
+ outcomeCode;if(outcome===null){const result=await fetchResult(candidate.itemId);outcome=result?normalizeOutcomeCode(parseOutcomeCode(result)):null}if(outcome===null||!advancing.has(outcome))return null;return{taskKey:candidate.taskKey,skill:candidate.skill,outcome,itemId:candidate.itemId,ageMinutes:candidate.ageMinutes}}function formatRecentAdvance(advance){const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\u524D`;return`${advance.outcome}\uFF08${age} / item=${advance.
66
+ itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var MARKER_PAIR_RE=/^([^=\s,]+)=([a-z]+)$/;function decodeMarkerKey(raw){let key;try{key=decodeURIComponent(raw)}catch{return null}return isTaskKey(key)&&key.trim()===key?key:null}function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.
67
+ exec(body);const byKey=new Map;for(const token of body.trim().split(/\s+/)){for(const part of token.split(",")){const pair=MARKER_PAIR_RE.exec(part);if(!pair)continue;const key=decodeMarkerKey(pair[1]);if(key!==null)byKey.set(key,pair[2])}}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot,advancing){if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}
68
+ if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=advancing.get(advance.outcome);if(expected===
69
+ void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}function pendingTaskKeys(items){return new Set(items.map(p=>(p.task_key??"").trim()).filter(k=>k!==""))}async function buildDynamicBlocks(src){const now=src.now??new Date;let inflight=null;if(src.processing!==null){inflight={};for(const entry of inflightEntries(src.processing,now,src.staleHours)){inflight[entry.key]=`\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u3067\u3059\uFF08${formatInflightEntry(entry)}\uFF09`}}const pending=src.pending===null?null:[...pendingTaskKeys(src.pending)].
70
+ sort();let advanced=src.advancing.size===0?{}:null;const statusUsable=src.taskStatus!==null&&src.taskStatus.complete&&src.taskStatus.windowHours>=RECENT_ADVANCE_WINDOW_HOURS;if(src.recent!==null&&src.advancing.size>0&&statusUsable){advanced={};for(const[key,candidate]of buildRecentCandidateIndex(src.recent,{now})){const advance=await resolveRecentAdvance(candidate,async()=>null,src.advancing);if(advance===null)continue;if(!shouldSuppressForStatus(advance,src.taskStatus,src.advancing).suppress)continue;
71
+ advanced[key]=`\u76F4\u8FD1\u306B\u540C\u3058\u30B9\u30AD\u30EB\u304C\u72B6\u614B\u3092\u9032\u3081\u3066\u3044\u307E\u3059\uFF08${formatRecentAdvance(advance)}\uFF09`}}return{taken_at:now.toISOString(),inflight,pending,advanced}}function dynamicStepReasons(blocks,taskKey,skill){if(!blocks)return[];const key=taskKey.trim();if(key==="")return[];const reasons=[];const inflight=blocks.inflight?.[key];if(inflight!==void 0)reasons.push(`${key} \u306F${inflight}`);if(blocks.pending?.includes(key))reasons.
72
+ push(`${key} \u306F\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061\uFF08pending\uFF09\u306B\u5C45\u307E\u3059`);const advanced=skill.trim()===""?void 0:blocks.advanced?.[advanceKey(key,skill)];if(advanced!==void 0)reasons.push(`${key} \u306F${advanced}`);return reasons}function unavailableChecks(blocks){if(blocks===null)return["\u51E6\u7406\u4E2D","\u30AD\u30E5\u30FC\u5F85\u3061","\u76F4\u8FD1\u3067\u72B6\u614B\u3092\u9032\u3081\u305F"];const out=[];if(blocks.inflight===null)out.push("\u51E6\u7406\u4E2D");
73
+ if(blocks.pending===null)out.push("\u30AD\u30E5\u30FC\u5F85\u3061");if(blocks.advanced===null)out.push("\u76F4\u8FD1\u3067\u72B6\u614B\u3092\u9032\u3081\u305F");return out}function formatPlanResultLine(summary){return`PLAN_RESULT: ${JSON.stringify(summary)}`}var PLAN_TOKEN_ENV="TWP_LOOP_PLAN_TOKEN";var PLAN_DIR_ENV="TWP_LOOP_PLAN_DIR";var SKILL_NAME_RE=/^[a-z][a-z0-9-]*$/;var PRIORITY_RE=/^P[0-9]$/;function fingerprint(token){return createHash("sha256").update(token).digest("hex").slice(0,32)}function sessionPath(dir,token){return path2.join(dir,`plan-session-${fingerprint(token)}.json`)}function submissionPath(dir,token){return path2.join(dir,`plan-submission-${fingerprint(token)}.json`)}function rejectionsPath(dir,token){return path2.join(dir,`pla\
74
+ n-rejections-${fingerprint(token)}.json`)}var MAX_REJECTIONS=5;function readRejections(file){try{const arr=JSON.parse(fs2.readFileSync(file,"utf8"));return Array.isArray(arr)?arr:[]}catch{return[]}}function recordRejection(dir,token,check){try{const entry={at:new Date().toISOString(),errors:check.errors,steps:check.steps.filter(v=>!v.accepted).map(v=>({index:v.index,skill:v.skill,args:v.args,reasons:v.reasons}))};const file=rejectionsPath(dir,token);writeAtomic(file,JSON.stringify([entry,...readRejections(
75
+ file)].slice(0,MAX_REJECTIONS)))}catch{}}function writeAtomic(file,body){const tmp=`${file}.${process.pid}.tmp`;fs2.writeFileSync(tmp,body,{mode:384});fs2.renameSync(tmp,file)}var NO_PLAN_SESSION={env:{},submission:()=>null,rejections:()=>[],close:()=>void 0};var STALE_MS=24*60*60*1e3;function sweepStale(dir,now){let names;try{names=fs2.readdirSync(dir)}catch{return}for(const f of names){if(!/^plan-(session|submission|rejections)-/.test(f))continue;try{const file=path2.join(dir,f);if(now-fs2.statSync(
76
+ file).mtimeMs>STALE_MS)fs2.rmSync(file,{force:true})}catch{}}}function fileSkillNames(dirs){const out=[];for(const dir of dirs){try{for(const f of fs2.readdirSync(dir))if(f.endsWith(".md"))out.push(f.slice(0,-3))}catch{}}return out}function openPlanSession(dir,skills,blocks=null,prefix=skillPrefix()){fs2.mkdirSync(dir,{recursive:true});sweepStale(dir,Date.now());const token=randomBytes(24).toString("hex");const session={version:1,created_at:new Date().toISOString(),skills:[...new Set(skills)].sort(),
77
+ skill_prefix:prefix,blocks};writeAtomic(sessionPath(dir,token),JSON.stringify(session));return{env:{[PLAN_TOKEN_ENV]:token,[PLAN_DIR_ENV]:dir},submission:()=>readSubmission(submissionPath(dir,token)),rejections:()=>readRejections(rejectionsPath(dir,token)),close:()=>{for(const f of[sessionPath(dir,token),submissionPath(dir,token),rejectionsPath(dir,token)]){try{fs2.rmSync(f,{force:true})}catch{}}}}}function readSubmission(file){let raw;try{raw=fs2.readFileSync(file,"utf8")}catch{return null}try{
78
+ const obj=JSON.parse(raw);if(obj&&typeof obj==="object"&&obj.plan&&Array.isArray(obj.plan.steps))return obj}catch{}return null}function checkPlan(input,skills,blocks){const errors=[];const prefix=skillPrefix();if(input===null||typeof input!=="object"||Array.isArray(input)){return{errors:['\u8A08\u753B\u306F {"steps": [...]} \u306E\u5F62\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B\u3057\u3066\u304F\u3060\u3055\u3044'],steps:[],accepted:false}}const steps=input.steps;if(!Array.isArray(steps)){
79
+ return{errors:["steps \u304C\u914D\u5217\u3067\u306F\u3042\u308A\u307E\u305B\u3093"],steps:[],accepted:false}}if(steps.length===0){errors.push("steps \u304C\u7A7A\u3067\u3059\u30020\u4EF6\u306E\u8A08\u753B\u306F --empty \u3067\u63D0\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u5931\u6557\u3068\u533A\u5225\u3059\u308B\u305F\u3081\uFF09");return{errors,steps:[],accepted:false}}const seenKeys=new Map;const verdicts=steps.map((raw,index)=>{const reasons=[];if(raw===null||typeof raw!=="object"||Array.
80
+ isArray(raw)){return{index,skill:"",args:"",accepted:false,reasons:["step \u304C\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u306F\u3042\u308A\u307E\u305B\u3093"]}}const step=raw;for(const k of["args","label","priority","ai_category"]){if(step[k]!==void 0&&typeof step[k]!=="string")reasons.push(`${k} \u306F\u6587\u5B57\u5217\u306B\u3057\u3066\u304F\u3060\u3055\u3044`)}const skill=typeof step.skill==="string"?step.skill.trim():"";const args=typeof step.args==="string"?step.args.trim():"";if(skill===
81
+ ""){reasons.push("skill \u304C\u3042\u308A\u307E\u305B\u3093")}else if(skill.startsWith("/")||prefix!==""&&skill.startsWith(prefix)&&!skills.has(`${prefix}${skill}`)){const bare=skill.replace(/^\//,"");reasons.push(`skill \u306F '/${prefix}' \u3092\u4ED8\u3051\u305A\u306B\u66F8\u3044\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: '${prefix!==""&&bare.startsWith(prefix)?bare.slice(prefix.length):bare}'\uFF09`)}else if(!SKILL_NAME_RE.test(skill)){reasons.push(`skill '${skill}' \u306B\u4F7F\u3048\u306A\u3044\u6587\u5B57\u304C\u3042\u308A\u307E\u3059\uFF08\u82F1\u5C0F\u6587\u5B57\u30FB\u6570\u5B57\u30FB\u30CF\u30A4\u30D5\
82
+ \u30F3\u306E\u307F\uFF09`)}else if(skills.size>0&&!skills.has(`${prefix}${skill}`)){reasons.push(`\u30B9\u30AD\u30EB '${skillCommand(skill)}' \u306F\u5B58\u5728\u3057\u307E\u305B\u3093`)}if(typeof step.priority==="string"&&!PRIORITY_RE.test(step.priority)){reasons.push(`priority '${step.priority}' \u306F P0\u301CP9 \u306E\u5F62\u306B\u3057\u3066\u304F\u3060\u3055\u3044`)}const placeholder=placeholderTaskKey(args);if(placeholder!==null)reasons.push(`args \u306E\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u96DB\u5F62\u306E\u307E\u307E\u3067\u3059\uFF08'${placeholder}\
83
+ '\uFF09`);if(reasons.length===0){const item=stepToItem(step);const key=item?.task_key??"";if(key!==""){const first=seenKeys.get(key);if(first!==void 0)reasons.push(`${key} \u306F steps[${first}] \u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059\uFF08\u540C\u3058\u8A08\u753B\u306B1\u4EF6\u307E\u3067\uFF09`);else seenKeys.set(key,index);reasons.push(...dynamicStepReasons(blocks,key,skill))}}return{index,skill,args,accepted:reasons.length===0,reasons}});const unchecked=blocks===void 0?[]:unavailableChecks(
84
+ blocks);return{errors,...unchecked.length>0?{unchecked}:{},steps:verdicts,accepted:errors.length===0&&verdicts.every(v=>v.accepted)}}function formatCheck(check){const lines=[];for(const e of check.errors)lines.push(`\u2717 ${e}`);for(const v of check.steps){const head=`steps[${v.index}] ${v.accepted?"\u53D7\u7406":"\u68C4\u5374"} ${skillCommand(v.skill,v.args)}`;lines.push(`${v.accepted?"\u2713":"\u2717"} ${head}`);for(const r of v.reasons)lines.push(` - ${r}`)}if(check.unchecked&&check.unchecked.
85
+ length>0){lines.push(`\uFF08${check.unchecked.join("\u30FB")}\u306E\u691C\u67FB\u306F\u5B9F\u6E2C\u3092\u53D6\u308C\u305A\u3001\u63D0\u51FA\u6642\u306B\u306F\u52B9\u3044\u3066\u3044\u307E\u305B\u3093\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306B\u6539\u3081\u3066\u691C\u67FB\u3055\u308C\u307E\u3059\uFF09`)}return lines.join("\n")}function runPlanSubmit(opts,deps){const token=deps.env[PLAN_TOKEN_ENV]?.trim()??"";const dir=deps.env[PLAN_DIR_ENV]?.trim()??"";if(token===""||dir===""){deps.stderr(`\
86
+ plan submit \u306F\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u306E\u4E2D\u3067\u3060\u3051\u4F7F\u3048\u307E\u3059\uFF08${PLAN_TOKEN_ENV} / ${PLAN_DIR_ENV} \u304C\u3042\u308A\u307E\u305B\u3093\uFF09
87
+ `);return 2}let session;try{session=JSON.parse(fs2.readFileSync(sessionPath(dir,token),"utf8"))}catch{deps.stderr("\u9375\u304C\u7121\u52B9\u3067\u3059\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u304C\u65E2\u306B\u7D42\u308F\u3063\u3066\u3044\u308B\u304B\u3001\u5225\u306E\u8A08\u753B\u306E\u9375\u3067\u3059\uFF09\n");return 2}if(opts.empty===(opts.file!==void 0)){deps.stderr("--file <\u30D1\u30B9|-> \u304B --empty \u306E\u3069\u3061\u3089\u304B\u4E00\u65B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");
88
+ return 2}let plan;if(opts.empty){plan={steps:[]}}else{let text;try{text=opts.file==="-"?deps.readStdin():fs2.readFileSync(opts.file,"utf8")}catch(err){deps.stderr(`\u8A08\u753B\u3092\u8AAD\u3081\u307E\u305B\u3093: ${err.message}
89
+ `);return 2}let parsed;try{parsed=JSON.parse(text)}catch(err){deps.stderr(`\u8A08\u753B\u304C JSON \u3068\u3057\u3066\u8AAD\u3081\u307E\u305B\u3093: ${err.message}
90
+ `);return 1}const sp=session.skill_prefix;const before=skillPrefix();let check;try{setSkillPrefix(typeof sp==="string"&&SKILL_PREFIX_RE.test(sp)?sp:DEFAULT_SKILL_PREFIX);check=checkPlan(parsed,new Set(session.skills??[]),session.blocks);deps.stdout(`${formatCheck(check)}
91
+
92
+ ${JSON.stringify(check,null,2)}
93
+ `)}finally{setSkillPrefix(before)}if(!check.accepted){if(!opts.check)recordRejection(dir,token,check);deps.stderr("\u68C4\u5374\u304C\u3042\u308B\u305F\u3081\u63D0\u51FA\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u7406\u7531\u3092\u76F4\u3057\u3066\u51FA\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\n");if(readSubmission(submissionPath(dir,token))!==null){deps.stderr("\uFF08\u524D\u56DE\u53D7\u7406\u3057\u305F\u63D0\u51FA\u304C\u6709\u52B9\u306A\u307E\u307E\u3067\u3059\u3002\u51FA\u3057\u76F4\u3055\u306A\u3051\u308C\u3070\u30EB\u30FC\u30D7\u306F\u305D\u308C\u3092\u767B\u9332\u3057\u307E\u3059\uFF09\n")}
94
+ return 1}plan=parsed}if(opts.check){deps.stdout(opts.empty?"\u691C\u67FB\u306E\u307F: \u7A7A\u306E\u8A08\u753B\uFF080\u4EF6\uFF09\n":"\u691C\u67FB\u306E\u307F: \u7F6E\u3044\u3066\u3044\u307E\u305B\u3093\uFF08--check\uFF09\n");return 0}const submitted={plan,empty:opts.empty,submitted_at:new Date().toISOString()};writeAtomic(submissionPath(dir,token),JSON.stringify(submitted));deps.stdout(opts.empty?"\u7A7A\u306E\u8A08\u753B\uFF080\u4EF6\uFF09\u3092\u63D0\u51FA\u3057\u307E\u3057\u305F\u3002\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u306E\u7D42\u4E86\u5F8C\u3001\u4F55\u3082\u7A4D\u307F\u307E\u305B\u3093\n":
95
+ `\u8A08\u753B\uFF08${plan.steps.length}\u4EF6\uFF09\u3092\u63D0\u51FA\u3057\u307E\u3057\u305F\u3002\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u306E\u7D42\u4E86\u5F8C\u306B\u30EB\u30FC\u30D7\u304C\u4E00\u5EA6\u306B\u767B\u9332\u3057\u307E\u3059\uFF08\u51FA\u3057\u76F4\u3059\u3068\u6700\u5F8C\u306E\u63D0\u51FA\u304C\u6709\u52B9\uFF09
96
+ `);return 0}export{staleFloorHours,inflightStaleHours,inflightEntries,formatInflightEntry,createItem,ReleaseOutcomeLog,parseReleaseResult,parseOutcomeCode,enqueueBlockerRecovery,enqueueReleasePhase5Recovery,enqueueReleasePartialMergeRerun,enqueueDevVerifyForMerged,RECENT_ADVANCE_WINDOW_HOURS,buildRecentCandidateIndex,findRecentCandidate,resolveRecentAdvance,formatRecentAdvance,windowStartMicros,parseTaskStatusSnapshot,shouldSuppressForStatus,pendingTaskKeys,buildDynamicBlocks,unavailableChecks,formatPlanResultLine,
97
+ PLAN_TOKEN_ENV,PLAN_DIR_ENV,NO_PLAN_SESSION,fileSkillNames,openPlanSession,checkPlan,formatCheck,runPlanSubmit};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{FORCE_FLAG,OUT_FLAG,REV_FLAG,revOf,singleId,uploadStaged}from"./chunk-JYCJ4N6T.js";import{CUSTOMER_LICENSE,childForbidden,levelForbidden}from"./chunk-UIHNYBME.js";import{inspectLocalFile}from"./chunk-I4TR55UF.js";import{createFlags,fieldBody,hasAnyField,updateFlags}from"./chunk-VV4GTQ2L.js";import{nonEmpty}from"./chunk-MI6HVYR2.js";import{SALES_ESTIMATES_PATH,isExactNumericId}from"./chunk-ITRTFBV3.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";
3
+ import{FORCE_FLAG,OUT_FLAG,REV_FLAG,revOf,singleId,uploadStaged}from"./chunk-F4PGPJOI.js";import{CUSTOMER_LICENSE,childForbidden,levelForbidden}from"./chunk-NVMJXFBT.js";import{inspectLocalFile}from"./chunk-I4TR55UF.js";import{createFlags,fieldBody,hasAnyField,updateFlags}from"./chunk-XGYOJHZC.js";import{nonEmpty}from"./chunk-MI6HVYR2.js";import{SALES_ESTIMATES_PATH,isExactNumericId}from"./chunk-HNG6MF26.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";
4
4
  import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import fs from"fs";import path from"path";var DOCUMENT_TYPES=["order_form","individual_contract","other"];var DOCUMENT_TYPE_HELP="order_form\uFF1D\u6CE8\u6587\u66F8 / individual_contract\uFF1D\u500B\u5225\u5951\u7D04\u66F8 / other\uFF1D\u305D\u306E\u4ED6\u6848\u4EF6\u66F8\u985E";var MAGIC_BYTES={pdf:["%PDF-"],jpg:["\xFF\xD8\xFF"],jpeg:["\xFF\xD8\xFF"],png:["\x89PNG\r\n\n"],xlsx:["PK","PK","PK\x07\b"],docx:["PK","PK","PK\x07\b"],xls:["\xD0\xCF\xE0\xA1\xB1\xE1"],doc:["\xD0\xCF\xE0\xA1\xB1\xE1"]};var FILE_NAME_MAX_CHARS=255;var FIELDS=[
5
5
  {kind:"text",flag:"--name",key:"document_name",label:"\u66F8\u985E\u540D",maxChars:255,summary:"\u66F8\u985E\u540D\uFF08create \u3067\u306F\u5FC5\u9808\uFF09"},{kind:"enum",flag:"--type",key:"document_type",values:DOCUMENT_TYPES,summary:`\u66F8\u985E\u7A2E\u5225\uFF08${DOCUMENT_TYPE_HELP}\u30FBcreate \u3067\u306F\u5FC5\u9808\uFF09`}];var COLUMNS=["document_id","estimate_id","document_type","document_type_label","document_name","current_version","updated_by_name","updated_at"];var VERSION_COLUMNS=[
6
6
  "version_number","file_name","file_size","is_current","created_by_name","created_at"];var ESTIMATE_FLAG={name:"--estimate",summary:"\u898B\u7A4D\u306E ID\uFF08twp estimate list \u306E id \u5217\u306E\u6570\u5B57\u30FB\u5FC5\u9808\uFF09",takesValue:true,placeholder:"<\u898B\u7A4DID>"};var FILE_FLAG={name:"--file",summary:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B\u30D5\u30A1\u30A4\u30EB\uFF08PDF\u30FBJPEG\u30FBPNG\u30FBWord\u30FBExcel\u3002\u5FC5\u9808\uFF09",takesValue:true,placeholder:"<\
@@ -0,0 +1,16 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{isPrivateProjectId}from"./chunk-GY7KI5E5.js";import{httpFetch}from"./chunk-J7QYPKVK.js";function describeError(res){if(res.status===null)return`transport_error=${res.transportError??"\u4E0D\u660E"}`;const body=res.json;const parts=[`http=${res.status}`];const reason=typeof body?.["reason"]==="string"?body["reason"]:"";if(reason)parts.push(`reason=${reason}`);const error=body?.["error"];const code=typeof error?.["code"]==="string"?error["code"]:"";if(code)parts.push(`code=${code}`);const message=(typeof body?.["message"]==="string"?body["message"]:"")||(typeof error?.["message"]==="\
4
+ string"?error["message"]:"");if(message)parts.push(message.slice(0,160));if(!reason&&!code&&!message)parts.push(`\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,160)}`);return parts.join(" ")}function isPermanent(res){return res.status!==null&&res.status>=400&&res.status<500}var RUNNER_PLATFORMS=["mac","windows","linux"];function normalizeRequiredPlatforms(value){if(!Array.isArray(value))return[];const given=new Set(value.filter(v=>typeof v==="string").map(v=>v.trim().toLowerCase()));return RUNNER_PLATFORMS.
5
+ filter(p=>given.has(p))}function filterByStatus(items,status){return items.filter(item=>item.status===void 0||item.status===status)}var AgentLoopApi=class{constructor(opts){this.opts=opts;const root=opts.apiUrl.replace(/\/+$/,"");this.base=isPrivateProjectId(opts.projectId)?`${root}/api/v2/tasks/private/agent-loop`:`${root}/api/v2/projects/${opts.projectId}/agent-loop`}opts;base;get baseUrl(){return this.base}list(query){const qs=new URLSearchParams;for(const[k,v]of Object.entries(query)){if(v!==
6
+ void 0&&v!=="")qs.set(k,String(v))}const suffix=qs.toString()?`?${qs.toString()}`:"";return this.request("GET",suffix)}create(body){return this.request("POST","",body)}getItem(itemId){return this.request("GET",`/${encodeURIComponent(itemId)}`)}update(itemId,body,runId){return this.request("PUT",`/${encodeURIComponent(itemId)}`,{...body,run_id:runId})}updateUnowned(itemId,body){return this.request("PUT",`/${encodeURIComponent(itemId)}`,body)}logUploadUrl(itemId,runId){return this.request("POST",`\
7
+ /${encodeURIComponent(itemId)}/log-upload-url`,{run_id:runId})}async putPresigned(url,body,contentType){const fetchImpl=this.opts.fetchImpl??httpFetch;const controller=new AbortController;const timer=setTimeout(()=>controller.abort(),this.opts.timeoutMs??6e4);try{const res=await fetchImpl(url,{method:"PUT",headers:{"Content-Type":contentType},signal:controller.signal,body});await res.text().catch(()=>"");return{ok:res.ok,status:res.status,json:null,raw:"",transportError:null}}catch(err){const reason=err.
8
+ name==="AbortError"?"timeout":err.message;return{ok:false,status:null,json:null,raw:"",transportError:reason}}finally{clearTimeout(timer)}}reorder(itemIds){return this.request("PUT","/reorder",{item_ids:itemIds})}claim(runnerId,runId){return this.request("POST","/claim",{runner_id:runnerId,run_id:runId})}reclaim(){return this.request("POST","/reclaim",{})}runners(){return this.request("GET","/runners")}registerRunner(payload){return this.request("POST","/runners/register",payload)}capacityReport(payload){
9
+ return this.request("POST","/runners/capacity-report",payload)}heartbeatRunner(payload){return this.request("POST","/runners/heartbeat",payload)}deregisterRunner(payload){return this.request("POST","/runners/deregister",payload)}planStart(runnerId,runId){return this.request("POST","/plan/start",{runner_id:runnerId,run_id:runId})}planFinish(runnerId,runId,planStartedAt,result){return this.request("POST","/plan/finish",{runner_id:runnerId,run_id:runId,plan_started_at:planStartedAt,result})}consumeCounter(key,date,limit){
10
+ return this.request("POST","/counters/consume",{key,date,limit})}listCounters(date){return this.request("GET",`/counters?date=${encodeURIComponent(date)}`)}async queuedSnapshot(){return this.snapshotOf(["pending","processing"])}async processingSnapshot(){return this.snapshotOf(["processing"])}async pendingSnapshot(){return this.snapshotOf(["pending"])}async completedSince(sinceMicros,maxPages=10){const all=[];let cursor=String(Math.trunc(sinceMicros));for(let page=0;page<maxPages;page++){const res=await this.
11
+ list({status:"completed",limit:100,cursor});if(!res.ok)return null;const body=res.json;const items=body?.["items"];if(!Array.isArray(items))return null;all.push(...filterByStatus(items,"completed"));const pagination=body?.["pagination"];const hasMore=(pagination?.["has_more"]??body?.["has_more"])===true;const next=pagination?.["next_cursor"]??body?.["next_cursor"];if(!hasMore||!next)return all;cursor=next}return null}async snapshotOf(statuses){const all=[];for(const status of statuses){let cursor;
12
+ for(let page=0;page<20;page++){const res=await this.list({status,limit:100,cursor});if(!res.ok)return null;const body=res.json;const items=body?.["items"];if(!Array.isArray(items))return null;all.push(...filterByStatus(items,status));const pagination=body?.["pagination"];const hasMore=(pagination?.["has_more"]??body?.["has_more"])===true;const next=pagination?.["next_cursor"]??body?.["next_cursor"];if(!hasMore||!next)break;cursor=next;if(page===19)return null}}return all}outcomes(skill,limit=5){
13
+ return this.request("GET",`/outcomes?skill=${encodeURIComponent(skill)}&limit=${limit}`)}async request(method,suffix,body){let token;try{token=await this.opts.session.getAccessToken()}catch(err){return{ok:false,status:null,json:null,raw:"",transportError:err.message}}let res=await this.send(method,suffix,token,body);if(res.status===401){try{token=await this.opts.session.refresh(token);res=await this.send(method,suffix,token,body)}catch(err){return{ok:false,status:401,json:null,raw:res.raw,transportError:err.
14
+ message}}}return res}async send(method,suffix,token,body){const fetchImpl=this.opts.fetchImpl??httpFetch;const controller=new AbortController;const timer=setTimeout(()=>controller.abort(),this.opts.timeoutMs??6e4);try{const res=await fetchImpl(`${this.base}${suffix}`,{method,headers:{Authorization:`Bearer ${token}`,"Content-Type":"application/json",Accept:"application/json"},signal:controller.signal,...body===void 0?{}:{body:JSON.stringify(body)}});const raw=await res.text();let json=null;if(raw.
15
+ trim()!==""){try{json=JSON.parse(raw)}catch{json=null}}return{ok:res.ok,status:res.status,json,raw,transportError:null}}catch(err){const reason=err.name==="AbortError"?"timeout":err.message;return{ok:false,status:null,json:null,raw:"",transportError:reason}}finally{clearTimeout(timer)}}};function pick(json,path){let cur=json;for(const part of path.split(".")){if(cur===null||typeof cur!=="object")return void 0;cur=cur[part]}return cur===null?void 0:cur}function pickString(json,path){const v=pick(
16
+ json,path);if(typeof v==="string")return v;if(typeof v==="number")return String(v);if(typeof v==="boolean")return v?"true":"false";return""}export{describeError,isPermanent,RUNNER_PLATFORMS,normalizeRequiredPlatforms,filterByStatus,AgentLoopApi,pick,pickString};
@@ -0,0 +1,91 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{decodeCsvText}from"./chunk-QLENN5DD.js";import{envelopePaging,flagSegment,positiveInteger,shellQuote}from"./chunk-MI6HVYR2.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import{isRecord}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import fs from"fs";var LOGIN_HISTORY_RETENTION_DAYS=90;var DEFAULT_INACTIVE_DAYS=60;var DEFAULT_MAX_USERS=2e3;var LIST_PAGE_LIMIT=100;var MATRIX_PAGE_LIMIT=200;var LOGIN_HISTORY_LIMIT=500;var CONCURRENCY=4;var SEND_PER_MINUTE=200;var SEND_BURST=30;var RATE_LIMIT_WAIT_MS=6e4;var RATE_LIMIT_RETRIES=2;var LEDGER_MAX_BYTES=5*1024*1024;var USAGE="twp user export [--file <\u53F0\u5E33CSV>] [--include-disabled] [--exclude-hidden] [--inactive-days <\u65E5\u6570>] [--code-column <\u5217\u540D>] [--name-column <\u5217\u540D>] [--email-column <\u5217\u540D>] [--department-c\
4
+ olumn <\u5217\u540D>] [--position-column <\u5217\u540D>] [--max-users <\u4EBA\u6570>]";var HELP="twp user export help";var listPaging=envelopePaging({label:"\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7"});var LEDGER_ROLES=["code","name","email","department","position"];var ROLE_LABEL={code:"\u793E\u54E1\u756A\u53F7",name:"\u6C0F\u540D",email:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",department:"\u90E8\u7F72",position:"\u5F79\u8077"};var COLUMN_CANDIDATES={code:["\u793E\u54E1\u756A\u53F7","\u5F93\u696D\u54E1\u756A\u53F7",
5
+ "\u793E\u54E1\u30B3\u30FC\u30C9","\u5F93\u696D\u54E1\u30B3\u30FC\u30C9","employee_code","employee_no"],name:["\u6C0F\u540D","\u540D\u524D","\u793E\u54E1\u540D","\u5F93\u696D\u54E1\u540D","name","user_name"],email:["\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9","\u4F1A\u793E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9","email","login_id"],department:["\u90E8\u7F72","\u90E8\u7F72\u540D","\u6240\u5C5E\u90E8\u7F72","department","department_name"],position:["\u5F79\u8077","\u5F79\u8077\u540D","position",
6
+ "position_name"]};function parseCsvRecords(text){const records=[];let cells=[];let field="";let quoted=false;let started=false;let line=1;let recordLine=1;let i=0;const pushRecord=()=>{cells.push(field);records.push({line:recordLine,cells});cells=[];field="";started=false};while(i<text.length){const ch=text[i];if(quoted){if(ch==='"'){if(text[i+1]==='"'){field+='"';i+=2;continue}quoted=false}else if(ch==="\r"||ch==="\n"){if(ch==="\r"&&text[i+1]==="\n")i+=1;line+=1;field+="\n"}else{field+=ch}i+=1;
7
+ continue}if(ch==='"'&&field.trim()===""){quoted=true;started=true;field=""}else if(ch===","){cells.push(field);field="";started=true}else if(ch==="\r"||ch==="\n"){if(ch==="\r"&&text[i+1]==="\n")i+=1;pushRecord();line+=1;recordLine=line}else{field+=ch;started=true}i+=1}if(quoted)throw new UsageError(`\u53F0\u5E33 CSV \u306E ${recordLine} \u884C\u76EE\u3067\u5F15\u7528\u7B26\uFF08"\uFF09\u304C\u9589\u3058\u3066\u3044\u307E\u305B\u3093`,HELP);if(started)pushRecord();return records}var decodeLedger=decodeCsvText;
8
+ function normalizeHeader(value){return value.normalize("NFKC").trim().toLowerCase()}function normalizeValue(value){return value.normalize("NFKC").replace(/\s+/g," ").trim().toLowerCase()}function resolveColumns(header,overrides){const normalized=header.map(normalizeHeader);const map={};for(const role of LEDGER_ROLES){const wanted=overrides[role];if(wanted!==void 0){const index2=normalized.indexOf(normalizeHeader(wanted));if(index2<0){throw new UsageError(`\u53F0\u5E33 CSV \u306B\u300C${wanted}\u300D\u3068\
9
+ \u3044\u3046\u5217\u304C\u3042\u308A\u307E\u305B\u3093\uFF08--${role}-column\uFF09`,`\u898B\u51FA\u3057\u884C\u306E\u5217: ${header.map(h=>h.trim()).join("\u3001")}`)}map[role]=index2;continue}const index=normalized.findIndex(h=>COLUMN_CANDIDATES[role].some(c=>normalizeHeader(c)===h));if(index>=0)map[role]=index}if(map.code===void 0&&map.email===void 0&&map.name===void 0){throw new UsageError("\u53F0\u5E33 CSV \u306B\u3001\u4EBA\u3092\u7A81\u304D\u5408\u308F\u305B\u308B\u5217\uFF08\u793E\u54E1\u756A\u53F7\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u6C0F\u540D\u306E\u3069\u308C\u304B\uFF09\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",
10
+ `\u898B\u51FA\u3057\u884C\u306E\u5217: ${header.map(h=>h.trim()).join("\u3001")}
11
+ \u5217\u540D\u304C\u9055\u3046\u3068\u304D\u306F --code-column / --email-column / --name-column \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return map}function parseLedger(text,overrides){const records=parseCsvRecords(text).filter(r=>r.cells.some(c=>c.trim()!==""));const[header,...body]=records;if(header===void 0)throw new UsageError("\u53F0\u5E33 CSV \u304C\u7A7A\u3067\u3059\uFF081\u884C\u76EE\u306B\u898B\u51FA\u3057\u304C\u5FC5\u8981\u3067\u3059\uFF09",HELP);const columns=resolveColumns(
12
+ header.cells,overrides);const rows=[];const errors=[];const seen={code:new Map,email:new Map};for(const record of body){const value=role=>{const index=columns[role];if(index===void 0)return void 0;const raw=(record.cells[index]??"").trim();return raw===""?void 0:raw};const cells={};for(const role of LEDGER_ROLES){const v=value(role);if(v!==void 0)cells[role]=v}const row={line:record.line,...cells};if(row.code===void 0&&row.email===void 0&&row.name===void 0){errors.push(`${record.line} \u884C\u76EE: \u793E\u54E1\u756A\u53F7\u30FB\u30E1\
13
+ \u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u6C0F\u540D\u304C\u3059\u3079\u3066\u7A7A\u3067\u3059`);continue}let duplicated=false;for(const role of["code","email"]){const v=row[role];if(v===void 0)continue;const first=seen[role].get(normalizeValue(v));if(first!==void 0){errors.push(`${record.line} \u884C\u76EE: ${ROLE_LABEL[role]} ${v} \u306F ${first} \u884C\u76EE\u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059`);duplicated=true}else{seen[role].set(normalizeValue(v),record.line)}}if(!duplicated)rows.
14
+ push(row)}if(errors.length>0){throw new UsageError(`\u53F0\u5E33 CSV \u306B\u4E0D\u6B63\u306A\u884C\u304C ${errors.length} \u884C\u3042\u308A\u307E\u3059:
15
+ ${errors.join("\n ")}`,HELP)}return{header:header.cells.map(h=>h.trim()),columns,rows}}function readLedgerFile(file){let fd;try{fd=fs.openSync(file,"r");if(!fs.fstatSync(fd).isFile())throw new UsageError(`--file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,HELP);const buffer=Buffer.alloc(LEDGER_MAX_BYTES+1);let total=0;for(;;){const n=fs.readSync(fd,buffer,total,buffer.length-total,null);if(n===0)break;total+=n;if(total>
16
+ LEDGER_MAX_BYTES){throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059: ${file}`,`\u4E0A\u9650\u306F ${LEDGER_MAX_BYTES} \u30D0\u30A4\u30C8\u3067\u3059\u3002`)}}return buffer.subarray(0,total)}catch(err){if(err instanceof UsageError)throw err;const reason=err.code??err.message;throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u3081\u307E\u305B\u3093: ${file}\uFF08${reason}\uFF09`,HELP)}finally{if(fd!==void 0)fs.closeSync(fd)}}
17
+ var KIND_LABEL={not_in_ledger:"\u53F0\u5E33\u306B\u3044\u306A\u3044\uFF08\u5931\u52B9\u6F0F\u308C\uFF09",missing_in_twp:"TWP \u306B\u3044\u306A\u3044\uFF08\u767B\u9332\u6F0F\u308C\uFF09",disabled_in_twp:"TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u308B\uFF08\u8AA4\u5931\u52B9\uFF09",ambiguous:"\u8907\u6570\u306E\u30E6\u30FC\u30B6\u30FC\u306B\u4E00\u81F4\uFF08\u7A81\u304D\u5408\u308F\u305B\u3067\u304D\u306A\u3044\uFF09",department_mismatch:"\u90E8\u7F72\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\uFF09",
18
+ position_mismatch:"\u5F79\u8077\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\uFF09",inactive:"\u9577\u671F\u9593\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u306A\u3044"};function str(value){return typeof value==="string"&&value!==""?value:null}function listPlan(input,cursor){return{method:"GET",path:"/api/v2/admin/users/list",query:{limit:LIST_PAGE_LIMIT,cursor,include_hidden:input.flags.has("--exclude-hidden")?void 0:"true"}}}var sleep=ms=>new Promise(resolve=>setTimeout(resolve,
19
+ ms));function pacedSender(ctx){const intervalMs=6e4/SEND_PER_MINUTE;let tokens=SEND_BURST;let last=Date.now();let chain=Promise.resolve();const take=()=>{chain=chain.then(async()=>{const now=Date.now();tokens=Math.min(SEND_BURST,tokens+(now-last)/intervalMs);last=now;if(tokens<1){await sleep((1-tokens)*intervalMs);tokens=1;last=Date.now()}tokens-=1});return chain};return async plan=>{for(let attempt=0;;attempt+=1){await take();try{return await ctx.send(plan)}catch(err){if(!(err instanceof ApiError)||
20
+ err.status!==429||attempt>=RATE_LIMIT_RETRIES)throw err;ctx.warn(`API \u306E\u30EC\u30FC\u30C8\u5236\u9650\uFF08429\uFF09\u306B\u5F53\u305F\u3063\u305F\u305F\u3081\u3001${RATE_LIMIT_WAIT_MS/1e3} \u79D2\u5F85\u3063\u3066\u9001\u308A\u76F4\u3057\u307E\u3059\u3002`);await sleep(RATE_LIMIT_WAIT_MS)}}}}async function mapPool(items,limit,fn){const results=new Array(items.length);let next=0;let failed=false;const worker=async()=>{while(!failed&&next<items.length){const index=next;next+=1;try{results[index]=
21
+ await fn(items[index])}catch(err){failed=true;throw err}}};await Promise.all(Array.from({length:Math.min(limit,items.length)},worker));return results}async function listAllUsers(input,send,maxUsers){const users=[];let cursor;for(;;){const body=await send(listPlan(input,cursor));for(const item of listPaging.items(body)){if(!isRecord(item)||typeof item["user_id"]!=="string"){throw new ApiResponseError("\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7\u306E\u884C\u306B user_id \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
22
+ users.push(item)}if(users.length>maxUsers){throw new UsageError(`\u5BFE\u8C61\u306E\u30E6\u30FC\u30B6\u30FC\u304C ${maxUsers} \u4EBA\u3092\u8D85\u3048\u305F\u305F\u3081\u3001\u8A73\u7D30\u3092\u8AAD\u3080\u524D\u306B\u6B62\u3081\u307E\u3057\u305F\uFF081\u4EBA\u3042\u305F\u308A\u6700\u59273\u5F80\u5FA9\u3057\u307E\u3059\uFF09`,input.flags.has("--exclude-hidden")?`\u4E0A\u9650\u3092\u4E0A\u3052\u308B\u306A\u3089 --max-users <\u4EBA\u6570> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`:
23
+ "\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3092\u9664\u304F\u306A\u3089 --exclude-hidden\u3001\u4E0A\u9650\u3092\u4E0A\u3052\u308B\u306A\u3089 --max-users <\u4EBA\u6570> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}const next=listPaging.nextCursor(body);if(next===null)return users;cursor=next}}async function permissionMatrix(input,send){const map=new Map;for(let page=1;;page+=1){const body=await send({method:"GET",path:"/api/v2/admin/users/\
24
+ permissions-matrix",query:{page,limit:MATRIX_PAGE_LIMIT,include_hidden:input.flags.has("--exclude-hidden")?void 0:"true"}});const items=isRecord(body)?body["items"]:void 0;const totalPages=isRecord(body)?body["total_pages"]:void 0;if(!Array.isArray(items)||typeof totalPages!=="number"){throw new ApiResponseError("\u6A29\u9650\u30DE\u30C8\u30EA\u30AF\u30B9\u306E\u5FDC\u7B54\u306B items / total_pages \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
25
+ for(const item of items){if(!isRecord(item)||typeof item["user_id"]!=="string")continue;const raw=item["feature_permissions"];const levels={};if(isRecord(raw)){for(const[feature,level]of Object.entries(raw)){if(typeof level==="string")levels[feature]=level}}else if(!Array.isArray(raw)){continue}map.set(item["user_id"],levels)}if(page>=totalPages)return map}}function userSegment(userId){if(!isSafePathSegment(userId)){throw new ApiResponseError(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u30E6\u30FC\u30B6\u30FC ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${userId}\
26
+ \u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return encodeURIComponent(userId)}async function userDetail(send,userId){const body=await send({method:"GET",path:`/api/v2/admin/users/${userSegment(userId)}`});if(!isRecord(body)||body["user_id"]!==userId){throw new ApiResponseError(`\u30E6\u30FC\u30B6\u30FC\u8A73\u7D30\u306E\u5FDC\u7B54\u304C ${userId} \u306E\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
27
+ return body}async function primaryAssignment(send,userId){const body=await send({method:"GET",path:`/api/v2/organization/users/${userSegment(userId)}/assignments/current`});const list=isRecord(body)?body["list"]:void 0;if(!Array.isArray(list))throw new ApiResponseError("\u6240\u5C5E\u4E00\u89A7\u306E\u5FDC\u7B54\u306B list \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");const primary=list.find(row=>isRecord(row)&&
28
+ row["is_approval_route"]===true)??list.find(row=>isRecord(row)&&row["is_primary"]===true);return isRecord(primary)?{id:str(primary["id"]),managerId:str(primary["manager_id"]),departmentId:str(primary["department_id"])}:{id:null,managerId:null,departmentId:null}}async function lastLogin(send,userId){const body=await send({method:"GET",path:"/api/v2/admin/tenant/login-history",query:{user_id:userId,result:"success",limit:LOGIN_HISTORY_LIMIT}});const data=isRecord(body)&&isRecord(body["data"])?body["\
29
+ data"]:body;const histories=isRecord(data)?data["histories"]:void 0;if(!Array.isArray(histories)){throw new ApiResponseError("\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306E\u5FDC\u7B54\u306B histories \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}let latest=null;for(const h of histories){const ts=isRecord(h)&&h["result"]==="success"?str(h["timestamp"]):null;if(ts!==null&&(latest===null||ts>latest))latest=ts}return latest}
30
+ async function collectInventory(input,ctx){const send=pacedSender(ctx);const maxUsers=Number(requireResolved(input,"maxUsers"));const users=await listAllUsers(input,send,maxUsers);const permissions=await permissionMatrix(input,send);const minutes=Math.ceil(users.length*3/SEND_PER_MINUTE);ctx.warn(`${users.length} \u4EBA\u306E\u8A73\u7D30\u30FB\u6240\u5C5E\u30FB\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u3092\u8AAD\u307F\u307E\u3059\uFF08\u6700\u5927 ${users.length*3} \u5F80\u5FA9`+(users.length*3>SEND_BURST?
31
+ `\u30FB\u30EC\u30FC\u30C8\u5236\u9650\u306B\u5408\u308F\u305B\u3066\u6700\u9577 ${minutes} \u5206\u307B\u3069`:"")+"\uFF09\u3002");const names=new Map(users.map(u=>[u["user_id"],str(u["user_name"])]));const rows=await mapPool(users,CONCURRENCY,async user=>{const userId=user["user_id"];const detail=await userDetail(send,userId);const authType=str(detail["auth_type"]);const canLogin=authType!=="disabled";const wantDetail=canLogin||input.flags.has("--include-disabled");const sso=authType==="oauth";
32
+ const[assignment,loginAt]=wantDetail?await Promise.all([primaryAssignment(send,userId),sso?Promise.resolve(null):lastLogin(send,userId)]):[{id:null,managerId:null,departmentId:null},null];const managerId=assignment.managerId;return{user_id:userId,user_name:str(user["user_name"]),email:str(user["email"]),employee_code:str(user["employee_code"]),hire_date:str(detail["hire_date"]),department_name:str(user["department_name"]),position_name:str(user["position_name"]),assignment_id:assignment.id,manager_id:managerId,
33
+ manager_name:managerId===null?null:names.get(managerId)??null,role:str(user["role"]),is_partner:typeof user["is_partner"]==="boolean"?user["is_partner"]:null,permissions:permissions.get(userId)??null,auth_type:authType,can_login:canLogin,display_flg:typeof user["display_flg"]==="boolean"?user["display_flg"]:null,last_login_at:loginAt,last_login_status:!wantDetail?"not_checked":sso?"sso_not_recorded":loginAt===null?"not_recorded":"recorded"}});return{rows,scanned:users.length}}function daysBetween(fromIso,now){
34
+ return(now.getTime()-new Date(fromIso).getTime())/864e5}function placeholder(label){return shellQuote(`<${label}>`)}function disableCommand(userId){return`twp user update ${shellQuote(userId)} --auth-type disabled --display false --memberlist false --org-chart false --dashboard false`}function recentlyHired(hireDate,inactiveDays,now){return hireDate!==null&&daysBetween(`${hireDate}T00:00:00Z`,now)<=inactiveDays}function diffAgainstLedger(inventory,ledger,columns,inactiveDays,now){const index={code:new Map,
35
+ email:new Map,name:new Map};const add=(map,key,row)=>{if(key===null)return;const k=normalizeValue(key);map.set(k,[...map.get(k)??[],row])};for(const row of inventory){add(index.code,row.employee_code,row);add(index.email,row.email,row);add(index.name,row.user_name,row)}const diffs=[];const matched=new Set;const base=(kind,user,line)=>({kind,kind_label:KIND_LABEL[kind],user_id:user?.user_id??null,user_name:user?.user_name??null,email:user?.email??null,employee_code:user?.employee_code??null,auth_type:user?.
36
+ auth_type??null,is_partner:user?.is_partner??null,ledger_line:line,twp_value:null,ledger_value:null,suggestion:null});const fromLedger=(kind,entry)=>({...base(kind,null,entry.line),user_name:entry.name??null,email:entry.email??null,employee_code:entry.code??null,ledger_value:entry.code??entry.email??entry.name??null});for(const entry of ledger){let candidates=[];for(const role of["code","email","name"]){const v=entry[role];if(v===void 0)continue;candidates=index[role].get(normalizeValue(v))??[];
37
+ if(candidates.length>0)break}if(candidates.length>1){const active=candidates.filter(c=>c.can_login);if(active.length===1)candidates=active}if(candidates.length>1){diffs.push({...fromLedger("ambiguous",entry),twp_value:`${candidates.length} \u4EBA\u306B\u4E00\u81F4\uFF08${candidates.map(c=>c.user_id).join(", ")}\uFF09`,suggestion:null});continue}const user=candidates[0];if(user===void 0){diffs.push({...fromLedger("missing_in_twp",entry),suggestion:`twp user invite create ${flagSegment("--email",entry.
38
+ email??"<\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>")}`});continue}matched.add(user.user_id);if(!user.can_login){diffs.push({...base("disabled_in_twp",user,entry.line),twp_value:user.auth_type,suggestion:`twp user update ${shellQuote(user.user_id)} --auth-type ${placeholder("\u5931\u52B9\u524D\u306E\u8A8D\u8A3C\u30BF\u30A4\u30D7")} --display true --memberlist true --org-chart true --dashboard true`});continue}if(columns.department!==void 0&&entry.department!==void 0&&normalizeValue(entry.department)!==
39
+ normalizeValue(user.department_name??"")){diffs.push({...base("department_mismatch",user,entry.line),twp_value:user.department_name,ledger_value:entry.department,suggestion:`twp user assignment move ${shellQuote(user.user_id)} ${flagSegment("--department",entry.department)} --start-date ${placeholder("\u7570\u52D5\u65E5")}`})}if(columns.position!==void 0&&entry.position!==void 0&&normalizeValue(entry.position)!==normalizeValue(user.position_name??"")){diffs.push({...base("position_mismatch",user,
40
+ entry.line),twp_value:user.position_name,ledger_value:entry.position,suggestion:user.assignment_id===null?null:`twp user assignment update ${shellQuote(user.assignment_id)} --user ${shellQuote(user.user_id)} `+flagSegment("--position",entry.position)})}}for(const user of inventory){if(!user.can_login)continue;if(!matched.has(user.user_id)){diffs.push({...base("not_in_ledger",user,null),twp_value:user.auth_type,suggestion:disableCommand(user.user_id)})}if(user.last_login_status==="sso_not_recorde\
41
+ d"||recentlyHired(user.hire_date,inactiveDays,now))continue;if(user.last_login_at===null||daysBetween(user.last_login_at,now)>inactiveDays){diffs.push({...base("inactive",user,null),twp_value:user.last_login_at??`${LOGIN_HISTORY_RETENTION_DAYS}\u65E5\u4EE5\u5185\u306E\u30ED\u30B0\u30A4\u30F3\u8A18\u9332\u306A\u3057`})}}return diffs}var INVENTORY_COLUMNS=["user_id","user_name","email","employee_code","hire_date","department_name","position_name","manager_name","role","is_partner","permissions","a\
42
+ uth_type","display_flg","last_login_at"];var DIFF_COLUMNS=["kind","kind_label","user_id","user_name","email","employee_code","auth_type","is_partner","ledger_line","twp_value","ledger_value","suggestion"];function exportBody(body){if(!isRecord(body)||!Array.isArray(body["rows"])||body["mode"]!=="inventory"&&body["mode"]!=="diff"){throw new ApiResponseError("\u68DA\u5378\u306E\u7D50\u679C\u3092\u7D44\u307F\u7ACB\u3066\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5185\u90E8\u30A8\u30E9\u30FC\uFF09\u3002")}
43
+ return body}function permissionText(levels){if(levels===null)return"\uFF08\u53D6\u5F97\u3067\u304D\u305A\uFF09";const granted=Object.entries(levels).filter(([,level])=>level!=="none"&&level!=="").sort(([a],[b])=>a.localeCompare(b));return granted.length===0?"\uFF08\u306A\u3057\uFF09":granted.map(([feature,level])=>`${feature}:${level}`).join(";")}function lastLoginText(row){switch(row.last_login_status){case"recorded":return row.last_login_at;case"sso_not_recorded":return"\u5224\u5B9A\u4E0D\u80FD\uFF08SSO \u306F\u8A18\u9332\u3055\u308C\u306A\u3044\uFF09";case"\
44
+ not_recorded":return`${LOGIN_HISTORY_RETENTION_DAYS}\u65E5\u4EE5\u5185\u306E\u8A18\u9332\u306A\u3057`;default:return null}}function spreadsheetSafe(value){return typeof value==="string"&&/^[=+\-@\t\r]/.test(value)?`'${value}`:value}function flagValue(input,flag){const raw=input.flags.get(flag);if(raw===void 0)return void 0;if(raw.trim()==="")throw new UsageError(`${flag} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,HELP);return raw}function ledgerOf(input){const raw=input.
45
+ resolved?.["ledger"];return raw===void 0?void 0:JSON.parse(raw)}var COLUMN_FLAGS=LEDGER_ROLES.map(role=>({name:`--${role}-column`,summary:`\u53F0\u5E33\u306E${ROLE_LABEL[role]}\u306E\u5217\u540D\uFF08\u65E2\u5B9A\u306F ${COLUMN_CANDIDATES[role].slice(0,3).join(" / ")} \u306A\u3069\u304B\u3089\u63A2\u3059\uFF09`,takesValue:true,placeholder:"<\u5217\u540D>"}));var exportOperation={name:"export",summary:"\u5728\u7C4D\u8005\u3092\u68DA\u5378\u3059\u308B\uFF08\u6240\u5C5E\u30FB\u5F79\u8077\u30FB\u4E0A\u9577\u30FB\u6A29\u9650\u30FB\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u4ED8\u304D\u30FB\u4EBA\u4E8B\u53F0\u5E33 CSV \u3068\u306E\u5DEE\u5206\uFF09",
46
+ usage:USAGE,description:`\u5728\u7C4D\u8005\uFF08\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C disabled \u3067\u306A\u3044\u30E6\u30FC\u30B6\u30FC\uFF09\u30921\u4EBA1\u884C\u3067\u51FA\u3057\u307E\u3059\u3002\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u542B\u307F\u307E\u3059
47
+ \uFF08\u8868\u793A\u30D5\u30E9\u30B0\u3060\u3051\u5916\u3057\u3066\u5931\u52B9\u3055\u305B\u3066\u3044\u306A\u3044\u4EBA\u3092\u898B\u3064\u3051\u308B\u305F\u3081\uFF09\u3002--exclude-hidden \u3067\u8868\u793A\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3060\u3051\u306B\u7D5E\u308C\u307E\u3059\u3002
48
+ --include-disabled \u3067\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u51FA\u3057\u307E\u3059\u3002\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059\u3002
49
+
50
+ \u5217: user_id / user_name / email / employee_code / hire_date\uFF08\u5165\u793E\u65E5\uFF09/ department_name\u30FBposition_name\uFF08\u4E3B\u6240\u5C5E\uFF09/
51
+ manager_name\uFF08\u4E3B\u6240\u5C5E\u306E\u4E0A\u9577\uFF09/ role / is_partner / permissions\uFF08\u6A5F\u80FD\u3054\u3068\u306E\u6A29\u9650\u3002none \u306F\u7701\u304F\uFF09/ auth_type / display_flg / last_login_at\u3002
52
+ \u500B\u4EBA\u9023\u7D61\u5148\uFF08\u500B\u4EBA\u30E1\u30FC\u30EB\u30FB\u7DCA\u6025\u9023\u7D61\u5148\u306A\u3069\uFF09\u306F\u51FA\u3057\u307E\u305B\u3093\u3002--output tsv \u3067\u8868\u8A08\u7B97\u30BD\u30D5\u30C8\u3078\u3001--output json \u3067\u4ED6\u306E\u30C4\u30FC\u30EB\u3078\u6E21\u305B\u307E\u3059
53
+ \uFF08tsv / table \u3067\u306F\u3001= + - @ \u3067\u59CB\u307E\u308B\u5024\u306E\u5148\u982D\u306B ' \u3092\u4ED8\u3051\u3066\u3001\u8868\u8A08\u7B97\u30BD\u30D5\u30C8\u304C\u5F0F\u3068\u3057\u3066\u8AAD\u307E\u306A\u3044\u3088\u3046\u306B\u3057\u307E\u3059\uFF09\u3002
54
+
55
+ \u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u306F\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u304B\u3089\u53D6\u308A\u307E\u3059\u3002\u6B21\u306E2\u70B9\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002
56
+ - \u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306F90\u65E5\u3067\u6D88\u3048\u307E\u3059\u3002\u300C90\u65E5\u4EE5\u5185\u306E\u8A18\u9332\u306A\u3057\u300D\u306F\u4E00\u5EA6\u3082\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u306A\u3044\u3001\u3068\u3044\u3046\u610F\u5473\u3067\u306F\u3042\u308A\u307E\u305B\u3093
57
+ - Google / Microsoft \u306E SSO \u3067\u306E\u30ED\u30B0\u30A4\u30F3\u306F\u8A18\u9332\u3055\u308C\u307E\u305B\u3093\u3002\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C oauth \u306E\u30E6\u30FC\u30B6\u30FC\u306F\u300C\u5224\u5B9A\u4E0D\u80FD\u300D\u3068\u51FA\u3057\u3001
58
+ \u9577\u671F\u672A\u30ED\u30B0\u30A4\u30F3\uFF08inactive\uFF09\u306E\u5224\u5B9A\u304B\u3089\u5916\u3057\u307E\u3059\u3002all \u306E\u30E6\u30FC\u30B6\u30FC\u304C SSO \u3060\u3051\u3067\u4F7F\u3063\u3066\u3044\u308B\u5834\u5408\u3082\u8A18\u9332\u306F\u6B8B\u308A\u307E\u305B\u3093
59
+
60
+ --file <\u53F0\u5E33CSV> \u3092\u4ED8\u3051\u308B\u3068\u3001\u4EBA\u4E8B\u53F0\u5E33\u3068\u306E\u5DEE\u5206\u3060\u3051\u3092\u51FA\u3057\u307E\u3059\uFF081\u884C\u76EE\u306F\u898B\u51FA\u3057\u3002UTF-8 \u3068 Shift_JIS \u3092\u8AAD\u3081\u307E\u3059\uFF09:
61
+ not_in_ledger TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u306A\u3044\u304C\u53F0\u5E33\u306B\u3044\u306A\u3044\uFF08\u9000\u793E\u6642\u306E\u5931\u52B9\u6F0F\u308C\u3002\u30D1\u30FC\u30C8\u30CA\u30FC\u3084\u5171\u7528\u30A2\u30AB\u30A6\u30F3\u30C8\u3082\u51FA\u307E\u3059\uFF09
62
+ missing_in_twp \u53F0\u5E33\u306B\u3044\u308B\u304C TWP \u306B\u3044\u306A\u3044\uFF08\u767B\u9332\u6F0F\u308C\uFF09
63
+ disabled_in_twp \u53F0\u5E33\u306B\u3044\u308B\u304C TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u308B\uFF08\u8AA4\u5931\u52B9\uFF09
64
+ ambiguous \u53F0\u5E33\u306E1\u884C\u304C TWP \u306E\u8907\u6570\u306E\u30E6\u30FC\u30B6\u30FC\u306B\u4E00\u81F4\u3057\u3001\u6C7A\u3081\u3089\u308C\u306A\u3044
65
+ department_mismatch \u90E8\u7F72\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\u30FB\u53F0\u5E33\u306B\u90E8\u7F72\u306E\u5217\u304C\u3042\u308B\u3068\u304D\uFF09
66
+ position_mismatch \u5F79\u8077\u304C\u9055\u3046\uFF08\u540C\u4E0A\u30FB\u53F0\u5E33\u306B\u5F79\u8077\u306E\u5217\u304C\u3042\u308B\u3068\u304D\uFF09
67
+ inactive \u30ED\u30B0\u30A4\u30F3\u3067\u304D\u308B\u306E\u306B --inactive-days \u65E5\uFF08\u65E2\u5B9A60\u30FB\u6700\u592790\uFF09\u30ED\u30B0\u30A4\u30F3\u306E\u8A18\u9332\u304C\u7121\u3044
68
+ \uFF08\u5165\u793E\u65E5\u304C\u305D\u306E\u65E5\u6570\u4EE5\u5185\u306E\u4EBA\u3068\u3001oauth \u306E\u4EBA\u306F\u51FA\u3057\u307E\u305B\u3093\uFF09
69
+ \u53F0\u5E33\u306E\u4EBA\u3068\u306F\u3001\u793E\u54E1\u756A\u53F7 \u2192 \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 \u2192 \u6C0F\u540D\u306E\u9806\u306B\u8A66\u3057\u3001\u6700\u521D\u306B TWP \u306E\u8AB0\u304B\u306B\u5F53\u305F\u3063\u305F\u5217\u3067\u7A81\u304D\u5408\u308F\u305B\u307E\u3059\u3002
70
+ \u90E8\u7F72\u30FB\u5F79\u8077\u306F TWP \u306E\u540D\u524D\u3068\u6BD4\u3079\u307E\u3059\uFF08\u5168\u89D2\u534A\u89D2\u30FB\u7A7A\u767D\u306E\u63FA\u308C\u3068\u5927\u6587\u5B57\u5C0F\u6587\u5B57\u306F\u7121\u8996\u3057\u307E\u3059\uFF09\u3002
71
+ \u5217\u540D\u306F \u793E\u54E1\u756A\u53F7 / \u6C0F\u540D / \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 / \u90E8\u7F72 / \u5F79\u8077 \u306A\u3069\u3092\u81EA\u52D5\u3067\u63A2\u3057\u307E\u3059\u3002\u9055\u3046\u3068\u304D\u306F --code-column \u7B49\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
72
+ \uFF08\u898B\u51FA\u3057\u304C\u5358\u306B\u300C\u30E1\u30FC\u30EB\u300D\u306E\u5217\u306F\u500B\u4EBA\u30E1\u30FC\u30EB\u306E\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u81EA\u52D5\u3067\u306F\u4F7F\u3044\u307E\u305B\u3093\uFF09\u3002\u4F7F\u3046\u5217\u306F\u5B9F\u884C\u524D\u306B\u8868\u793A\u3057\u307E\u3059\u3002
73
+ \u5404\u884C\u306E suggestion \u306F\u6B21\u306B\u6253\u3064\u30B3\u30DE\u30F3\u30C9\u306E\u6848\u3067\u3059\u3002'<\u7570\u52D5\u65E5>' \u306A\u3069\u306E <\u2026> \u306F\u57CB\u3081\u3066\u304B\u3089\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002
74
+ \u5B9F\u884C\u3059\u308B\u524D\u306B\u3001\u5BFE\u8C61\u304C\u81EA\u5206\u81EA\u8EAB\u3084\u5171\u7528\u306E\u7BA1\u7406\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u306A\u3044\u304B\u3092\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\uFF08\u5931\u52B9\u3055\u305B\u308B\u3068\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\uFF09\u3002
75
+ twp user assignment move \u306F\u4E0A\u9577\u3092\u5F15\u304D\u7D99\u304C\u306A\u3044\u306E\u3067\u3001\u5FC5\u8981\u306A\u3089 --manager \u3082\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
76
+ \u72B6\u614B\u304C active \u3067\u306A\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\uFF08\u30DE\u30B9\u30BF\u7BA1\u7406\u3067\u505C\u6B62\u3057\u305F\u3082\u306E\u7B49\uFF09\u306F\u4E00\u89A7\u306B\u51FA\u306A\u3044\u305F\u3081\u3001missing_in_twp \u306B\u51FA\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002
77
+
78
+ 1\u4EBA\u3042\u305F\u308A\u6700\u59273\u5F80\u5FA9\u3057\u307E\u3059\u3002\u672C\u756A\u306E API \u30EC\u30FC\u30C8\u5236\u9650\u306B\u5408\u308F\u305B\u30661\u5206\u3042\u305F\u308A ${SEND_PER_MINUTE} \u672C\u307E\u3067\u306B\u6291\u3048\u3066\u9001\u308A\u307E\u3059\u3002
79
+ \u5BFE\u8C61\u304C --max-users\uFF08\u65E2\u5B9A ${DEFAULT_MAX_USERS} \u4EBA\uFF09\u3092\u8D85\u3048\u308B\u3068\u3001\u8A73\u7D30\u3092\u8AAD\u3080\u524D\u306B\u6B62\u307E\u308A\u307E\u3059\u3002`,forbidden:"\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002twp user export \u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059",flags:[{name:"--file",summary:"\u7A81\u304D\u5408\u308F\u305B\u308B\u4EBA\u4E8B\u53F0\u5E33\u306E CSV\uFF081\u884C\u76EE\u306F\u898B\u51FA\u3057\uFF09",
80
+ takesValue:true,placeholder:"<\u53F0\u5E33CSV>"},{name:"--include-disabled",summary:"\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u51FA\u3059\uFF08--file \u7121\u3057\u306E\u3068\u304D\uFF09",takesValue:false},{name:"--exclude-hidden",summary:"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3092\u5BFE\u8C61\u304B\u3089\u5916\u3059",takesValue:false},{name:"--inactive-days",summary:`\u3053\u306E\u65E5\u6570\u30ED\u30B0\u30A4\u30F3\u306E\u8A18\u9332\u304C\u7121\u3044\u5728\u7C4D\u8005\u3092 inactive \u3068\u3057\u3066\u51FA\u3059\uFF08\u65E2\u5B9A ${DEFAULT_INACTIVE_DAYS}\
81
+ \u30FB\u6700\u5927 ${LOGIN_HISTORY_RETENTION_DAYS}\uFF09`,takesValue:true,placeholder:"<\u65E5\u6570>"},...COLUMN_FLAGS,{name:"--max-users",summary:`\u5BFE\u8C61\u306E\u4EBA\u6570\u306E\u4E0A\u9650\uFF08\u65E2\u5B9A ${DEFAULT_MAX_USERS}\uFF09`,takesValue:true,placeholder:"<\u4EBA\u6570>"}],async prepare(input){if(input.args.length>0)throw new UsageError(`export \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,HELP);const inactiveDays=positiveInteger(input.
82
+ flags,"--inactive-days")??DEFAULT_INACTIVE_DAYS;if(inactiveDays>LOGIN_HISTORY_RETENTION_DAYS){throw new UsageError(`--inactive-days \u306F ${LOGIN_HISTORY_RETENTION_DAYS} \u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${inactiveDays}\uFF09`,`\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306F ${LOGIN_HISTORY_RETENTION_DAYS} \u65E5\u3067\u6D88\u3048\u308B\u305F\u3081\u3001\u305D\u308C\u3088\u308A\u524D\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002`)}
83
+ const maxUsers=positiveInteger(input.flags,"--max-users")??DEFAULT_MAX_USERS;const file=flagValue(input,"--file");const overrides={};for(const role of LEDGER_ROLES){const value=flagValue(input,`--${role}-column`);if(value!==void 0)overrides[role]=value}const resolved={inactiveDays:String(inactiveDays),maxUsers:String(maxUsers)};if(file===void 0)return withResolved(input,resolved);if(input.flags.has("--include-disabled")){throw new UsageError("--include-disabled \u306F --file \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093",
84
+ "\u5DEE\u5206\u3067\u306F\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u7A81\u304D\u5408\u308F\u305B\u306B\u4F7F\u3044\u3001\u53F0\u5E33\u306B\u3044\u308B\u4EBA\u306F disabled_in_twp \u3068\u3057\u3066\u51FA\u3057\u307E\u3059\u3002")}resolved["ledger"]=JSON.stringify(parseLedger(decodeLedger(readLedgerFile(file)),overrides));return withResolved(input,resolved)},plan:input=>listPlan(input),plannedNotes:input=>{const notes=["\u3053\u306E\u3042\u3068\u4E00\u89A7\u306E\u7D9A\u304D\u30FB\u6A29\u9650\u30DE\u30C8\u30EA\u30AF\u30B9\u3092 GET \u3057\u30011\u4EBA\u305A\u3064\u8A73\u7D30\u30FB\u73FE\u5728\u306E\u6240\u5C5E\u30FB\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u3092 GET \u3057\u307E\u3059\uFF08\u8AAD\u307F\u53D6\u308A\
85
+ \u3060\u3051\uFF09\u3002"];if(!input.flags.has("--exclude-hidden"))notes.push("\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u5BFE\u8C61\u306B\u3057\u307E\u3059\uFF08--exclude-hidden \u3067\u9664\u3051\u307E\u3059\uFF09\u3002");const ledger=ledgerOf(input);if(ledger!==void 0){const used=LEDGER_ROLES.filter(role=>ledger.columns[role]!==void 0).map(role=>`${ROLE_LABEL[role]}=\u300C${ledger.header[ledger.columns[role]]??""}\u300D`);notes.push(`\u53F0\u5E33 ${ledger.
86
+ rows.length} \u884C\u3092\u8AAD\u307F\u307E\u3057\u305F\u3002\u4F7F\u3046\u5217: ${used.join("\u3001")}`)}return notes},async execute(input,ctx){const{rows,scanned}=await collectInventory(input,ctx);const disabled=rows.filter(r=>!r.can_login).length;const ssoUndetermined=rows.filter(r=>r.can_login&&r.last_login_status==="sso_not_recorded").length;const excludedHidden=input.flags.has("--exclude-hidden");const ledger=ledgerOf(input);if(ledger===void 0){const visible=input.flags.has("--include-disa\
87
+ bled")?rows:rows.filter(r=>r.can_login);return{mode:"inventory",rows:visible,scanned,disabled,ssoUndetermined,excludedHidden}}const diffs=diffAgainstLedger(rows,ledger.rows,ledger.columns,Number(requireResolved(input,"inactiveDays")),new Date);return{mode:"diff",rows:diffs,scanned,disabled,ssoUndetermined,excludedHidden}},summarize(body){const result=exportBody(body);if(result.mode==="diff"){return result.rows.map(row=>Object.fromEntries(DIFF_COLUMNS.map(c=>[c,spreadsheetSafe(row[c])])))}return result.
88
+ rows.map(row=>Object.fromEntries(INVENTORY_COLUMNS.map(c=>{if(c==="permissions")return[c,permissionText(row.permissions)];if(c==="last_login_at")return[c,lastLoginText(row)];if(c==="manager_name")return[c,spreadsheetSafe(row.manager_name??row.manager_id)];return[c,spreadsheetSafe(row[c])]})))},raw:body=>exportBody(body).rows,notes(body){const result=exportBody(body);const notes=[`${result.scanned} \u4EBA\u3092\u8AAD\u307F\u307E\u3057\u305F\uFF08\u3046\u3061\u5931\u52B9\u6E08\u307F ${result.disabled}\
89
+ \u4EBA\uFF09\u3002`+(result.excludedHidden?"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u306F\u5BFE\u8C61\u5916\u3067\u3059\uFF08--exclude-hidden\uFF09\u3002":"")];if(result.ssoUndetermined>0){notes.push(`\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C oauth \u306E ${result.ssoUndetermined} \u4EBA\u306F\u3001SSO \u306E\u30ED\u30B0\u30A4\u30F3\u304C\u8A18\u9332\u3055\u308C\u306A\u3044\u305F\u3081\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u3092\u5224\u5B9A\u3057\u3066\u3044\u307E\u305B\u3093\u3002`)}
90
+ if(result.mode==="diff"){const counts=new Map;for(const row of result.rows)counts.set(row.kind,(counts.get(row.kind)??0)+1);notes.push(counts.size===0?"\u53F0\u5E33\u3068\u306E\u5DEE\u5206\u306F\u3042\u308A\u307E\u305B\u3093\u3002":`\u5DEE\u5206: ${[...counts].map(([kind,n])=>`${kind} ${n}\u4EF6`).join(" / ")}`);if(result.excludedHidden){notes.push("--exclude-hidden \u306E\u305F\u3081\u3001\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u307E\u307E\u5931\u52B9\u3057\u3066\u3044\u306A\u3044\u30E6\u30FC\u30B6\u30FC\uFF08\u5931\u52B9\u6F0F\u308C\uFF09\u306F\u51FA\u3066\u3044\u307E\u305B\u3093\u3002\u307E\u305F\u3001\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u304C missing_in_twp\uFF08\u767B\u9332\u6F0F\u308C\uFF09\u3068\u3057\u3066\u51FA\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002")}}
91
+ return notes}};export{LOGIN_HISTORY_RETENTION_DAYS,DEFAULT_INACTIVE_DAYS,CONCURRENCY,pacedSender,mapPool,userDetail,primaryAssignment,lastLogin,daysBetween,recentlyHired,lastLoginText,spreadsheetSafe,exportOperation};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{describeError,normalizeRequiredPlatforms}from"./chunk-AT432SCP.js";import{httpFetch}from"./chunk-J7QYPKVK.js";var DAY_KEYS=["mon","tue","wed","thu","fri","sat","sun"];function wallClock(year,month1,day,hour=0,minute=0,second=0){return new Date(Date.UTC(year,month1-1,day,hour,minute,second,0))}function nowInZone(timezone,warn,at=new Date){try{const fmt=new Intl.DateTimeFormat("en-US",{timeZone:timezone,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"});const parts={};for(const p of fmt.formatToParts(at)){if(p.type!=="literal")parts[p.type]=p.value}
3
+ import{describeError,normalizeRequiredPlatforms}from"./chunk-SPZ3GBYC.js";import{skillCommand}from"./chunk-6CS5L24D.js";import{httpFetch}from"./chunk-J7QYPKVK.js";var DAY_KEYS=["mon","tue","wed","thu","fri","sat","sun"];function wallClock(year,month1,day,hour=0,minute=0,second=0){return new Date(Date.UTC(year,month1-1,day,hour,minute,second,0))}function nowInZone(timezone,warn,at=new Date){try{const fmt=new Intl.DateTimeFormat("en-US",{timeZone:timezone,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"});const parts={};for(const p of fmt.formatToParts(at)){if(p.type!=="literal")parts[p.type]=p.value}
4
4
  const y=Number(parts["year"]);const mo=Number(parts["month"]);const d=Number(parts["day"]);const h=Number(parts["hour"]);const mi=Number(parts["minute"]);const s=Number(parts["second"]);if([y,mo,d,h,mi,s].some(v=>!Number.isFinite(v)))throw new Error("\u5F62\u5F0F\u4E0D\u660E");return wallClock(y,mo,d,h,mi,s)}catch(err){warn?.(`\u26A0\uFE0F \u30BF\u30A4\u30E0\u30BE\u30FC\u30F3 ${timezone} \u3092\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u30DE\u30B7\u30F3\u306E\u30ED\u30FC\u30AB\u30EB\u6642\u523B\u3067\u5224\u5B9A\u3057\u307E\u3059\u2014\u2014\u30B5\u30FC\u30D0\u306E\u5C65\u6B74\u3068\u305A\u308C\u308B\u3068\u67A0\u306E\u5224\u5B9A\u304C\u58CA\u308C\u307E\u3059`);
5
5
  return wallClock(at.getFullYear(),at.getMonth()+1,at.getDate(),at.getHours(),at.getMinutes(),at.getSeconds())}}function parseTs(value){if(value===null||value===void 0||value==="")return null;const text=String(value).trim().replace(/ /g,"T");const attempts=[[19,/^(\d{4})-(\d{1,2})-(\d{1,2})T(\d{1,2}):(\d{1,2}):(\d{1,2})$/],[16,/^(\d{4})-(\d{1,2})-(\d{1,2})T(\d{1,2}):(\d{1,2})$/],[10,/^(\d{4})-(\d{1,2})-(\d{1,2})$/]];for(const[width,re]of attempts){const m=re.exec(text.slice(0,width));if(!m)continue;
6
6
  const[,y,mo,d,h,mi,s]=m;const hh=Number(h??0);const mm=Number(mi??0);const ss=Number(s??0);if(hh>23||mm>59||ss>59)continue;const date=wallClock(Number(y),Number(mo),Number(d),hh,mm,ss);if(date.getUTCFullYear()!==Number(y)||date.getUTCMonth()+1!==Number(mo)||date.getUTCDate()!==Number(d)){continue}return date}return null}function num(value,fallback,cast="int"){if(value===null||value===void 0||value==="")return fallback;if(typeof value==="boolean")return value?1:0;if(typeof value==="number"){if(!Number.
@@ -34,13 +34,13 @@ if(!r||typeof r!=="object")continue;const row=r;if(row["status"]!=="running")con
34
34
  if(!exclusiveSkills.has(skill))return null;if(running.unavailable)return"\u30EA\u30EA\u30FC\u30B9\u72B6\u6CC1\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u67A0\u3092\u6368\u3066\u308B";if(running.ids.length>0)return`${running.ids.join(",")} \u304C\u5B9F\u884C\u4E2D\u306E\u305F\u3081\u67A0\u3092\u6368\u3066\u308B`;return null}async function collectDue(input){const{config,now,history,windowCounts,safeMode,warn,verbose}=input;const gates=config.gates??[];const counts=input.counts??{};const exclusiveSkills=input.
35
35
  exclusiveSkills??new Set;const statusEndpoint=input.statusEndpoint??null;let running=null;const items=[];for(const sch of config.schedules??[]){const{due,reason,windowKey}=isDue(sch,now,history,safeMode,warn);const sid="id"in sch?pyStr(sch.id):"?";if(!due){verbose?.(` skip ${pad28(sid)} ${reason}`);continue}const skill=String(sch.skill);const gate=gateStatus(skill,now,gates);if(!gate.allowed){verbose?.(` hold ${pad28(sid)} \u6642\u9593\u5E2F\u30B2\u30FC\u30C8: ${gate.reason}`);continue}const blocked=await requireZeroBlocked(
36
36
  sch,counts,input.fetchCount,config.require_zero_statuses,warn);if(blocked){verbose?.(` hold ${pad28(sid)} \u4EF6\u6570\u30B2\u30FC\u30C8: ${blocked}`);continue}if(exclusiveSkills.has(skill)){running??=await(input.fetchRunning??(()=>fetchRunningReleases(statusEndpoint)))();const held=releaseRunningBlocked(skill,running,exclusiveSkills);if(held){verbose?.(` hold ${pad28(sid)} \u30EA\u30EA\u30FC\u30B9\u6392\u4ED6: ${held}`);continue}}items.push({scheduleId:sid,skill,args:rotationArgs(sch,history,
37
- windowCounts,windowKey),priority:truthyStr("priority"in sch?sch.priority:"P3")||"P3",label:sch.label||`\u5B9A\u671F: /twp-${skill}`,windowKey,reason,requiredPlatforms:normalizeRequiredPlatforms(sch.required_platforms),order:num(sch.order,50,"float")})}items.sort((a,b)=>{const pa=priorityRank(a.priority);const pb=priorityRank(b.priority);if(pa!==pb)return pa-pb;return a.order-b.order});let limit=num(config.max_per_cycle,2);if(limit===0&&config.max_per_cycle!==void 0&&config.max_per_cycle!==null){
38
- warn?.("# max_per_cycle=0 \u306F\u7121\u5236\u9650\u3067\u306F\u306A\u304F\u8A2D\u5B9A\u30DF\u30B9\u3068\u307F\u306A\u3057\u65E2\u5B9A(2)\u3092\u4F7F\u3044\u307E\u3059\u3002\u7121\u5236\u9650\u306B\u3057\u305F\u3044\u5834\u5408\u306F -1 \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002");limit=2}let out=items;if(limit>0&&items.length>limit){for(const held of items.slice(limit)){verbose?.(` hold ${pad28(held.scheduleId)} max_per_cycle=${limit} \u306E\u305F\u3081\u6B21\u30B5\u30A4\u30AF\u30EB\u3078`)}
37
+ windowCounts,windowKey),priority:truthyStr("priority"in sch?sch.priority:"P3")||"P3",label:sch.label||`\u5B9A\u671F: ${skillCommand(skill)}`,windowKey,reason,requiredPlatforms:normalizeRequiredPlatforms(sch.required_platforms),order:num(sch.order,50,"float")})}items.sort((a,b)=>{const pa=priorityRank(a.priority);const pb=priorityRank(b.priority);if(pa!==pb)return pa-pb;return a.order-b.order});let limit=num(config.max_per_cycle,2);if(limit===0&&config.max_per_cycle!==void 0&&config.max_per_cycle!==
38
+ null){warn?.("# max_per_cycle=0 \u306F\u7121\u5236\u9650\u3067\u306F\u306A\u304F\u8A2D\u5B9A\u30DF\u30B9\u3068\u307F\u306A\u3057\u65E2\u5B9A(2)\u3092\u4F7F\u3044\u307E\u3059\u3002\u7121\u5236\u9650\u306B\u3057\u305F\u3044\u5834\u5408\u306F -1 \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002");limit=2}let out=items;if(limit>0&&items.length>limit){for(const held of items.slice(limit)){verbose?.(` hold ${pad28(held.scheduleId)} max_per_cycle=${limit} \u306E\u305F\u3081\u6B21\u30B5\u30A4\u30AF\u30EB\u3078`)}
39
39
  out=items.slice(0,limit)}return out.map(({order:_order,...row})=>row)}function truthyStr(v){if(v===null||v===void 0||v===false||v===0||v==="")return"";return String(v)}function pad28(s){return s.padEnd(28)}function promptSection(config,now,history,enqueuedLines,includeUpcoming=true){const blocked=gatedSkills(config,now);const upcoming=[];for(const sch of config.schedules??[]){if(!flag(sch,"enabled",true))continue;const nxt=nextWindowStart(sch,now,history);if(!nxt)continue;upcoming.push([nxt,sch])}
40
40
  upcoming.sort((a,b)=>a[0].getTime()-b[0].getTime());const out=["\u3010\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\uFF08scripts/ops-schedule.json\uFF09\u3011"];if(enqueuedLines.length>0){out.push("\u4ECA\u30B5\u30A4\u30AF\u30EB\u306E\u5B9A\u671F\u5B9F\u884C\u5206\u3068\u3057\u3066\u3001\u4EE5\u4E0B\u306F**\u30B9\u30AF\u30EA\u30D7\u30C8\u304C\u65E2\u306B\u30AD\u30E5\u30FC\u3078\u6295\u5165\u6E08\u307F**\u3067\u3059\u3002steps \u306B\u91CD\u8907\u3057\u3066\u542B\u3081\u306A\u3044\u3067\u304F\u3060\u3055\u3044\uFF08\u91CD\u8907\u3059\u308B\u3068\u30AD\u30E5\u30FC\u306B\u4E8C\u91CD\u767B\u9332\u3055\u308C\u307E\u3059\uFF09:");
41
41
  out.push(...enqueuedLines)}else{out.push("\u4ECA\u30B5\u30A4\u30AF\u30EB\u3067\u767A\u706B\u3057\u305F\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u3042\u308A\u307E\u305B\u3093\u3002")}if(blocked.length>0){out.push("");out.push("\u73FE\u5728\u6642\u523B\u306F\u4EE5\u4E0B\u306E\u30B9\u30AD\u30EB\u306E\u5B9F\u884C\u6642\u9593\u5E2F\u5916\u3067\u3059\u3002**steps \u306B\u542B\u3081\u306A\u3044\u3067\u304F\u3060\u3055\u3044**:");for(const[skill,reason]of blocked)out.push(`- ${skill} \u2014 ${reason}`)}if(includeUpcoming&&
42
- upcoming.length>0){out.push("");out.push("\u5B9A\u671F\u30BF\u30B9\u30AF\u306E\u6B21\u56DE\u767A\u706B\u4E88\u5B9A\uFF08\u53C2\u8003\u3002\u8A08\u753B\u306B\u542B\u3081\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\uFF09:");for(const[nxt,sch]of upcoming.slice(0,8)){const whenTxt=nxt.getTime()<=now.getTime()?"\u767A\u706B\u5F85\u3061\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u4EE5\u964D\u306B\u81EA\u52D5\u6295\u5165\uFF09":fmtMonthDayTime(nxt);out.push(`- ${whenTxt} ${sch.label||`/twp-${String(
43
- sch.skill)}`}\uFF08${describeWhen(sch)}\uFF09`)}}out.push("");out.push("\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u6642\u9593\u30D9\u30FC\u30B9\u3067\u30B9\u30AF\u30EA\u30D7\u30C8\u304C\u7BA1\u7406\u3057\u3066\u3044\u307E\u3059\u3002\u300C\u524D\u56DE\u5B9F\u884C\u304B\u3089\u6642\u9593\u304C\u7D4C\u3063\u305F\u304B\u300D\u3092\u63A8\u6E2C\u3057\u3066\u8A08\u753B\u306B\u5165\u308C\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002");return out.join("\n")}var ScheduleApi=class{constructor(api){this.api=api}api;async definitions(){const res=await this.api.request("GET","/schedules/definitions");if(!res.ok)return fetchError("\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5B9A\u7FA9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093",res);const body=res.json??{};const schedules=body["schedules"];if(!Array.isArray(schedules)){return{kind:"error",message:`\u5B9A\u7FA9\u306E\u5FDC\u7B54\u306B schedules \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.
42
+ upcoming.length>0){out.push("");out.push("\u5B9A\u671F\u30BF\u30B9\u30AF\u306E\u6B21\u56DE\u767A\u706B\u4E88\u5B9A\uFF08\u53C2\u8003\u3002\u8A08\u753B\u306B\u542B\u3081\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\uFF09:");for(const[nxt,sch]of upcoming.slice(0,8)){const whenTxt=nxt.getTime()<=now.getTime()?"\u767A\u706B\u5F85\u3061\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u4EE5\u964D\u306B\u81EA\u52D5\u6295\u5165\uFF09":fmtMonthDayTime(nxt);out.push(`- ${whenTxt} ${sch.label||skillCommand(String(
43
+ sch.skill))}\uFF08${describeWhen(sch)}\uFF09`)}}out.push("");out.push("\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u6642\u9593\u30D9\u30FC\u30B9\u3067\u30B9\u30AF\u30EA\u30D7\u30C8\u304C\u7BA1\u7406\u3057\u3066\u3044\u307E\u3059\u3002\u300C\u524D\u56DE\u5B9F\u884C\u304B\u3089\u6642\u9593\u304C\u7D4C\u3063\u305F\u304B\u300D\u3092\u63A8\u6E2C\u3057\u3066\u8A08\u753B\u306B\u5165\u308C\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002");return out.join("\n")}var ScheduleApi=class{constructor(api){this.api=api}api;async definitions(){const res=await this.api.request("GET","/schedules/definitions");if(!res.ok)return fetchError("\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5B9A\u7FA9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093",res);const body=res.json??{};const schedules=body["schedules"];if(!Array.isArray(schedules)){return{kind:"error",message:`\u5B9A\u7FA9\u306E\u5FDC\u7B54\u306B schedules \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.
44
44
  raw.slice(0,120)}\uFF09`,status:res.status}}const gates=Array.isArray(body["gates"])?body["gates"]:[];return{kind:"ok",config:{schedules,gates,max_per_cycle:body["max_per_cycle"],require_zero_statuses:parseRequireZeroStatuses(body["require_zero_statuses"]),warnings:Array.isArray(body["warnings"])?body["warnings"]:[]}}}async history(since){const suffix=since?`/schedules/history?since=${encodeURIComponent(since)}`:"/schedules/history";const res=await this.api.request("GET",suffix);if(!res.ok)return fetchError(
45
45
  "\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u306E\u5C65\u6B74\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093",res);const body=res.json??{};const rows=body["rows"];if(!Array.isArray(rows)){return{kind:"error",message:`\u5C65\u6B74\u306E\u5FDC\u7B54\u306B rows \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}\uFF09`,status:res.status}}if(body["truncated"]===true||body["reason"]==="history_truncated"){return{kind:"error",message:"\u5C65\u6B74\
46
46
  \u306E\u8D70\u67FB\u304C\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F\uFF08\u5224\u5B9A\u306B\u4F7F\u3048\u307E\u305B\u3093\uFF09",status:res.status}}const windowCounts={};const counts=body["window_counts"];if(counts&&typeof counts==="object"){for(const[k,v]of Object.entries(counts)){if(typeof v==="number"){if(Number.isInteger(v))windowCounts[k]=v}else if(/^-?\d+$/.test(String(v))){windowCounts[k]=Number(String(v))}}}const normalized=rows.map(r=>{const row=r??{};return{ts:str(row["ts"]),schedule_id:str(
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CRITERION_RE,checkCounts,checksOf,envelope,reasonsMap,reviewOf,withoutResult}from"./chunk-NQWTPHUO.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{WORKFLOWS_PATH}from"./chunk-ITRTFBV3.js";import{UUID_RE,isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,
3
+ import{CRITERION_RE,checkCounts,checksOf,envelope,reasonsMap,reviewOf,withoutResult}from"./chunk-GLKZ4ZZY.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{WORKFLOWS_PATH}from"./chunk-HNG6MF26.js";import{UUID_RE,isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,
4
4
  pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";var INSTANCES_PATH=`${WORKFLOWS_PATH}/instances`;var COMMENT_MAX_CHARS=2e3;var IN_FLIGHT=new Set(["pending","processing"]);var GET_USAGE="twp workflow ai-review get <\u7533\u8ACBID>";var UPDATE_USAGE="twp workflow ai-review-comment update <\u6307\u6458ID> --instance <\u7533\u8ACBID> (--text <\u672C\u6587> | --text-file <\u30D1\u30B9>)";var DELETE_USAGE="twp workflow ai-review-comment delete <\u6307\u6458ID> --instance <\u7533\u8ACBID> --yes";function instanceUuid(raw,usage,what){const id=raw?.trim()??
5
5
  "";if(id==="")throw new UsageError(`\u7533\u8ACBID \u3092${what}\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,usage);if(!UUID_RE.test(id))throw new UsageError(`\u7533\u8ACBID \u306F UUID \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${id}`,`${usage}
6
6
  \u7533\u8ACBID \u306F twp workflow approval pending \u306E id \u5217\u3067\u3059\u3002`);return id}function workflowReviewPath(instanceId){return`${INSTANCES_PATH}/${encodeURIComponent(instanceId)}/ai-review`}function reviewTarget(input){if(input.args.length>1)throw new UsageError(`\u4F59\u5206\u306A\u5F15\u6570\u304C\u3042\u308A\u307E\u3059: ${input.args.slice(1).join(" ")}`,GET_USAGE);return workflowReviewPath(instanceUuid(input.args[0],GET_USAGE,"\u4F4D\u7F6E\u5F15\u6570"))}function commentTarget(input,usage){
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{isoDate}from"./chunk-JJSBBWJ5.js";import{repeatedValues}from"./chunk-RX5HWI4L.js";import{LIST_PAGING_HELP,PAGE_NUMBER_LIST_FLAGS,PAGE_NUMBER_PAGING_HELP,STABLE_PAGE_ORDER,nonEmpty,pageNumberPaging,pageNumberQuery,pageRangeNotes}from"./chunk-MI6HVYR2.js";import{SALES_ESTIMATES_PATH,SALES_INVOICES_PATH,isExactNumericId,resolveNamed}from"./chunk-ITRTFBV3.js";import{withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{
3
+ import{isoDate}from"./chunk-JJSBBWJ5.js";import{LIST_PAGING_HELP,PAGE_NUMBER_LIST_FLAGS,PAGE_NUMBER_PAGING_HELP,STABLE_PAGE_ORDER,nonEmpty,pageNumberPaging,pageNumberQuery,pageRangeNotes}from"./chunk-MI6HVYR2.js";import{repeatedValues}from"./chunk-RX5HWI4L.js";import{SALES_ESTIMATES_PATH,SALES_INVOICES_PATH,isExactNumericId,resolveNamed}from"./chunk-HNG6MF26.js";import{withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{
4
4
  ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";var ESTIMATE_STATUSES={new:"\u4F5C\u6210\u4E2D",create_completed:"\u4F5C\u6210\u5B8C\u4E86",in_progress:"\u7533\u8ACB\u4E2D",approved:"\u627F\u8A8D\u6E08",submitted:"\u63D0\u793A\u6E08",rejected:"\u5DEE\u3057\u623B\u3057",deleted:"\u524A\u9664\u6E08"};var INVOICE_STATUSES={new:"\u4F5C\u6210\u4E2D",create_completed:"\u4F5C\u6210\u5B8C\u4E86",in_progress:"\u7533\u8ACB\u4E2D",approved:"\u627F\u8A8D\u6E08",rejected:"\u5DEE\u3057\u623B\u3057",submitted:"\u63D0\u793A\u6E08",manager_confirmation:"\u6848\u4EF6\u62C5\u5F53\u8005\
5
5
  _\u6848\u4EF6\u5185\u5BB9\u30FB\u91D1\u984D\u78BA\u8A8D",invoice_issued:"\u8ACB\u6C42\u66F8\u767A\u884C\u6E08",sent_to_client:"\u5148\u65B9\u9001\u4ED8\u6E08",archived:"\u4FDD\u7BA1\u6E08",deleted:"\u524A\u9664\u6E08",cancelled:"\u53D6\u6D88\uFF08\u7121\u52B9\uFF09",lost:"\u5931\u6CE8"};var ALLOCATION_STATUSES={unallocated:"\u672A\u56DE\u53CE",allocated:"\u56DE\u53CE\u6E08"};function statusRefs(table){return Object.entries(table).map(([code,name])=>({id:code,name,code}))}function statusHelp(table){
6
6
  return Object.entries(table).map(([code,name])=>`${code}\uFF08${name}\uFF09`).join(" / ")}function licenseForbidden(guidance){return body=>body?.error==="permission_denied"?guidance:void 0}function featureLicenseGuidance(feature){return`${feature}\u3092\u4F7F\u3046\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u30C6\u30CA\u30F3\u30C8\u304C${feature}\u3092\u5951\u7D04\u3057\u3066\u3044\u306A\u3044\u304B\u3001\u3042\u306A\u305F\u306E${feature}\u306E\u6A29\u9650\u304C\u300C\u306A\u3057\u300D\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{DEFAULT_INTERVAL_SEC}from"./chunk-2B7A3OY7.js";import{CHAIN_KEYS,reloadAiConfig}from"./chunk-AEJHDFXB.js";import{describeError}from"./chunk-AT432SCP.js";import{isPrivateProjectId}from"./chunk-GY7KI5E5.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import fs from"fs";import path from"path";var PROMPT_KEYS=["charter","charter_prefix","charter_suffix","plan_preamble","step_budget","non_interactive_note","safe_mode_note"];function parseServerSettings(res){const json=res.json;if(json===null||typeof json!=="object"||Array.isArray(json))return null;const top=json;const data=top["data"];const b=data!==null&&typeof data==="object"&&!Array.isArray(data)&&"revision"in data?data:top;const revision=b["revision"];if(typeof revision!=="number"||!Number.isInteger(revision)||revision<0)return null;
3
+ import{describeError}from"./chunk-SPZ3GBYC.js";import{DEFAULT_INTERVAL_SEC}from"./chunk-LJVAOWZI.js";import{CHAIN_KEYS,reloadAiConfig}from"./chunk-FABDZBDZ.js";import{isPrivateProjectId}from"./chunk-GY7KI5E5.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import fs from"fs";import path from"path";var PROMPT_KEYS=["charter","charter_prefix","charter_suffix","plan_preamble","step_budget","non_interactive_note","safe_mode_note"];function parseServerSettings(res){const json=res.json;if(json===null||typeof json!=="object"||Array.isArray(json))return null;const top=json;const data=top["data"];const b=data!==null&&typeof data==="object"&&!Array.isArray(data)&&"revision"in data?data:top;const revision=b["revision"];if(typeof revision!=="number"||!Number.isInteger(revision)||revision<0)return null;
4
4
  const rawAi=b["ai"];const ai=rawAi!==null&&typeof rawAi==="object"&&!Array.isArray(rawAi)?Object.fromEntries(Object.entries(rawAi).filter(([,v])=>v!==null&&v!==void 0)):{};const prompts={};const rawPrompts=b["prompts"];if(rawPrompts!==null&&typeof rawPrompts==="object"&&!Array.isArray(rawPrompts)){for(const key of PROMPT_KEYS){const v=rawPrompts[key];if(typeof v==="string")prompts[key]=v}}const rawLoop=b["loop"];const rawInterval=rawLoop!==null&&typeof rawLoop==="object"&&!Array.isArray(rawLoop)?
5
5
  rawLoop["interval_sec"]:void 0;const intervalSec=typeof rawInterval==="number"&&Number.isInteger(rawInterval)&&rawInterval>0?rawInterval:null;const rawOutcomes=b["outcomes"];const outcomeSkills=Array.isArray(rawOutcomes)?[...new Set(rawOutcomes.map(r=>r!==null&&typeof r==="object"?r["skill"]:void 0).filter(v=>typeof v==="string"&&v.trim()!==""))]:[];return{revision,ai,prompts,intervalSec,outcomeSkills}}function formatConfigHash(aiHash,revision,ai,charter){return`${aiHash};r=${revision};ai=${ai};\
6
6
  charter=${charter}`}function renderStepBudget(template,vars){return template.replaceAll("{timeout_min}",String(vars.timeoutMin)).replaceAll("{soft_min}",String(vars.softMin)).replaceAll("{wrap_up_min}",String(vars.wrapUpMin))}var LoopSettingsApplier=class{constructor(deps){this.deps=deps}deps;last=null;lastWarning="";lastAiWarning="";lastSummary="";serverAiApplied=false;lastSafeWarning="";lastInterval="";async apply(){const{config,log}=this.deps;const outcome=await this.fetch();const warning=outcome.
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{salesAdminForbidden}from"./chunk-XPPT3MUY.js";import{nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";var PATH="/api/v2/sales/receivables";var FORBIDDEN=salesAdminForbidden("\u58F2\u639B\u91D1\u6B8B\u9AD8\u3068\u7DE0\u3081");var CLOSING_LIST_MAX=36;var SUMMARY_LABELS=[["previous_balance","\u524D\u6708\u6B8B\u9AD8"],["current_debit","\u5F53\u6708\u501F\u65B9\uFF08\u5F53\u6708\u8ACB\u6C42\u984D\uFF09"],["current_credit","\u5F53\u6708\u8CB8\u65B9\uFF08\u5F53\u6708\u5165\u91D1\u5F15\u5F53\u984D\uFF09"],["current_balance","\u5F53\u6708\u6B8B\u9AD8"],["current_month_uncollected","\u2460 \u5F53\u6708\u8ACB\u6C42 \u672A\u56DE\u53CE"],
3
+ import{salesAdminForbidden}from"./chunk-P2DSHLHD.js";import{nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{withResolved}from"./chunk-PS5QFKHB.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";var PATH="/api/v2/sales/receivables";var FORBIDDEN=salesAdminForbidden("\u58F2\u639B\u91D1\u6B8B\u9AD8\u3068\u7DE0\u3081");var CLOSING_LIST_MAX=36;var SUMMARY_LABELS=[["previous_balance","\u524D\u6708\u6B8B\u9AD8"],["current_debit","\u5F53\u6708\u501F\u65B9\uFF08\u5F53\u6708\u8ACB\u6C42\u984D\uFF09"],["current_credit","\u5F53\u6708\u8CB8\u65B9\uFF08\u5F53\u6708\u5165\u91D1\u5F15\u5F53\u984D\uFF09"],["current_balance","\u5F53\u6708\u6B8B\u9AD8"],["current_month_uncollected","\u2460 \u5F53\u6708\u8ACB\u6C42 \u672A\u56DE\u53CE"],
4
4
  ["previous_uncollected","\u2461 \u524D\u6708\u4EE5\u524D \u672A\u5165\u91D1\u58F2\u639B\u91D1"],["advance_received","\u524D\u53D7\u91D1\uFF08\u7FCC\u6708\u4EE5\u964D\u8ACB\u6C42\u3078\u306E\u5165\u91D1\uFF09"],["future_invoice_total","\u2462 \u7FCC\u6708\u4EE5\u964D \u58F2\u639B\u91D1\uFF08\u8ACB\u6C42\u7DCF\u984D\u30FB\u53C2\u8003\uFF09"]];var ITEM_COLUMNS=["invoice_id","invoice_no","company_name","title","invoice_date","due_date","total","collected","uncollected"];var CLOSING_COLUMNS=["year_mo\
5
5
  nth","basis_date","closed_at","closed_by_name","has_variance"];function usageOf(op){return`twp receivable ${op} help`}function yen(value){return typeof value==="number"?`${value.toLocaleString("ja-JP")} \u5186`:"\uFF08\u4E0D\u660E\uFF09"}function text(value){return typeof value==="string"||typeof value==="number"?String(value):""}function yearMonthValue(raw,label){const value=raw.trim();if(!/^\d{4}-(0[1-9]|1[0-2])$/.test(value))throw new UsageError(`${label} \u306F YYYY-MM \u306E\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,
6
6
  "\u4F8B: 2026-09");return value}function previousYearMonth(yearMonth){const[y,m]=yearMonth.split("-").map(Number);return m===1?`${y-1}-12`:`${y}-${String(m-1).padStart(2,"0")}`}function envelope(body,what){if(!isRecord(body)||body["result"]!==true)throw new ApiResponseError(`${what}\u306E\u5FDC\u7B54\u306E\u5F62\u304C\u60F3\u5B9A\u3068\u9055\u3044\u307E\u3059\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return body}function withoutResult(body){return Object.