@tocca-systems/twp-cli 0.82.0 → 0.84.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 (47) hide show
  1. package/CHANGELOG.public.md +12 -0
  2. package/dist/{agent-loop-ZGHJGHFQ.js → agent-loop-E5XWZV3V.js} +1 -1
  3. package/dist/{ai-dispatch-DJ5JT5BE.js → ai-dispatch-PABSQGQA.js} +2 -2
  4. package/dist/{api-command-IKQCTKPH.js → api-command-PWAWH4NR.js} +2 -2
  5. package/dist/{app-W6EKFG6P.js → app-57NA4OFE.js} +3 -3
  6. package/dist/{auto-update-worker-OIVQGG34.js → auto-update-worker-Q4KASOTO.js} +1 -1
  7. package/dist/{chunk-5YJAT7HE.js → chunk-4FCPLEZN.js} +1 -1
  8. package/dist/{chunk-M6FZ62YR.js → chunk-4P6BO4NM.js} +21 -21
  9. package/dist/{chunk-22CRY6JR.js → chunk-AKQLBUYJ.js} +10 -9
  10. package/dist/{chunk-7KFX2TPV.js → chunk-AR4FQRII.js} +1 -1
  11. package/dist/{chunk-XMPHGOW4.js → chunk-CVX2YWHC.js} +21 -17
  12. package/dist/{chunk-LDBYJPRD.js → chunk-H6XS5AMQ.js} +5 -5
  13. package/dist/{chunk-QGJYT4NH.js → chunk-HR6DHK6N.js} +2 -2
  14. package/dist/{chunk-VON6ODNL.js → chunk-J5QOE2GM.js} +10 -3
  15. package/dist/{chunk-ZOOEH7ZE.js → chunk-MBPJV745.js} +1 -1
  16. package/dist/{chunk-XNYQH5JI.js → chunk-NWCW3ONW.js} +1 -1
  17. package/dist/{chunk-DRERU42W.js → chunk-O67RD5XL.js} +1 -1
  18. package/dist/{chunk-DELIIGWE.js → chunk-SQBPZREE.js} +7 -6
  19. package/dist/{chunk-JUJSF5ZG.js → chunk-UUN3IO3Z.js} +1 -1
  20. package/dist/{chunk-AK7CNRVB.js → chunk-VJ72Y4TG.js} +1 -1
  21. package/dist/{chunk-RCUI6WWU.js → chunk-Y24FMUYU.js} +1 -1
  22. package/dist/{chunk-YPULDSJ3.js → chunk-Z5NBJC77.js} +6 -6
  23. package/dist/{chunk-PO35MCYP.js → chunk-ZPSPSYDD.js} +1 -1
  24. package/dist/cli.js +9 -9
  25. package/dist/{commands-ZIRZVBH6.js → commands-7GDO4YEQ.js} +2 -2
  26. package/dist/{commands-D65LPET6.js → commands-SYSUH2RP.js} +78 -78
  27. package/dist/{contract-73RVPBYM.js → contract-5AU5B4NN.js} +1 -1
  28. package/dist/{estimate-NLKTWCYI.js → estimate-Z3ANB4WK.js} +1 -1
  29. package/dist/{invoice-BXSI6SMA.js → invoice-YVUMRHY2.js} +1 -1
  30. package/dist/{leave-W4GHXMSE.js → leave-NVOZB7VQ.js} +1 -1
  31. package/dist/{logout-guard-57LHDX6L.js → logout-guard-FCCJSF5V.js} +1 -1
  32. package/dist/{media-KWSFHGAQ.js → media-TDXLP4T6.js} +1 -1
  33. package/dist/{oneshot-R7BDYFEN.js → oneshot-GTOK2ZPQ.js} +2 -2
  34. package/dist/{plan-submit-4NT4OC7J.js → plan-submit-DQRUUZTK.js} +1 -1
  35. package/dist/{registry-QXXEYQZZ.js → registry-WXXPS55F.js} +1 -1
  36. package/dist/{render-4SBLHU4J.js → render-2QURVC5V.js} +1 -1
  37. package/dist/{run-SUYWHFJS.js → run-4KFKWIKY.js} +1 -1
  38. package/dist/{runner-command-SRPMAC5S.js → runner-command-FW3WJB42.js} +1 -1
  39. package/dist/{sales-ai-review-L5VW3DU3.js → sales-ai-review-KJICZNUR.js} +2 -2
  40. package/dist/{server-settings-OB7JF757.js → server-settings-GFWQ5ERV.js} +1 -1
  41. package/dist/{setup-FMSAHRGZ.js → setup-DW2H7BDN.js} +1 -1
  42. package/dist/{skill-check-CKLMW2AJ.js → skill-check-JBRUAUID.js} +1 -1
  43. package/dist/{skill-manage-command-UOWZCF6R.js → skill-manage-command-TFGMSCT4.js} +2 -2
  44. package/dist/{status-command-C42CVQ3Q.js → status-command-PXE4WVOV.js} +2 -2
  45. package/dist/{update-XUIOLVEL.js → update-6E4IPTUE.js} +1 -1
  46. package/dist/{workflow-4NC2C4TX.js → workflow-2FODUREO.js} +1 -1
  47. package/package.json +1 -1
@@ -11,6 +11,18 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.84.0
15
+
16
+ AIチェックの結果表示(`ai-review get`)で、`acknowledged` 列を `referenced_reason` 列に置き換えました。過去に承認された同じ観点の判断が参考として添えられている行が `true` になります(警告そのものは消えません)。
17
+
18
+ OpenAI のモデル(GPT-6 Astra / GPT-6.1 Sol / GPT-6 Luna)を `/model` で選べるようになりました(リレー側の提供開始後に一覧へ表示されます)。Claude から OpenAI のモデルへ切り替えるときは、確認のうえ新しい会話から始まります。
19
+
20
+ `--output json` で、項目名(キー)に含まれるトークンや `?token=…` が伏字にならずに表示されることがあった問題を修正しました。また、`\` を含む秘密の値が途中までしか伏字にならないことがあった問題を修正しました。
21
+
22
+ ## 0.83.0
23
+
24
+ ループの「本番反映」系スキルに対する特別な後処理が、スキルの名前ではなく設定(`operations.release_hooks`)で有効になるようになりました。設定していない環境では、どのスキル名でも特別扱いされません。
25
+
14
26
  ## 0.82.0
15
27
 
16
28
  対応するリレーと組み合わせると、`/model` で Gemini のモデル(例: `gemini-3-pro`・`gemini-3.7-flash`)を選んで対話・`-p` で使えるようになりました(ファイルの読み書き等のツール実行を含みます)。Gemini のモデルへ切り替えるときは、新しい会話から始まります。
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{stepToItem}from"./chunk-QGJYT4NH.js";import"./chunk-JUJSF5ZG.js";import{loadLocalConfig}from"./chunk-RCUI6WWU.js";import{parseOperations}from"./chunk-XMPHGOW4.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import{loadAiConfig}from"./chunk-FABDZBDZ.js";import{SKILL_PREFIX_RE,setSkillPrefix}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-LDBYJPRD.js";import{PRIVATE_PROJECT_PREFIX,
3
+ import{stepToItem}from"./chunk-HR6DHK6N.js";import"./chunk-UUN3IO3Z.js";import{loadLocalConfig}from"./chunk-Y24FMUYU.js";import{parseOperations}from"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import{loadAiConfig}from"./chunk-FABDZBDZ.js";import{SKILL_PREFIX_RE,setSkillPrefix}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-H6XS5AMQ.js";import{PRIVATE_PROJECT_PREFIX,
4
4
  PRIVATE_PROJECT_REF,isPrivateProjectRef}from"./chunk-RMFLTSOV.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";
5
5
  import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30EB\u30FC\u30D7\u306E\u30A2\u30A4\u30C6\u30E0";var STATUSES=["pending","processing","completed","failed"];var AI_TYPES=["claude","gemini","codex","copilot"];var EFFORTS=["low","medium","high","xhigh","max"];var PRIORITIES=["P0","P1","P2","P3"];var LIST_COLUMNS=["item_id","status","task_key","label","ai_type","ai_effort","runner_id","created_at"];var GET_COLUMNS=["item_id","status","task_key","label","prompt","ai_type","ai_model","ai_effort","runn\
6
6
  er_id","attempt_count","reclaim_count","error_message","created_by_name","created_at","started_at","completed_at"];var HISTORY_COLUMNS=["item_id","status","task_key","skill","ai_type","runner_id","duration_ms","cost_usd","created_at"];var PLAN_RESULTS=["enqueued","empty","json_not_found","ai_failed","error","skipped","gated","locked","abandoned"];var PLAN_HISTORY_COLUMNS=["plan_run_id","result","runner_id","ai_type","duration_ms","cost_usd","step_count","started_at"];var PROJECT_FLAG={name:"--pr\
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-QGRBZ2C2.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-JUJSF5ZG.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
- detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-LDBYJPRD.js";import"./chunk-RMFLTSOV.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-MBPJV745.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-QGRBZ2C2.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-UUN3IO3Z.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
+ detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-H6XS5AMQ.js";import"./chunk-RMFLTSOV.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";
5
5
  import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var DEFAULT_AI_TIMING={abortGraceMs:5e3,abortReapMs:2e3,pollIntervalMs:5e3};function resolveTiming(over){return{abortGraceMs:over?.abortGraceMs??DEFAULT_AI_TIMING.abortGraceMs,abortReapMs:over?.abortReapMs??DEFAULT_AI_TIMING.abortReapMs,pollIntervalMs:over?.pollIntervalMs??DEFAULT_AI_TIMING.pollIntervalMs}}var MAX_RETAINED_BYTES=4*1024*1024;function closeStream(stream){return new Promise(resolve=>{if(stream===null)return resolve();stream.once("error",()=>resolve());stream.end(()=>resolve())})}function buildArgs(req,cfg,env,workspace){
6
6
  const warnings=[];const requested=(req.model??"").trim();const usable=requested!==""&&isUsableModelId(requested);if(requested!==""&&!usable){warnings.push(`ai_model '${requested}' \u306F\u4F7F\u3048\u306A\u3044\u5F62\u3067\u3059 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fitsRoute=!usable||!isClaudeAi(req.ai)||modelFitsRoute(requested,env);if(usable&&!fitsRoute){warnings.push(`ai_model '${requested}' \u306F\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08\u3053\u306E\u6A5F\u4F53\u306F ${usesBedrock(
7
7
  env)?"Bedrock":"Anthropic \u76F4"}\uFF09 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fallback=cfg.modelFor(req.ai,req.category,env);const safeFallback=fallback===""||!isClaudeAi(req.ai)||modelFitsRoute(fallback,env)?fallback:"";if(fallback!==""&&safeFallback===""){warnings.push(`CLAUDE_MODEL '${fallback}' \u3082\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093 \u2192 \u30E2\u30C7\u30EB\u3092\u6307\u5B9A\u3057\u307E\u305B\u3093`)}
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-AK7CNRVB.js";import"./chunk-YPULDSJ3.js";import{renderOutput}from"./chunk-PO35MCYP.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";
4
- import{redactSecretValues,redactSecrets,withDebug}from"./chunk-LDBYJPRD.js";import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-6LSQCOCJ.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,
3
+ import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-VJ72Y4TG.js";import"./chunk-Z5NBJC77.js";import{renderOutput}from"./chunk-ZPSPSYDD.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";
4
+ import{redactSecretValues,redactSecrets,withDebug}from"./chunk-H6XS5AMQ.js";import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-6LSQCOCJ.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,
5
5
  readPageNumberCursor,shellQuote}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import{ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-VFPY2A23.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-EDF4U5BT.js";
6
6
  import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-MLRBDF44.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
7
7
  test(segment)?null:segment)})}parsedCache.set(routes,parsed);return parsed}function matches(route,segments){if(route.segments.length!==segments.length)return false;return route.segments.every((literal,i)=>literal===null||literal===segments[i])}function compareSpecificity(a,b){const literals=route=>route.segments.filter(segment=>segment!==null).length;const diff=literals(b)-literals(a);if(diff!==0)return diff;for(let i=0;i<a.segments.length;i+=1){const aLiteral=a.segments[i]!==null;const bLiteral=b.
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-DRERU42W.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
- diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-LDBYJPRD.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,classifyModelSwitch,createRuntime,loadCachedCatalog,modelLabel,pickModel,specFor,toModelInfos}from"./chunk-VON6ODNL.js";
3
+ import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-O67RD5XL.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
+ diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-N2UVRM3Z.js";import"./chunk-H6XS5AMQ.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,classifyModelSwitch,createRuntime,loadCachedCatalog,modelLabel,pickModel,specFor,toModelInfos}from"./chunk-J5QOE2GM.js";
5
5
  import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-IVFSEXD3.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,
6
6
  nextMode}from"./chunk-2LOT54OO.js";import"./chunk-MLRBDF44.js";import"./chunk-VERYHAWV.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
7
7
  for("react.forward_ref");var REACT_SUSPENSE_TYPE=Symbol.for("react.suspense");var REACT_MEMO_TYPE=Symbol.for("react.memo");var REACT_LAZY_TYPE=Symbol.for("react.lazy");var REACT_ACTIVITY_TYPE=Symbol.for("react.activity");var REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition");var MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){if(null===maybeIterable||"object"!==typeof maybeIterable)return null;maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||
@@ -1212,7 +1212,7 @@ cwd()){const listed=await gitListFiles(cwd2);const raw=listed??await walkFiles(c
1212
1212
  1;const after=/^[^\s]*/.exec(text.slice(cursor))?.[0]??"";return{query,start,end:cursor+after.length}}var TWP_SLASH_ROUTES={"/tasks":{domain:"task",operation:"list"},"/task":{domain:"task",operation:"get"},"/projects":{domain:"project",operation:"list"}};function isTwpSlashCommand(name){return Object.hasOwn(TWP_SLASH_ROUTES,name)}async function runTwpSlashCommand(name,args,deps){const route=TWP_SLASH_ROUTES[name];if(!Object.hasOwn(TWP_SLASH_ROUTES,name)||route===void 0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}
1213
1213
  `}}const parsed=parseArgv([route.domain,route.operation,...args]);if(parsed.command!=="domain"||parsed.domain!==route.domain){return{code:2,out:"",err:`${name}: \u3053\u306E\u5F15\u6570\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF08${args.join(" ")}\uFF09
1214
1214
  `}}if(parsed.unknown.length>0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u5F15\u6570: ${parsed.unknown.join(" ")}
1215
- `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-SUYWHFJS.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1215
+ `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-4KFKWIKY.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1216
1216
  {},argv:parsed.domainArgv,help:parsed.domainHelp,globals,version:deps.version,io,...deps.fetchImpl!==void 0?{fetchImpl:deps.fetchImpl}:{}});return{code,out,err}}catch(e){return{code:1,out,err:`${err}${e.message}
1217
1217
  `}}}var GIT_LOG_OUTPUT=["9f3c1a2 feat(ui): \u4E00\u89A7\u306E\u30D5\u30A3\u30EB\u30BF\u3092 URL \u30AF\u30A8\u30EA\u3068\u540C\u671F\u3059\u308B","4b8e0d7 fix(ui): \u4EEE\u60F3\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u884C\u9AD8\u3055\u3092\u5B9F\u6E2C\u5024\u306B\u5408\u308F\u305B\u308B","c15a99e refactor(api): \u4E00\u89A7\u53D6\u5F97\u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u51E6\u7406\u3092\u5171\u901A\u5316\u3059\u308B","2d70f4b test: \u4E00\u89A7\u30D5\u30A3\u30EB\u30BF\u306E\u56DE\u5E30\u30C6\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
1218
1218
  "a6e2b38 fix(api): \u7A7A\u306E\u691C\u7D22\u6761\u4EF6\u3067\u5168\u4EF6\u8FD4\u3089\u306A\u3044\u3088\u3046\u306B\u3059\u308B","7c40d51 chore(deps): \u958B\u767A\u4F9D\u5B58\u3092\u6700\u65B0\u3078\u66F4\u65B0\u3059\u308B","e83b1c6 docs: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u624B\u9806\u306B Node 22 \u306E\u524D\u63D0\u3092\u8FFD\u8A18\u3059\u308B","b91f7a4 fix(ui): \u30E2\u30FC\u30C0\u30EB\u306E\u91CD\u306A\u308A\u9806\u3092\u6307\u5B9A\u3059\u308B","5a2c8e0 perf(api): \u4E00\u89A7\u306E N+1 \u3092\u89E3\u6D88\u3059\u308B",
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-7KFX2TPV.js";import"./chunk-VON6ODNL.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-CH6QU76P.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";
3
+ import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-AR4FQRII.js";import"./chunk-J5QOE2GM.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-CH6QU76P.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";
4
4
  import"./chunk-5WGOHFAS.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{execFile}from"child_process";import fs from"fs";import path from"path";var PARENT_WAIT_MAX_MS=12*60*60*1e3;var PARENT_POLL_MS=1e3;var LOCK_STALE_MS=PARENT_WAIT_MAX_MS+60*60*1e3;var INSTALL_TIMEOUT_MS=0;function childEnv(env){const next={...env};delete next[WORKER_ENV];delete next[PARENT_PID_ENV];return next}function createNpmRunner(env=process.env){const cmd=resolveNpmCommand({env});if(cmd===null)return null;return(args,timeoutMs)=>new Promise(resolve=>{execFile(cmd.file,[...cmd.prefix,...args],{timeout:timeoutMs,windowsHide:true,maxBuffer:8*1024*1024,cwd:path.dirname(lockFilePath(env)),env:childEnv(env)},(error,stdout,stderr)=>{if(error===null){resolve({ok:true,stdout:String(stdout),stderr:String(
5
5
  stderr)});return}const e=error;resolve({ok:false,stdout:String(stdout??""),stderr:String(stderr??""),...e.killed?{error:"\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F"}:typeof e.code==="string"?{error:e.code}:{}})})})}function summarizeNpmFailure(result){const text=`${result.stderr}
6
6
  ${result.stdout}`;const code=/npm (?:ERR!|error) code (\S+)/.exec(text)?.[1]??result.error;let reason;if(code==="EACCES"||code==="EPERM"){reason=`\u30B0\u30ED\u30FC\u30D0\u30EB\u306E\u5C0E\u5165\u5148\u306B\u66F8\u304D\u8FBC\u3080\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${code}\uFF09`}else if(code!==void 0&&/^(ENOTFOUND|ETIMEDOUT|ECONNREFUSED|ECONNRESET|EAI_AGAIN|ENETUNREACH)$/.test(code)){reason=`npm registry \u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${code}\
@@ -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-RCUI6WWU.js";import{CHAIN_KEYS,reloadAiConfig}from"./chunk-FABDZBDZ.js";import{describeError}from"./chunk-O52RKZCC.js";import{isPrivateProjectId}from"./chunk-RMFLTSOV.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{DEFAULT_INTERVAL_SEC}from"./chunk-Y24FMUYU.js";import{CHAIN_KEYS,reloadAiConfig}from"./chunk-FABDZBDZ.js";import{describeError}from"./chunk-O52RKZCC.js";import{isPrivateProjectId}from"./chunk-RMFLTSOV.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{placeholderTaskKey,stepToItem}from"./chunk-QGJYT4NH.js";import{redactLoopOutput}from"./chunk-JUJSF5ZG.js";import{localDate}from"./chunk-RCUI6WWU.js";import{normalizeSkillName,skillOfItem}from"./chunk-FABDZBDZ.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE,setSkillPrefix,skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{describeError,pick,pickString}from"./chunk-O52RKZCC.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.
3
+ import{placeholderTaskKey,stepToItem}from"./chunk-HR6DHK6N.js";import{redactLoopOutput}from"./chunk-UUN3IO3Z.js";import{localDate}from"./chunk-Y24FMUYU.js";import{normalizeSkillName,skillOfItem}from"./chunk-FABDZBDZ.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE,setSkillPrefix,skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{describeError,pick,pickString}from"./chunk-O52RKZCC.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
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
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(redactItemBody(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 redactItemBody(body){const out={...body};for(const key of["prompt","label"]){if(typeof out[key]==="string")
6
6
  out[key]=redactLoopOutput(out[key])}return out}function reorderSucceeded(targetId,json){if(pick(json,"result")===true)return true;const raw=Array.isArray(json)?json:pick(json,"items");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){
@@ -8,18 +8,18 @@ const re=new RegExp(`${key.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![0-9])`);ret
8
8
  ${it.prompt??""}
9
9
  ${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(
10
10
  /[\t\n]/g," ").slice(0,200);const line=`${localTimestamp()} ${result} ${phase||"unknown"} ${ai||"unknown"} ${clean}
11
- `;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)];
12
- 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_.:-]+)/.
13
- 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;
14
- 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");
15
- 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`);
16
- 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:\
17
- \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`)}
18
- 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||
19
- "?"} \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(
20
- "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}\
21
- \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){
22
- 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");
11
+ `;try{fs.mkdirSync(path.dirname(this.file),{recursive:true});fs.appendFileSync(this.file,line)}catch{}}};function parseReleaseResult(logText,contractLine){const prefix=contractLine.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");const matches=[...logText.matchAll(new RegExp(`${prefix}:[^|\\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]??"",
12
+ line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];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(
13
+ key)&&key.trim()===key?key:null}catch{return null}}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.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)
14
+ return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;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){
15
+ 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");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");
16
+ 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`);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}\
17
+ \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: \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(` \
18
+ \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`)}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\
19
+ \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||"?"} \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(
20
+ 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("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}`);
21
+ 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} \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`)}}
22
+ function queueContainsSkill(items,skillCommand2){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");
23
23
  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");
24
24
  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(
25
25
  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}\
@@ -34,14 +34,14 @@ e_rerun.${slug}`,today,config.releaseRerunMaxPerCause);if(!res.ok){if(res.status
34
34
  \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\
35
35
  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.
36
36
  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}\
37
- \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,
38
- 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\
39
- \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}\
40
- /${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\
41
- \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.
42
- 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\
43
- \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`,
44
- 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}`);
37
+ \u30FB${attempt}/${config.releaseRerunMaxPerCause}\u56DE\u76EE\uFF09 #ai:complex`,prompt:`${recoverySkill} ${rerunArgs(cause,attempt,config.releaseRerunMaxPerCause,releaseLine,config.operations.releaseHooks?.line??null)}`,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}`);
38
+ await escalatePartialMerge(deps,cause,attempt,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{
39
+ log.log(" \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\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 causeCounterSlug(cause){return cause.replace(/[^A-Za-z0-9_-]/g,"_")}function rerunArgs(cause,attempt,max,releaseLine,contractLine){return`\u90E8\u5206\u30DE\u30FC\u30B8\u89E3\u6D88\u306E\u81EA\u52D5\u518D\u5B9F\u884C\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\
40
+ \u30FB\u672C\u65E5${attempt}/${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\
41
+ \u3063\u305F/\u5165\u3063\u3066\u3044\u306A\u3044\u300D\u3092\u78BA\u8A8D\u3057\u3001\u901A\u5E38\u306E Phase 1 \u304B\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 ${contractLine??"\u7D50\u679C\u884C"} \u306E\u7406\u7531\u6B04\u306B\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}
42
+ async function escalatePartialMerge(deps,cause,count,releaseLine,reason,createDetail=""){const{api,config,log}=deps;const today=localDate(config.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`);
43
+ return}if(delivered===null){log.log(" \u26A0\uFE0F \u5F15\u304D\u6E21\u3057\u6E08\u307F\u304B\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}\
44
+ \u30FB${ESCALATION_SUBJECT[reason]}\uFF09\u2014 \u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057 #ai:complex`,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}`);
45
45
  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`)}
46
46
  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\
47
47
  \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.
@@ -1,18 +1,18 @@
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-DELIIGWE.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{WORKFLOWS_PATH}from"./chunk-RSSPNFSK.js";import{UUID_RE,isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,isRecord,
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()??
3
+ import{CRITERION_RE,checkCounts,checksOf,envelope,hasReferencedReason,reasonsMap,reviewOf,withoutResult}from"./chunk-SQBPZREE.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{WORKFLOWS_PATH}from"./chunk-RSSPNFSK.js";import{UUID_RE,isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,
4
+ isRecord,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){
7
7
  if(input.args.length>1)throw new UsageError(`\u4F59\u5206\u306A\u5F15\u6570\u304C\u3042\u308A\u307E\u3059: ${input.args.slice(1).join(" ")}\uFF08\u7533\u8ACB\u306F --instance \u3067\u6E21\u3057\u307E\u3059\uFF09`,usage);const criterion=input.args[0]?.trim()??"";if(criterion==="")throw new UsageError("\u6307\u6458\u306E ID\uFF08criterion_id\uFF09\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",`${usage}
8
8
  twp workflow ai-review get <\u7533\u8ACBID> \u306E criterion_id \u5217\u306E\u5024\u3067\u3059\u3002`);if(!CRITERION_RE.test(criterion)||/^\.+$/.test(criterion)){throw new UsageError(`\u6307\u6458\u306E ID \u306F\u82F1\u6570\u5B57\u3068 _ . : - \u3060\u3051\u30FB128 \u6587\u5B57\u307E\u3067\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${criterion}`,usage)}const reviewPath=workflowReviewPath(instanceUuid(input.flags.get("--instance"),usage," --instance "));return{reviewPath,commentPath:`${reviewPath}\
9
- /reasons/${encodeURIComponent(criterion)}/approver-comment`,criterion}}var WHAT="\u7533\u8ACB\u306EAI\u30C1\u30A7\u30C3\u30AF";var CHECK_COLUMNS=["criterion_id","label","severity","acknowledged","reason_judgment","reason","approver_comment","message"];function checkRows(body){const data=envelope(body,WHAT);const reasons=reasonsMap(data);return checksOf(reviewOf(data,WHAT)).map(check=>{const criterion=typeof check["criterion_id"]==="string"?check["criterion_id"]:null;const reason=criterion!==null?
10
- reasons[criterion]:void 0;const field=key=>isRecord(reason)?reason[key]??null:null;return{...pick(check,["criterion_id","label","severity"]),acknowledged:check["acknowledged"]===true,reason_judgment:field("judgment"),reason:field("reason"),approver_comment:field("approver_comment"),message:check["message"]??null}})}function reviewRaw(body){const data=envelope(body,WHAT);reviewOf(data,WHAT);return withoutResult(data)}function getNotes(body){const data=envelope(body,WHAT);const review=reviewOf(data,
11
- WHAT);const notes=[];if(review===null){notes.push("\u3053\u306E\u7533\u8ACB\u306B\u306F AI\u30C1\u30A7\u30C3\u30AF\u306E\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5BFE\u8C61\u306F\u53D6\u5F15\uFF1D\u898B\u7A4D\u30FB\u8ACB\u6C42\u30FB\u53D6\u5F15\u5951\u7D04\u306E\u627F\u8A8D\u7533\u8ACB\u3060\u3051\u3067\u3001\u63D0\u51FA\u6642\u306B\u975E\u540C\u671F\u3067\u4F5C\u3089\u308C\u307E\u3059\uFF09")}else{const status=String(review["status"]);if(IN_FLIGHT.has(status))notes.push(`\u751F\u6210\u4E2D\u3067\u3059\uFF08sta\
12
- tus=${status}\uFF09\u3002\u6642\u9593\u3092\u7F6E\u3044\u3066\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044`);if(status==="failed")notes.push("\u751F\u6210\u306B\u5931\u6557\u3057\u3066\u3044\u307E\u3059\uFF08status=failed\uFF09\u3002\u627F\u8A8D\u753B\u9762\u306B\u3082\u7D50\u679C\u306F\u51FA\u307E\u305B\u3093");if(status==="completed"){if(typeof review["summary"]==="string"&&review["summary"]!=="")notes.push(`\u8981\u7D04: ${review["summary"]}`);const overall=isRecord(
13
- review["overall"])?review["overall"]:void 0;if(overall!==void 0&&typeof overall["verdict_label"]==="string"){const message=typeof overall["message"]==="string"&&overall["message"]!==""?`\uFF08${overall["message"]}\uFF09`:"";notes.push(`\u7DCF\u5408\u6240\u898B: ${overall["verdict_label"]}${message}`);const recommendations=Array.isArray(overall["recommendations"])?overall["recommendations"]:[];for(const item of recommendations)if(typeof item==="string")notes.push(` \u78BA\u8A8D\u3092\u63A8\u5968\u3059\u308B\u70B9: ${item}`)}
14
- notes.push(`${checkCounts(review)}\u3002\u751F\u6210\u65E5\u6642 ${String(review["generated_at"]??"\u4E0D\u660E")}`)}}const reasons=Object.values(reasonsMap(data)).filter(isRecord);if(reasons.length>0){const commented=reasons.filter(reason=>typeof reason["approver_comment"]==="string"&&reason["approver_comment"]!=="").length;notes.push(`\u7533\u8ACB\u8005\u306E\u7406\u7531 ${String(reasons.length)} \u4EF6\uFF08\u3046\u3061\u627F\u8A8D\u8005\u30B3\u30E1\u30F3\u30C8\u3042\u308A ${String(commented)}\
15
- \u4EF6\uFF09`)}notes.push("\u6307\u6458\u306E\u672C\u6587\u30FB\u5185\u8A33\uFF08details\uFF09\u30FB\u7406\u7531\u306E\u5168\u6587\u306F --output json \u3067\u51FA\u307E\u3059");return notes}var SUMMARY_CONCURRENCY=4;var NO_SUMMARY={ai_warnings:null,ai_severity:null,ai_verdict:null};function reviewSummary(body){const review=reviewOf(envelope(body,WHAT),WHAT);if(review===null)return{ai_review:"none",...NO_SUMMARY};const status=String(review["status"]);if(status!=="completed")return{ai_review:status,
9
+ /reasons/${encodeURIComponent(criterion)}/approver-comment`,criterion}}var WHAT="\u7533\u8ACB\u306EAI\u30C1\u30A7\u30C3\u30AF";var CHECK_COLUMNS=["criterion_id","label","severity","referenced_reason","reason_judgment","reason","approver_comment","message"];function checkRows(body){const data=envelope(body,WHAT);const reasons=reasonsMap(data);return checksOf(reviewOf(data,WHAT)).map(check=>{const criterion=typeof check["criterion_id"]==="string"?check["criterion_id"]:null;const reason=criterion!==
10
+ null?reasons[criterion]:void 0;const field=key=>isRecord(reason)?reason[key]??null:null;return{...pick(check,["criterion_id","label","severity"]),referenced_reason:hasReferencedReason(check),reason_judgment:field("judgment"),reason:field("reason"),approver_comment:field("approver_comment"),message:check["message"]??null}})}function reviewRaw(body){const data=envelope(body,WHAT);reviewOf(data,WHAT);return withoutResult(data)}function getNotes(body){const data=envelope(body,WHAT);const review=reviewOf(
11
+ data,WHAT);const notes=[];if(review===null){notes.push("\u3053\u306E\u7533\u8ACB\u306B\u306F AI\u30C1\u30A7\u30C3\u30AF\u306E\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5BFE\u8C61\u306F\u53D6\u5F15\uFF1D\u898B\u7A4D\u30FB\u8ACB\u6C42\u30FB\u53D6\u5F15\u5951\u7D04\u306E\u627F\u8A8D\u7533\u8ACB\u3060\u3051\u3067\u3001\u63D0\u51FA\u6642\u306B\u975E\u540C\u671F\u3067\u4F5C\u3089\u308C\u307E\u3059\uFF09")}else{const status=String(review["status"]);if(IN_FLIGHT.has(status))notes.push(`\u751F\u6210\u4E2D\u3067\
12
+ \u3059\uFF08status=${status}\uFF09\u3002\u6642\u9593\u3092\u7F6E\u3044\u3066\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3067\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044`);if(status==="failed")notes.push("\u751F\u6210\u306B\u5931\u6557\u3057\u3066\u3044\u307E\u3059\uFF08status=failed\uFF09\u3002\u627F\u8A8D\u753B\u9762\u306B\u3082\u7D50\u679C\u306F\u51FA\u307E\u305B\u3093");if(status==="completed"){if(typeof review["summary"]==="string"&&review["summary"]!=="")notes.push(`\u8981\u7D04: ${review["su\
13
+ mmary"]}`);const overall=isRecord(review["overall"])?review["overall"]:void 0;if(overall!==void 0&&typeof overall["verdict_label"]==="string"){const message=typeof overall["message"]==="string"&&overall["message"]!==""?`\uFF08${overall["message"]}\uFF09`:"";notes.push(`\u7DCF\u5408\u6240\u898B: ${overall["verdict_label"]}${message}`);const recommendations=Array.isArray(overall["recommendations"])?overall["recommendations"]:[];for(const item of recommendations)if(typeof item==="string")notes.push(
14
+ ` \u78BA\u8A8D\u3092\u63A8\u5968\u3059\u308B\u70B9: ${item}`)}notes.push(`${checkCounts(review)}\u3002\u751F\u6210\u65E5\u6642 ${String(review["generated_at"]??"\u4E0D\u660E")}`)}}const reasons=Object.values(reasonsMap(data)).filter(isRecord);if(reasons.length>0){const commented=reasons.filter(reason=>typeof reason["approver_comment"]==="string"&&reason["approver_comment"]!=="").length;notes.push(`\u7533\u8ACB\u8005\u306E\u7406\u7531 ${String(reasons.length)} \u4EF6\uFF08\u3046\u3061\u627F\u8A8D\u8005\u30B3\u30E1\u30F3\u30C8\u3042\u308A ${String(
15
+ commented)} \u4EF6\uFF09`)}notes.push("\u6307\u6458\u306E\u672C\u6587\u30FB\u5185\u8A33\uFF08details\uFF09\u30FB\u7406\u7531\u306E\u5168\u6587\u306F --output json \u3067\u51FA\u307E\u3059");return notes}var SUMMARY_CONCURRENCY=4;var NO_SUMMARY={ai_warnings:null,ai_severity:null,ai_verdict:null};function reviewSummary(body){const review=reviewOf(envelope(body,WHAT),WHAT);if(review===null)return{ai_review:"none",...NO_SUMMARY};const status=String(review["status"]);if(status!=="completed")return{ai_review:status,
16
16
  ...NO_SUMMARY};const checks=checksOf(review);const warnings=checks.filter(check=>check["severity"]==="warning").length;const overall=isRecord(review["overall"])?review["overall"]:void 0;return{ai_review:status,ai_warnings:warnings,ai_severity:warnings>0?"warning":checks.length>0?"ok":null,ai_verdict:typeof overall?.["verdict"]==="string"?overall["verdict"]:null}}async function withReviewSummaries(rows,ctx){const out=[...rows];let failed=0;let next=0;const worker=async()=>{for(;;){const index=next++;
17
17
  if(index>=rows.length)return;const row=rows[index];const id=isRecord(row)&&typeof row["id"]==="string"?row["id"]:void 0;if(!isRecord(row)||id===void 0||!UUID_RE.test(id)){failed+=1;out[index]=isRecord(row)?{...row,ai_review:"unavailable",...NO_SUMMARY}:row;continue}try{out[index]={...row,...reviewSummary(await ctx.send({method:"GET",path:workflowReviewPath(id)}))}}catch{failed+=1;out[index]={...row,ai_review:"unavailable",...NO_SUMMARY}}}};await Promise.all(Array.from({length:Math.min(SUMMARY_CONCURRENCY,
18
18
  rows.length)},worker));if(failed>0)ctx.warn(`${String(failed)} \u4EF6\u306E\u7533\u8ACB\u3067 AI\u30C1\u30A7\u30C3\u30AF\u306E\u7D50\u679C\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08ai_review=unavailable\uFF09\u3002twp workflow ai-review get <\u7533\u8ACBID> \u3067\u500B\u5225\u306B\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\u3002`);return out}var INSTANCE_FLAG={name:"--instance",summary:"\u7533\u8ACBID\uFF08UUID\u30FB\u5FC5\u9808\u3002twp workflow approval pending \u306E id \u5217\uFF09",
@@ -25,6 +25,7 @@ usage:GET_USAGE,description:`GET /api/v2/workflows/instances/{id}/ai-review\u300
25
25
  \u5BFE\u8C61\u306F\u53D6\u5F15\uFF08\u898B\u7A4D\u30FB\u8ACB\u6C42\u30FB\u53D6\u5F15\u5951\u7D04\uFF09\u306E\u627F\u8A8D\u7533\u8ACB\u3067\u3001\u63D0\u51FA\u6642\u306B\u4F5C\u3089\u308C\u307E\u3059\u3002\u305D\u308C\u4EE5\u5916\u306E\u7533\u8ACB\u3067\u306F\u7D50\u679C\u304C\u7A7A\u3067\u3059\uFF08\u30A8\u30E9\u30FC\u306B\u306F\u306A\u308A\u307E\u305B\u3093\uFF09\u3002
26
26
  --output table / text / tsv \u306F\u78BA\u8A8D\u3057\u305F\u89B3\u70B91\u4EF6\uFF1D1\u884C\uFF08${CHECK_COLUMNS.join(" / ")}\uFF09\u3067\u3001severity \u304C warning \u306E\u884C\u304C\u6307\u6458\u3067\u3059\u3002
27
27
  reason_judgment / reason \u306F\u7533\u8ACB\u8005\u304C\u6DFB\u3048\u305F\u7406\u7531\u3001approver_comment \u306F\u627F\u8A8D\u8005\u306E\u8FFD\u8A18\u3067\u3059\u3002
28
+ referenced_reason \u306F\u540C\u3058\u53D6\u5F15\u5148\u3067\u904E\u53BB\u306B\u627F\u8A8D\u3055\u308C\u305F\u540C\u3058\u89B3\u70B9\u306E\u5224\u65AD\u304C\u53C2\u8003\u3068\u3057\u3066\u6DFB\u3048\u3089\u308C\u3066\u3044\u308B\u304B\uFF08true/false\uFF09\u3067\u3059\u3002\u8B66\u544A\u306F\u6D88\u3048\u307E\u305B\u3093\u3002
28
29
  \u627F\u8A8D\u8005\u30B3\u30E1\u30F3\u30C8\u3092\u66F8\u304F\u306E\u306F twp workflow ai-review-comment update <criterion_id> --instance <\u7533\u8ACBID> \u3067\u3059\u3002
29
30
  \u7533\u8ACB\u8005\u304C\u81EA\u5206\u3067\u5B9F\u884C\u3059\u308B\u7533\u8ACB\u524D\u30C1\u30A7\u30C3\u30AF\uFF08twp estimate ai-review \u7B49\uFF09\u3068\u306F\u5225\u306E\u7D50\u679C\u3067\u3059\u3002`,flags:[],forbidden:FORBIDDEN_VIEW,plan:input=>({method:"GET",path:reviewTarget(input)}),summarize:checkRows,raw:reviewRaw,notes:getNotes}]},{name:"ai-review-comment",summary:"\u7533\u8ACB\u306EAI\u30C1\u30A7\u30C3\u30AF\u306E\u6307\u6458\u306B\u627F\u8A8D\u8005\u306E\u78BA\u8A8D\u7D50\u679C\u3092\u8FFD\u8A18\u3059\u308B\uFF08\u767B\u9332\u30FB\u66F4\u65B0\u30FB\u53D6\u6D88\uFF09",
30
31
  operations:[{name:"update",summary:"\u6307\u64581\u4EF6\u306B\u627F\u8A8D\u8005\u30B3\u30E1\u30F3\u30C8\u3092\u66F8\u304F\uFF08\u3042\u308C\u3070\u66F8\u304D\u63DB\u3048\u308B\uFF09",usage:UPDATE_USAGE,description:`PUT /api/v2/workflows/instances/{id}/ai-review/reasons/{criterion_id}/approver-comment\u3002\u627F\u8A8D\u753B\u9762\u306E\u6307\u6458\u306E\u300C\u627F\u8A8D\u8005\u30B3\u30E1\u30F3\u30C8\u300D\u3068\u540C\u3058\u3067\u3059\u3002
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{createRuntime}from"./chunk-VON6ODNL.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{describeAutoUpdate}from"./chunk-CH6QU76P.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{execFile}from"child_process";import fs from"fs";import path from"path";function resolveNpmCommand(deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const npmPath=(deps.find??(name=>findExecutable(name,{env,platform})))("npm");if(npmPath===null)return null;if(platform!=="win32")return{file:npmPath,prefix:[]};if(/\.exe$/i.test(npmPath))return{file:npmPath,prefix:[]};const cliJs=path.win32.join(path.win32.dirname(npmPath),"node_modules","npm","bin","npm-cli.js");return(deps.exists??fs.existsSync)(cliJs)?{file:deps.nodePath??process.
3
+ import{createRuntime}from"./chunk-J5QOE2GM.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{describeAutoUpdate}from"./chunk-CH6QU76P.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{execFile}from"child_process";import fs from"fs";import path from"path";function resolveNpmCommand(deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const npmPath=(deps.find??(name=>findExecutable(name,{env,platform})))("npm");if(npmPath===null)return null;if(platform!=="win32")return{file:npmPath,prefix:[]};if(/\.exe$/i.test(npmPath))return{file:npmPath,prefix:[]};const cliJs=path.win32.join(path.win32.dirname(npmPath),"node_modules","npm","bin","npm-cli.js");return(deps.exists??fs.existsSync)(cliJs)?{file:deps.nodePath??process.
4
4
  execPath,prefix:[cliJs]}:null}var DEFAULT_REGISTRY="https://registry.npmjs.org";function registryBase(env=process.env){const configured=env["npm_config_registry"]?.trim();if(configured===void 0||configured==="")return DEFAULT_REGISTRY;try{const url=new URL(configured);if(url.protocol!=="https:"&&url.protocol!=="http:")return DEFAULT_REGISTRY}catch{return DEFAULT_REGISTRY}return configured.replace(/\/+$/,"")}async function fetchFromRegistry(fetchImpl=httpFetch,env=process.env){const url=`${registryBase(env)}/${PACKAGE_NAME.replace(
5
5
  "/","%2f")}`;const res=await fetchImpl(url,{headers:{Accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(5e3)});if(!res.ok){throw new Error(`registry \u304C ${res.status} \u3092\u8FD4\u3057\u307E\u3057\u305F`)}const body=await res.json();const latest=body["dist-tags"]?.latest;if(typeof latest!=="string"||parseVersionCore(latest)===null){throw new Error("registry \u306E\u5FDC\u7B54\u306B dist-tags.latest \u304C\u3042\u308A\u307E\u305B\u3093")}return{version:latest.trim(),source:"\
6
6
  registry"}}async function fetchFromNpmCli(){const npm=resolveNpmCommand();if(npm===null){throw new Error("npm \u304C PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093")}const stdout=await new Promise((resolve,reject)=>{execFile(npm.file,[...npm.prefix,"view",PACKAGE_NAME,"version","--json"],{timeout:15e3,windowsHide:true},(error,out)=>error?reject(error):resolve(out))});const parsed=JSON.parse(stdout.trim());const latest=typeof parsed==="string"?parsed:null;if(latest===null||parseVersionCore(
@@ -7,10 +7,10 @@ statePath,"utf8"));const fingerprint=parsed["fingerprint"];const plannedAtMs=par
7
7
  {fingerprint,planned_at_ms:nowMs,planned_at:new Date(nowMs).toISOString()}));fs.renameSync(tmp,statePath);return true}catch{fs.rmSync(tmp,{force:true});return false}}async function evaluatePlanGate(gate,opts){const run=opts.run??((h,cwd)=>runHook(h,cwd));const outcome=await run(gate.hook,opts.cwd);if(!outcome.ok){return{skip:false,fingerprint:null,reason:`\u30D5\u30C3\u30AF\u304C\u5931\u6557\u3057\u305F\u305F\u3081\u8A08\u753B\u3057\u307E\u3059\uFF08${outcome.reason??"\u7406\u7531\u4E0D\u660E"}\uFF09`}}
8
8
  const fingerprint=fingerprintOf(outcome.stdout);if(fingerprint===null){return{skip:false,fingerprint:null,reason:"\u30D5\u30C3\u30AF\u304C\u6307\u7D0B\u3092\u51FA\u3055\u306A\u304B\u3063\u305F\u305F\u3081\u8A08\u753B\u3057\u307E\u3059"}}const short=fingerprint.slice(0,12);const prev=readPlanGateState(opts.statePath);if(prev===null){return{skip:false,fingerprint,reason:`\u524D\u56DE\u8A08\u753B\u6642\u306E\u8A18\u9332\u304C\u7121\u3044\u305F\u3081\u8A08\u753B\u3057\u307E\u3059\uFF08\u6307\u7D0B ${short}\
9
9
  \uFF09`}}if(prev.fingerprint!==fingerprint){return{skip:false,fingerprint,reason:`\u5165\u529B\u304C\u5909\u308F\u3063\u305F\u305F\u3081\u8A08\u753B\u3057\u307E\u3059\uFF08\u6307\u7D0B ${prev.fingerprint.slice(0,12)} \u2192 ${short}\uFF09`}}const elapsedSec=Math.trunc((opts.nowMs-prev.plannedAtMs)/1e3);if(elapsedSec<0||elapsedSec>=gate.maxSkipSec){return{skip:false,fingerprint,reason:`\u5165\u529B\u306F\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\u304C\u3001\u524D\u56DE\u306E\u8A08\u753B\u304B\u3089 ${elapsedSec}\
10
- \u79D2\u7D4C\u904E\u3057\u305F\u305F\u3081\u8A08\u753B\u3057\u307E\u3059\uFF08max_skip_sec=${gate.maxSkipSec}\uFF09`}}return{skip:true,fingerprint,reason:`\u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3044\u305F\u3081\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059\uFF08\u6307\u7D0B ${short}\u30FB\u524D\u56DE\u306E\u8A08\u753B\u304B\u3089 ${elapsedSec}\u79D2\uFF09`}}var NO_OPERATIONS={exclusiveSkills:new Set,statusEndpoint:null,highRiskSkills:new Set,preflightHosts:[],releaseRecoverySkill:null,postSuccessEnqueue:new Map,contractSkills:new Set,contractLines:new Map,advancingOutcomes:new Map,zeroTargetGates:{},countHooks:new Map,planSkill:null,planGate:null,skillPrefix:DEFAULT_SKILL_PREFIX};var DEFAULT_STATUS_PATH="/api/release/list";var DEFAULT_STATUS_HEADER="X-API-Key";function stringArray(value,label,warnings){if(value===void 0||value===null)return[];if(!Array.
11
- isArray(value)){warnings.push(`operations.${label} \u306F\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);return[]}const out=[];for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`operations.${label} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u8981\u7D20\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}out.push(v.
12
- trim())}return out}var KEYS_LINE_RE=/^[A-Za-z][A-Za-z0-9_]*$/;function parsePostSuccessEnqueue(value,warnings){const out=new Map;if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.post_success_enqueue \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return out}for(const[k,v]of Object.entries(value)){const label=`operations.post_success_en\
13
- queue.${k}`;if(typeof v==="string"){if(v.trim()===""){warnings.push(`${label} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}out.set(k,{skill:v.trim(),keysLine:null});continue}if(typeof v!=="object"||v===null||Array.isArray(v)){warnings.push(`${label} \u306F\u6587\u5B57\u5217\u304B { skill, keys_line } \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);
10
+ \u79D2\u7D4C\u904E\u3057\u305F\u305F\u3081\u8A08\u753B\u3057\u307E\u3059\uFF08max_skip_sec=${gate.maxSkipSec}\uFF09`}}return{skip:true,fingerprint,reason:`\u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3044\u305F\u3081\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059\uFF08\u6307\u7D0B ${short}\u30FB\u524D\u56DE\u306E\u8A08\u753B\u304B\u3089 ${elapsedSec}\u79D2\uFF09`}}var NO_OPERATIONS={exclusiveSkills:new Set,statusEndpoint:null,highRiskSkills:new Set,preflightHosts:[],releaseRecoverySkill:null,postSuccessEnqueue:new Map,contractSkills:new Set,contractLines:new Map,advancingOutcomes:new Map,zeroTargetGates:{},countHooks:new Map,planSkill:null,planGate:null,skillPrefix:DEFAULT_SKILL_PREFIX,releaseHooks:null};var DEFAULT_STATUS_PATH="/api/release/list";var DEFAULT_STATUS_HEADER="X-API-Key";function stringArray(value,label,warnings){if(value===void 0||value===null)
11
+ return[];if(!Array.isArray(value)){warnings.push(`operations.${label} \u306F\u914D\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);return[]}const out=[];for(const v of value){if(typeof v!=="string"||v.trim()===""){warnings.push(`operations.${label} \u306E\u8981\u7D20\u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u8981\u7D20\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);
12
+ continue}out.push(v.trim())}return out}var KEYS_LINE_RE=/^[A-Za-z][A-Za-z0-9_]*$/;function parsePostSuccessEnqueue(value,warnings){const out=new Map;if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.post_success_enqueue \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return out}for(const[k,v]of Object.entries(value)){const label=`operat\
13
+ ions.post_success_enqueue.${k}`;if(typeof v==="string"){if(v.trim()===""){warnings.push(`${label} \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}out.set(k,{skill:v.trim(),keysLine:null});continue}if(typeof v!=="object"||v===null||Array.isArray(v)){warnings.push(`${label} \u306F\u6587\u5B57\u5217\u304B { skill, keys_line } \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);
14
14
  continue}const o=v;const skill=typeof o["skill"]==="string"?o["skill"].trim():"";if(skill===""){warnings.push(`${label}.skill \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}const rawLine=o["keys_line"];let keysLine=null;if(typeof rawLine==="string"&&KEYS_LINE_RE.test(rawLine.trim())){keysLine=rawLine.trim()}else if(rawLine!==void 0&&rawLine!==null){warnings.push(
15
15
  `${label}.keys_line \u306F\u82F1\u5B57\u3067\u59CB\u307E\u308B\u82F1\u6570\u5B57\u3068 _ \u3060\u3051\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u30AD\u30FC\u5358\u4F4D\u306E\u6295\u5165\u306F\u3057\u307E\u305B\u3093\uFF09`)}out.set(k,{skill,keysLine})}return out}function parseZeroTargetGates(value,warnings){const out={};if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.zero_target_gates \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");
16
16
  return out}for(const[skill,v]of Object.entries(value)){if(typeof v!=="object"||v===null||Array.isArray(v)){warnings.push(`operations.zero_target_gates.${skill} \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`);continue}const g=v;const field=typeof g["field"]==="string"?g["field"].trim():"";const label=typeof g["label"]==="string"?g["label"].trim():"";if(field===""||label===""){warnings.push(`operations.zer\
@@ -20,18 +20,22 @@ continue}const o=v;const line=typeof o["line"]==="string"?o["line"].trim():"";if
20
20
  "object"||Array.isArray(rawAdvances)){warnings.push(`operations.contract_lines.${skill}.advances \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09`)}else{for(const[rawValue,status]of Object.entries(rawAdvances)){if(!CONTRACT_VALUE_RE.test(rawValue)||typeof status!=="string"||status.trim()===""){warnings.push(`operations.contract_lines.${skill}.advances.${rawValue} \u306F\u300C\u5024: \u7A7A\u3067\u306A\u3044\u30B9\u30C6\u30FC\u30BF\u30B9\u300D\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u3053\u306E\u9805\u76EE\u306F\u7121\u8996\u3057\u307E\u3059\uFF09`);
21
21
  continue}const outcome=`${line}: ${rawValue.toUpperCase()}`;const prev=advancingOutcomes.get(outcome);if(prev!==void 0&&prev!==status.trim()){warnings.push(`operations.contract_lines.${skill}.advances.${rawValue}: ${outcome} \u306E\u884C\u304D\u5148\u304C\u4ED6\u306E\u30B9\u30AD\u30EB\u3068\u98DF\u3044\u9055\u3044\u307E\u3059\uFF08${prev} \u3092\u63A1\u308A\u307E\u3059\uFF09`);continue}advances.set(rawValue.toUpperCase(),status.trim());advancingOutcomes.set(outcome,status.trim())}}}if(advances.size>
22
22
  0&&!line.endsWith("_RESULT")){warnings.push(`operations.contract_lines.${skill}.line \u304C _RESULT \u3067\u7D42\u308F\u3089\u306A\u3044\u305F\u3081\u3001advances \u306F\u518D\u6295\u5165\u6291\u6B62\u306B\u4F7F\u3048\u307E\u305B\u3093\uFF08\u7DE0\u3081\u51E6\u7406\u306E\u5951\u7D04\u884C\u3068\u3057\u3066\u3060\u3051\u4F7F\u3044\u307E\u3059\uFF09`);for(const v2 of advances.keys())advancingOutcomes.delete(`${line}: ${v2}`)}contractLines.set(skill,{line,advances})}return{contractLines,advancingOutcomes}}
23
- function parseCountHooks(value,warnings){const out=new Map;if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.count_hooks \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return out}for(const[key,v]of Object.entries(value)){const entry=v!==null&&typeof v==="object"&&!Array.isArray(v)?{id:`count:${key}`,...v}:v;const{hooks,warnings:w}=validateHooks(
24
- [entry],`operations.count_hooks.${key}`);warnings.push(...w);const hook=hooks[0];if(hook)out.set(key,hook)}return out}function parseEndpoint(value,warnings){if(value===void 0||value===null)return null;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.status_endpoint \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09");return null}const o=value;const url=typeof o["\
25
- url"]==="string"?o["url"].trim():"";if(url===""){warnings.push("operations.status_endpoint.url \u304C\u7121\u3044\u305F\u3081\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059");return null}if(!/^https?:\/\//i.test(url)){warnings.push(`operations.status_endpoint.url \u306F http(s) \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${url}\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09`);return null}const path2=typeof o["path"]==="string"&&o["path"].trim()!==""?o["path"].
26
- trim():DEFAULT_STATUS_PATH;const apiKeyEnvRaw=o["api_key_env"];const apiKeyEnv=typeof apiKeyEnvRaw==="string"&&apiKeyEnvRaw.trim()!==""?apiKeyEnvRaw.trim():null;const headerRaw=o["header"];const header=typeof headerRaw==="string"&&headerRaw.trim()!==""?headerRaw.trim():DEFAULT_STATUS_HEADER;return{url:url.replace(/\/+$/,""),path:path2.startsWith("/")?path2:`/${path2}`,apiKeyEnv,header}}function parseOperations(value){const warnings=[];if(value===void 0||value===null)return{operations:NO_OPERATIONS,
27
- warnings};if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return{operations:NO_OPERATIONS,warnings}}const o=value;const exclusiveSkills=new Set(stringArray(o["exclusive_skills"],"exclusive_skills",warnings));const statusEndpoint=parseEndpoint(o["status_endpoint"],warnings);if(exclusiveSkills.size>0&&statusEndpoint===null){warnings.
28
- push("operations.exclusive_skills \u306F\u3042\u308A\u307E\u3059\u304C status_endpoint \u304C\u7121\u3044\u305F\u3081\u3001\u5B9A\u671F\u67A0\u306E\u6392\u4ED6\u306F\u884C\u3044\u307E\u305B\u3093")}if(exclusiveSkills.size===0&&statusEndpoint!==null){warnings.push("operations.status_endpoint \u306F\u3042\u308A\u307E\u3059\u304C exclusive_skills \u304C\u7A7A\u306E\u305F\u3081\u3001\u554F\u3044\u5408\u308F\u305B\u306F\u884C\u3044\u307E\u305B\u3093")}const releaseRecoveryRaw=o["release_recovery_skil\
29
- l"];const releaseRecoverySkill=typeof releaseRecoveryRaw==="string"&&releaseRecoveryRaw.trim()!==""?releaseRecoveryRaw.trim():null;const planSkillRaw=o["plan_skill"];let planSkill=null;if(typeof planSkillRaw==="string"&&planSkillRaw.trim()!==""){planSkill=planSkillRaw.trim()}else if(planSkillRaw!==void 0&&planSkillRaw!==null){warnings.push("operations.plan_skill \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u884C\u3044\u307E\u305B\u3093\uFF09")}
23
+ var GUARD_NAME_RE=/^[A-Za-z0-9][A-Za-z0-9_-]*$/;function parseReleaseHooks(value,contractLines,skillPrefix,warnings){const bare=raw=>{const s=raw.trim().replace(/^\//,"");return skillPrefix!==""&&s.startsWith(skillPrefix)?s.slice(skillPrefix.length):s};if(value===void 0||value===null)return null;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.release_hooks \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");
24
+ return null}const o=value;const rawSkill=typeof o["skill"]==="string"?bare(o["skill"]):"";if(!GUARD_NAME_RE.test(rawSkill)){warnings.push("operations.release_hooks.skill \u306F\u7A7A\u3067\u306A\u3044\u30B9\u30AD\u30EB\u540D\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return null}const line=contractLines.get(rawSkill)?.line??null;if(line===null){warnings.push(`operations.release_hooks.skill \u306E ${rawSkill} \u306B contract_lines \u306E\u63A5\u982D\u8F9E\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5B8C\u4E86\u5F8C\u51E6\u7406\
25
+ \u30FB\u56DE\u53CE\u6295\u5165\u3092\u884C\u3044\u307E\u305B\u3093\uFF09`)}let planGuard=null;const rawGuard=o["plan_guard"];if(rawGuard!==void 0&&rawGuard!==null){const g=typeof rawGuard==="object"&&!Array.isArray(rawGuard)?rawGuard:{};const countField=typeof g["count_field"]==="string"?g["count_field"].trim():"";const drainedBy=typeof g["drained_by"]==="string"?bare(g["drained_by"]):"";if(GUARD_NAME_RE.test(countField)&&GUARD_NAME_RE.test(drainedBy)){planGuard={countField,drainedBy}}else{warnings.
26
+ push("operations.release_hooks.plan_guard \u306B\u306F count_field \u3068 drained_by \u304C\u8981\u308A\u307E\u3059\uFF08\u8A08\u753B\u306E\u7A7A\u632F\u308A\u9632\u6B62\u30AC\u30FC\u30C9\u3092\u884C\u3044\u307E\u305B\u3093\uFF09")}}return{skill:rawSkill,line,planGuard}}function parseCountHooks(value,warnings){const out=new Map;if(value===void 0||value===null)return out;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.count_hooks \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");
27
+ return out}for(const[key,v]of Object.entries(value)){const entry=v!==null&&typeof v==="object"&&!Array.isArray(v)?{id:`count:${key}`,...v}:v;const{hooks,warnings:w}=validateHooks([entry],`operations.count_hooks.${key}`);warnings.push(...w);const hook=hooks[0];if(hook)out.set(key,hook)}return out}function parseEndpoint(value,warnings){if(value===void 0||value===null)return null;if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations.status_endpoint \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09");
28
+ return null}const o=value;const url=typeof o["url"]==="string"?o["url"].trim():"";if(url===""){warnings.push("operations.status_endpoint.url \u304C\u7121\u3044\u305F\u3081\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059");return null}if(!/^https?:\/\//i.test(url)){warnings.push(`operations.status_endpoint.url \u306F http(s) \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${url}\uFF08\u6392\u4ED6\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\uFF09`);return null}const path2=typeof o["pat\
29
+ h"]==="string"&&o["path"].trim()!==""?o["path"].trim():DEFAULT_STATUS_PATH;const apiKeyEnvRaw=o["api_key_env"];const apiKeyEnv=typeof apiKeyEnvRaw==="string"&&apiKeyEnvRaw.trim()!==""?apiKeyEnvRaw.trim():null;const headerRaw=o["header"];const header=typeof headerRaw==="string"&&headerRaw.trim()!==""?headerRaw.trim():DEFAULT_STATUS_HEADER;return{url:url.replace(/\/+$/,""),path:path2.startsWith("/")?path2:`/${path2}`,apiKeyEnv,header}}function parseOperations(value){const warnings=[];if(value===void 0||
30
+ value===null)return{operations:NO_OPERATIONS,warnings};if(typeof value!=="object"||Array.isArray(value)){warnings.push("operations \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u7121\u8996\u3057\u307E\u3059\uFF09");return{operations:NO_OPERATIONS,warnings}}const o=value;const exclusiveSkills=new Set(stringArray(o["exclusive_skills"],"exclusive_skills",warnings));const statusEndpoint=parseEndpoint(o["status_endpoint"],warnings);if(exclusiveSkills.
31
+ size>0&&statusEndpoint===null){warnings.push("operations.exclusive_skills \u306F\u3042\u308A\u307E\u3059\u304C status_endpoint \u304C\u7121\u3044\u305F\u3081\u3001\u5B9A\u671F\u67A0\u306E\u6392\u4ED6\u306F\u884C\u3044\u307E\u305B\u3093")}if(exclusiveSkills.size===0&&statusEndpoint!==null){warnings.push("operations.status_endpoint \u306F\u3042\u308A\u307E\u3059\u304C exclusive_skills \u304C\u7A7A\u306E\u305F\u3081\u3001\u554F\u3044\u5408\u308F\u305B\u306F\u884C\u3044\u307E\u305B\u3093")}const releaseRecoveryRaw=o["\
32
+ release_recovery_skill"];const releaseRecoverySkill=typeof releaseRecoveryRaw==="string"&&releaseRecoveryRaw.trim()!==""?releaseRecoveryRaw.trim():null;const planSkillRaw=o["plan_skill"];let planSkill=null;if(typeof planSkillRaw==="string"&&planSkillRaw.trim()!==""){planSkill=planSkillRaw.trim()}else if(planSkillRaw!==void 0&&planSkillRaw!==null){warnings.push("operations.plan_skill \u306F\u7A7A\u3067\u306A\u3044\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u884C\u3044\u307E\u305B\u3093\uFF09")}
30
33
  const planGate=parsePlanGate(o["plan_gate"],warnings);if(planGate!==null&&planSkill===null){warnings.push("operations.plan_gate \u306F\u3042\u308A\u307E\u3059\u304C plan_skill \u304C\u7121\u3044\u305F\u3081\u4F7F\u308F\u308C\u307E\u305B\u3093\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u884C\u3044\u307E\u305B\u3093\uFF09")}const skillPrefixRaw=o["skill_prefix"];let skillPrefix=DEFAULT_SKILL_PREFIX;if(typeof skillPrefixRaw==="string"&&SKILL_PREFIX_RE.test(skillPrefixRaw)){skillPrefix=skillPrefixRaw}else if(skillPrefixRaw!==
31
34
  void 0&&skillPrefixRaw!==null){warnings.push(`operations.skill_prefix \u306F\u82F1\u5C0F\u6587\u5B57\u30FB\u6570\u5B57\u30FB\u30CF\u30A4\u30D5\u30F3\u306E\u6587\u5B57\u5217\uFF08\u7A7A\u6587\u5B57\u53EF\uFF09\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A\u306E '${DEFAULT_SKILL_PREFIX}' \u3092\u4F7F\u3044\u307E\u3059\uFF09`)}const{contractLines,advancingOutcomes}=parseContractLines(o["contract_lines"],warnings);const contractSkills=new Set(stringArray(o["contract_skills"],
32
- "contract_skills",warnings));for(const skill of contractSkills){if(!contractLines.has(skill)){warnings.push(`operations.contract_skills \u306E ${skill} \u306B contract_lines \u306E\u63A5\u982D\u8F9E\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7DE0\u3081\u51E6\u7406\u306F\u6C4E\u7528\u306E *_RESULT \u884C\u3092\u62FE\u3044\u307E\u3059\uFF09`)}}return{operations:{exclusiveSkills,statusEndpoint,highRiskSkills:new Set(stringArray(o["high_risk_skills"],"high_risk_skills",warnings)),preflightHosts:stringArray(
33
- o["preflight_hosts"],"preflight_hosts",warnings),releaseRecoverySkill,postSuccessEnqueue:parsePostSuccessEnqueue(o["post_success_enqueue"],warnings),contractSkills,contractLines,advancingOutcomes,zeroTargetGates:parseZeroTargetGates(o["zero_target_gates"],warnings),countHooks:parseCountHooks(o["count_hooks"],warnings),planSkill,planGate,skillPrefix},warnings}}function describeOperations(ops){const plan=ops.planSkill?`\u8A08\u753B ${ops.planSkill}${ops.planGate?`\uFF08plan_gate: \u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3051\u308C\u3070\u7701\u304F\u30FB\u6700\u9577${ops.
34
- planGate.maxSkipSec}\u79D2\uFF09`:""}`:"\u8A08\u753B\u30B9\u30AD\u30EB\u672A\u8A2D\u5B9A\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u884C\u3044\u307E\u305B\u3093\uFF09";const prefix=`\u30B9\u30AD\u30EB\u63A5\u982D\u8F9E '/${ops.skillPrefix}'`;const advance=ops.advancingOutcomes.size>0?`\u518D\u6295\u5165\u6291\u6B62 ${ops.advancingOutcomes.size}\u7A2E`:"contract_lines \u672A\u8A2D\u5B9A\uFF08\u518D\u6295\u5165\u6291\u6B62\u3092\u884C\u3044\u307E\u305B\u3093\uFF09";if(ops===NO_OPERATIONS||ops.
35
- exclusiveSkills.size===0&&ops.highRiskSkills.size===0&&ops.postSuccessEnqueue.size===0){return`\u904B\u7528\u8A2D\u5B9A: \u306A\u3057\uFF08\u30B9\u30AD\u30EB\u540D\u306B\u3088\u308B\u7279\u5225\u6271\u3044\u306F\u884C\u3044\u307E\u305B\u3093\uFF09 / ${prefix} / ${plan} / ${advance}`}const parts=[prefix,plan,advance];if(ops.exclusiveSkills.size>0&&ops.statusEndpoint){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")} \u2190 ${ops.statusEndpoint.url}`)}else if(ops.exclusiveSkills.size>
36
- 0){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")}\uFF08\u554F\u3044\u5408\u308F\u305B\u5148\u304C\u7121\u3044\u305F\u3081\u7121\u52B9\uFF09`)}if(ops.highRiskSkills.size>0)parts.push(`\u9AD8\u30EA\u30B9\u30AF ${ops.highRiskSkills.size}\u4EF6`);if(ops.releaseRecoverySkill)parts.push(`\u56DE\u53CE ${ops.releaseRecoverySkill}`);for(const[from,f]of ops.postSuccessEnqueue){parts.push(f.keysLine?`\u5F8C\u7D9A ${from}\u2192${f.skill}\uFF08${f.keysLine} \u884C\u306E\u30AD\u30FC\u5358\u4F4D\uFF09`:
37
- `\u5F8C\u7D9A ${from}\u2192${f.skill}\uFF08keys_line \u672A\u8A2D\u5B9A\u306E\u305F\u3081\u30AD\u30FC\u5358\u4F4D\u306E\u6295\u5165\u306F\u3057\u307E\u305B\u3093\uFF09`)}return`\u904B\u7528\u8A2D\u5B9A: ${parts.join(" / ")}`}export{planGateStatePath,recordPlanned,evaluatePlanGate,parseOperations,describeOperations};
35
+ "contract_skills",warnings));for(const skill of contractSkills){if(!contractLines.has(skill)){warnings.push(`operations.contract_skills \u306E ${skill} \u306B contract_lines \u306E\u63A5\u982D\u8F9E\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7DE0\u3081\u51E6\u7406\u306F\u6C4E\u7528\u306E *_RESULT \u884C\u3092\u62FE\u3044\u307E\u3059\uFF09`)}}const releaseHooks=parseReleaseHooks(o["release_hooks"],contractLines,skillPrefix,warnings);return{operations:{exclusiveSkills,statusEndpoint,highRiskSkills:new Set(
36
+ stringArray(o["high_risk_skills"],"high_risk_skills",warnings)),preflightHosts:stringArray(o["preflight_hosts"],"preflight_hosts",warnings),releaseRecoverySkill,postSuccessEnqueue:parsePostSuccessEnqueue(o["post_success_enqueue"],warnings),contractSkills,contractLines,advancingOutcomes,zeroTargetGates:parseZeroTargetGates(o["zero_target_gates"],warnings),countHooks:parseCountHooks(o["count_hooks"],warnings),planSkill,planGate,skillPrefix,releaseHooks},warnings}}function describeOperations(ops){const plan=ops.
37
+ planSkill?`\u8A08\u753B ${ops.planSkill}${ops.planGate?`\uFF08plan_gate: \u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3051\u308C\u3070\u7701\u304F\u30FB\u6700\u9577${ops.planGate.maxSkipSec}\u79D2\uFF09`:""}`:"\u8A08\u753B\u30B9\u30AD\u30EB\u672A\u8A2D\u5B9A\uFF08\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u884C\u3044\u307E\u305B\u3093\uFF09";const prefix=`\u30B9\u30AD\u30EB\u63A5\u982D\u8F9E '/${ops.skillPrefix}'`;const advance=ops.advancingOutcomes.size>0?`\u518D\u6295\u5165\u6291\u6B62 ${ops.advancingOutcomes.
38
+ size}\u7A2E`:"contract_lines \u672A\u8A2D\u5B9A\uFF08\u518D\u6295\u5165\u6291\u6B62\u3092\u884C\u3044\u307E\u305B\u3093\uFF09";if(ops===NO_OPERATIONS||ops.exclusiveSkills.size===0&&ops.highRiskSkills.size===0&&ops.postSuccessEnqueue.size===0&&ops.releaseHooks===null){return`\u904B\u7528\u8A2D\u5B9A: \u306A\u3057\uFF08\u30B9\u30AD\u30EB\u540D\u306B\u3088\u308B\u7279\u5225\u6271\u3044\u306F\u884C\u3044\u307E\u305B\u3093\uFF09 / ${prefix} / ${plan} / ${advance}`}const parts=[prefix,plan,advance];if(ops.
39
+ exclusiveSkills.size>0&&ops.statusEndpoint){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")} \u2190 ${ops.statusEndpoint.url}`)}else if(ops.exclusiveSkills.size>0){parts.push(`\u6392\u4ED6 ${[...ops.exclusiveSkills].join(",")}\uFF08\u554F\u3044\u5408\u308F\u305B\u5148\u304C\u7121\u3044\u305F\u3081\u7121\u52B9\uFF09`)}if(ops.highRiskSkills.size>0)parts.push(`\u9AD8\u30EA\u30B9\u30AF ${ops.highRiskSkills.size}\u4EF6`);if(ops.releaseRecoverySkill)parts.push(`\u56DE\u53CE ${ops.releaseRecoverySkill}`);
40
+ if(ops.releaseHooks){const h=ops.releaseHooks;parts.push(`\u30EA\u30EA\u30FC\u30B9\u5F8C\u51E6\u7406 ${h.skill}\uFF08${h.line?`${h.line} \u884C`:"\u5951\u7D04\u884C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u5F8C\u51E6\u7406\u306A\u3057"}${h.planGuard?`\u30FB${h.planGuard.countField} > \u8A08\u753B\u5185 ${h.planGuard.drainedBy} \u306A\u3089\u8A08\u753B\u304B\u3089\u9664\u5916`:""}\uFF09`)}for(const[from,f]of ops.postSuccessEnqueue){parts.push(f.keysLine?`\u5F8C\u7D9A ${from}\u2192${f.skill}\uFF08${f.
41
+ keysLine} \u884C\u306E\u30AD\u30FC\u5358\u4F4D\uFF09`:`\u5F8C\u7D9A ${from}\u2192${f.skill}\uFF08keys_line \u672A\u8A2D\u5B9A\u306E\u305F\u3081\u30AD\u30FC\u5358\u4F4D\u306E\u6295\u5165\u306F\u3057\u307E\u305B\u3093\uFF09`)}return`\u904B\u7528\u8A2D\u5B9A: ${parts.join(" / ")}`}export{planGateStatePath,recordPlanned,evaluatePlanGate,parseOperations,describeOperations};
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var SENSITIVE_HEADERS=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-vercel-protection-bypass"]);var REDACTED="***\uFF08\u4F0F\u5B57\uFF09";var SECRET_KEY_PATTERN="[A-Za-z0-9_-]*(?:token|secret|password|passwd|api[_-]?key|credential|signature|tempauth|upload_?url)[A-Za-z0-9_-]*";var NOT_SECRET_FLAGS="(?:starting-token)";var NOT_SECRET_QUERY="(?:skiptoken)";function redactSecrets(text){return text.replace(/\bBearer\s+[^\s"'`,;)\]}\\]+/gi,`Bearer\
4
- ${REDACTED}`).replace(/(\/v2\/(?:admin\/)?invitations\/)[A-Za-z0-9_-]{16,}/g,`$1${REDACTED}`).replace(new RegExp(`("${SECRET_KEY_PATTERN}"\\s*:\\s*)"(?:[^"\\\\]|\\\\.)*"`,"gi"),`$1"${REDACTED}"`).replace(new RegExp(`([?&](?!${NOT_SECRET_QUERY}=)${SECRET_KEY_PATTERN}=)[^&\\s"'\`,;)\\]}\\\\]+`,"gi"),`$1${REDACTED}`).replace(new RegExp(`(--(?!${NOT_SECRET_FLAGS}(?:=|\\s))${SECRET_KEY_PATTERN}(?:=|\\s+))('[^']*'|"[^"]*"|[A-Za-z0-9_.~+/=|:%-]+)`,"gi"),`$1${REDACTED}`)}var SECRET_KEY_NAME=new RegExp(
5
- `^${SECRET_KEY_PATTERN}$`,"i");function redactSecretValues(value){if(Array.isArray(value))return value.map(item=>redactSecretValues(item));if(value!==null&&typeof value==="object"){const out={};for(const[key,item]of Object.entries(value)){out[key]=SECRET_KEY_NAME.test(key)?REDACTED:redactSecretValues(item)}return out}if(typeof value==="string")return redactSecrets(value);return value}function formatHeaders(headers){if(!headers)return[];const entries=headers instanceof Headers?[...headers.entries()]:
6
- Array.isArray(headers)?headers:Object.entries(headers);return entries.map(([name,value])=>{const shown=SENSITIVE_HEADERS.has(name.toLowerCase())?REDACTED:redactSecrets(String(value));return` ${name.toLowerCase()}: ${shown}`})}var BODY_LIMIT=4e3;function omitAttachmentBytes(body){return body.replace(/"contentBytes":"([A-Za-z0-9+/=]*)"/g,(_,b64)=>`"contentBytes":"\uFF08base64 ${b64.length} \u6587\u5B57\u30FB\u51FA\u529B\u3057\u306A\u3044\uFF09"`)}function formatBody(raw){const safe=omitAttachmentBytes(
7
- redactSecrets(stripTerminalControls(raw)));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
3
+ import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var SENSITIVE_HEADERS=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-vercel-protection-bypass"]);var REDACTED="***\uFF08\u4F0F\u5B57\uFF09";var SECRET_KEY_PATTERN="[A-Za-z0-9_-]*(?:token|secret|password|passwd|api[_-]?key|credential|signature|tempauth|upload_?url)[A-Za-z0-9_-]*";var NOT_SECRET_FLAGS="(?:starting-token)";var NOT_SECRET_QUERY="(?:skiptoken)";function redactSecrets(text){return text.replace(/\bBearer\s+(?:[^\s"'`,;)\]}\\]|\\[^\s"])+/gi,
4
+ `Bearer ${REDACTED}`).replace(/(\/v2\/(?:admin\/)?invitations\/)[A-Za-z0-9_-]{16,}/g,`$1${REDACTED}`).replace(new RegExp(`("${SECRET_KEY_PATTERN}"\\s*:\\s*)"(?:[^"\\\\]|\\\\.)*"`,"gi"),`$1"${REDACTED}"`).replace(new RegExp(`([?&](?!${NOT_SECRET_QUERY}=)${SECRET_KEY_PATTERN}=)(?:[^&\\s"'\`,;)\\]}\\\\]|\\\\[^\\s"])+`,"gi"),`$1${REDACTED}`).replace(new RegExp(`(--(?!${NOT_SECRET_FLAGS}(?:=|\\s))${SECRET_KEY_PATTERN}(?:=|\\s+))('[^']*'|"[^"]*"|(?:[A-Za-z0-9_.~+/=|:%-]|\\\\[^\\s"])+)`,"gi"),`$1${REDACTED}`)}
5
+ var SECRET_KEY_NAME=new RegExp(`^${SECRET_KEY_PATTERN}$`,"i");function redactSecretValues(value){if(Array.isArray(value))return value.map(item=>redactSecretValues(item));if(value!==null&&typeof value==="object"){const out={};for(const[key,item]of Object.entries(value)){const shownKey=uniqueKey(out,redactSecrets(key));out[shownKey]=SECRET_KEY_NAME.test(key)?REDACTED:redactSecretValues(item)}return out}if(typeof value==="string")return redactSecrets(value);return value}function uniqueKey(out,key){
6
+ if(!Object.hasOwn(out,key))return key;let n=2;while(Object.hasOwn(out,`${key} (${n})`))n+=1;return`${key} (${n})`}function formatHeaders(headers){if(!headers)return[];const entries=headers instanceof Headers?[...headers.entries()]:Array.isArray(headers)?headers:Object.entries(headers);return entries.map(([name,value])=>{const shown=SENSITIVE_HEADERS.has(name.toLowerCase())?REDACTED:redactSecrets(String(value));return` ${name.toLowerCase()}: ${shown}`})}var BODY_LIMIT=4e3;function omitAttachmentBytes(body){
7
+ return body.replace(/"contentBytes":"([A-Za-z0-9+/=]*)"/g,(_,b64)=>`"contentBytes":"\uFF08base64 ${b64.length} \u6587\u5B57\u30FB\u51FA\u529B\u3057\u306A\u3044\uFF09"`)}function formatBody(raw){const safe=omitAttachmentBytes(redactSecrets(stripTerminalControls(raw)));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
8
8
  \u2026\uFF08\u4EE5\u964D ${safe.length-BODY_LIMIT} \u6587\u5B57\u3092\u7701\u7565\uFF09`:safe}function isTextualContentType(contentType){if(contentType===null)return false;return/^\s*(text\/|application\/(json|xml|javascript|x-www-form-urlencoded)|application\/[\w.+-]*\+(json|xml))/i.test(contentType)}function withDebug(inner,options={}){const write=options.write??(text=>void process.stderr.write(text));const now=options.now??(()=>Date.now());return async(input,init)=>{const method=init?.method??
9
9
  "GET";const lines=[`[debug] \u2192 ${method} ${redactSecrets(input)}`,...formatHeaders(init?.headers)];if(options.omitBodies!==void 0&&init?.body!==void 0&&init.body!==null)lines.push(` \uFF08\u672C\u6587\u306F${options.omitBodies}\u305F\u3081\u51FA\u529B\u3057\u306A\u3044\uFF09`);else if(typeof init?.body==="string")lines.push(` ${formatBody(init.body)}`);else if(init?.body instanceof Uint8Array)lines.push(` \uFF08\u672C\u6587\u306F ${init.body.byteLength} \u30D0\u30A4\u30C8\u306E\u30D0\u30A4\u30C8\u5217\u3002\u51FA\u529B\u3057\u306A\u3044\uFF09`);
10
10
  write(`${lines.join("\n")}
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{FINAL_REPORT_BEGIN,FINAL_REPORT_END,redactLoopOutput}from"./chunk-JUJSF5ZG.js";import{skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{normalizeRequiredPlatforms}from"./chunk-O52RKZCC.js";import{extractLeadingTaskKey}from"./chunk-II5RVJQN.js";var LEDGER_TASK_KEY_MAX=50;var CONTROL_CHAR_RE=/[\u0000-\u001f\u007f]/;var FLAG_TOKEN_RE=/(?:^|\s)-/;function loosen(source){let t=source.replace(/^[ \t]*\/\/[^\n]*$/gm,"");t=t.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/,(\s*[}\]])/g,"$1");return t===source?null:t}function tryParsePlan(source){for(const candidate of[source,loosen(source)]){if(candidate===null)continue;try{const obj=JSON.parse(candidate);if(obj!==null&&typeof obj==="object"&&Array.isArray(obj.steps)){return obj}}catch{}}return null}
3
+ import{FINAL_REPORT_BEGIN,FINAL_REPORT_END,redactLoopOutput}from"./chunk-UUN3IO3Z.js";import{skillCommand,skillPrefix}from"./chunk-6CS5L24D.js";import{normalizeRequiredPlatforms}from"./chunk-O52RKZCC.js";import{extractLeadingTaskKey}from"./chunk-II5RVJQN.js";var LEDGER_TASK_KEY_MAX=50;var CONTROL_CHAR_RE=/[\u0000-\u001f\u007f]/;var FLAG_TOKEN_RE=/(?:^|\s)-/;function loosen(source){let t=source.replace(/^[ \t]*\/\/[^\n]*$/gm,"");t=t.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/,(\s*[}\]])/g,"$1");return t===source?null:t}function tryParsePlan(source){for(const candidate of[source,loosen(source)]){if(candidate===null)continue;try{const obj=JSON.parse(candidate);if(obj!==null&&typeof obj==="object"&&Array.isArray(obj.steps)){return obj}}catch{}}return null}
4
4
  function fencedBlocks(text,tag){const re=new RegExp("```"+tag+"\\s*\\n([\\s\\S]*?)\\n```","g");const out=[];for(const m of text.matchAll(re)){if(m[1]!==void 0)out.push(m[1])}return out}function extractGeminiEnvelope(text){const anchor=/\{[^{}]*"session_id"[^{}]*"response"\s*:\s*"/g;for(const m of text.matchAll(anchor)){const start=m.index;if(start===void 0)continue;let depth=0;let inStr=false;let escape=false;for(let i=start;i<text.length;i++){const c=text[i];if(escape){escape=false;continue}if(c===
5
5
  "\\"){escape=true;continue}if(c==='"'){inStr=!inStr;continue}if(inStr)continue;if(c==="{")depth++;else if(c==="}"){depth--;if(depth===0){try{const obj=JSON.parse(text.slice(start,i+1));if(obj!==null&&typeof obj==="object"&&typeof obj.response==="string"){return obj.response}}catch{}break}}}}return null}function matchingBrace(text,start){let depth=0;let inStr=false;let escape=false;for(let i=start;i<text.length;i++){const c=text[i];if(escape){escape=false;continue}if(inStr){if(c==="\\")escape=true;else if(c===
6
6
  '"')inStr=false;continue}if(c==='"')inStr=true;else if(c==="{")depth++;else if(c==="}"){depth--;if(depth===0)return i}}return-1}var MAX_STEPS_ANCHORS=20;var MAX_OPEN_CANDIDATES=8;function lastStepsObject(text){const anchors=[...text.matchAll(/"steps"\s*:/g)].map(m=>m.index).filter(i=>i!==void 0);for(const at of anchors.reverse().slice(0,MAX_STEPS_ANCHORS)){let tried=0;for(let open=text.lastIndexOf("{",at);open>=0&&tried<MAX_OPEN_CANDIDATES;open=text.lastIndexOf("{",open-1)){tried++;const close=matchingBrace(
@@ -11,6 +11,6 @@ m[1]??""))return null;return token}return null}function stepToItem(step,assign,p
11
11
  if(!label||promptLike||label.startsWith("[P"))label=prompt;const taskKey=ledgerTaskKey(args);const category=assign?.categoryForSkill(skill)??step.ai_category??"complex";const display=taskKey&&!label.includes(taskKey)?`[${priority}] ${taskKey} ${label} #ai:${category}`:`[${priority}] ${label} #ai:${category}`;const item={label:display.slice(0,200),prompt,task_key:taskKey};const platforms=normalizeRequiredPlatforms(step.required_platforms);if(platforms.length>0)item.required_platforms=platforms;if(assign!==
12
12
  void 0){const ai=assign.selectPrimary(category,skill,priority,display);if(ai!=="")item.ai_type=ai}return item}function parsePlanExcludeKeys(prefetchSection){const m=/OPS_PLAN_EXCLUDE_KEYS\s+([^\s]*)\s+-->/.exec(prefetchSection);const keys=new Set;if(!m||!m[1])return keys;for(const raw of m[1].split(",")){const key=raw.trim();if(key!=="")keys.add(key)}return keys}function excludedKeyInArgs(args,excluded){if(excluded.size===0)return null;for(const key of[...excluded].sort()){const re=new RegExp(`(\
13
13
  ?<![A-Za-z0-9-])${key.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![0-9])`);if(re.test(args))return key}return null}function parseOpsCount(prefetchSection,field){const marker=/OPS_COUNTS\s+([^>]*?)-->/.exec(prefetchSection);if(!marker||!marker[1])return null;const escaped=field.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");const hit=new RegExp(`(?:^|\\s)${escaped}=(-?\\d+)(?:\\s|$)`).exec(marker[1]);if(!hit||hit[1]===void 0)return null;const n=Number.parseInt(hit[1],10);if(!Number.isFinite(n)||n<0)return null;
14
- return n}function releaseDeployDropReason(verifyBacklog,devVerifyPlanned){if(verifyBacklog===null){return"\u52D5\u4F5C\u78BA\u8A8D\u306E\u4EF6\u6570\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\uFF08\u5224\u5B9A\u4E0D\u80FD\u306E\u305F\u3081\u30EA\u30EA\u30FC\u30B9\u306F\u898B\u9001\u308B\uFF09"}if(verifyBacklog>devVerifyPlanned){return`\u52D5\u4F5C\u78BA\u8A8D${verifyBacklog}\u4EF6 > \u8A08\u753B\u5185dev-verify${devVerifyPlanned}\u4EF6\uFF08Phase 1\u306E0\u4EF6\u898B\u8FBC\u307F\u304C\u7ACB\u305F\u306A\u3044\uFF09`}
14
+ return n}function releaseDeployDropReason(verifyBacklog,devVerifyPlanned,guard){if(verifyBacklog===null){return`${guard.countField} \u306E\u4EF6\u6570\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\uFF08\u5224\u5B9A\u4E0D\u80FD\u306E\u305F\u3081\u30EA\u30EA\u30FC\u30B9\u306F\u898B\u9001\u308B\uFF09`}if(verifyBacklog>devVerifyPlanned){return`${guard.countField} ${verifyBacklog}\u4EF6 > \u8A08\u753B\u5185${guard.drainedBy}${devVerifyPlanned}\u4EF6\uFF08Phase 1\u306E0\u4EF6\u898B\u8FBC\u307F\u304C\u7ACB\u305F\u306A\u3044\uFF09`}
15
15
  return null}function duplicateTaskKeyDropReason(enqueuedKeys,taskKey){if(!taskKey)return null;if(!enqueuedKeys.has(taskKey))return null;return`${taskKey} \u306F\u672C\u8A08\u753B\u3067\u65E2\u306B\u6295\u5165\u6E08\u307F\uFF08\u540C\u4E00\u30AD\u30FC\u306F1\u8A08\u753B1\u4EF6\uFF09`}var NO_ZERO_TARGET_GATES={};function zeroTargetDropReasons(prefetchSection,gates=NO_ZERO_TARGET_GATES){const reasons=new Map;for(const[skill,gate]of Object.entries(gates)){const n=parseOpsCount(prefetchSection,gate.field);
16
16
  if(n===null)reasons.set(skill,`${gate.label}\u4EF6\u6570\u304C\u5224\u5B9A\u4E0D\u80FD\u306E\u305F\u3081\u898B\u9001\u308A`);else if(n===0)reasons.set(skill,`${gate.label}0\u4EF6\u306E\u305F\u3081\u5BFE\u8C61\u306A\u3057`)}return reasons}export{extractPlanJson,placeholderTaskKey,stepToItem,parsePlanExcludeKeys,excludedKeyInArgs,parseOpsCount,releaseDeployDropReason,duplicateTaskKeyDropReason,zeroTargetDropReasons};