@tocca-systems/twp-cli 0.97.0 → 0.97.2

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.
@@ -11,6 +11,14 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.97.2
15
+
16
+ エージェントループで、前提タスク待ちで据え置いたタスクが、前提が進んでいないのに繰り返し投入される問題を修正しました。
17
+
18
+ ## 0.97.1
19
+
20
+ エージェントループで codex が「モデルの容量不足」で停止したとき、タスクの失敗として扱わず、一時的な制限としてクールダウンし、設定されていれば次の AI に切り替えるようにしました。
21
+
14
22
  ## 0.97.0
15
23
 
16
24
  エージェントループに「条件トリガー」を設定できるようになりました。同じタスクに同じスキルを投入しても状態が変わらない実行が続いたとき、指定したスキルを自動でキューへ差し込みます。`twp task-loop trigger` で一覧・作成・更新・削除・発火履歴の確認、止めた投入の再開ができます。止められている投入はエラーにならず、ログに「投入を落とした」と残してループが続きます。
@@ -911,7 +911,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
911
911
 
912
912
  ## react
913
913
 
914
- バージョン: 19.3.0 / ライセンス: MIT
914
+ バージョン: 19.3.1 / ライセンス: MIT
915
915
 
916
916
  ```
917
917
  MIT License
@@ -1,6 +1,6 @@
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-MBPJV745.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-3OCV6SOR.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-VEEZJNOB.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-REWDCJNB.js";import{detectAiClis}from"./chunk-5SONMN6K.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-3OCV6SOR.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-VEEZJNOB.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
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-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";import"./chunk-BD7O73GK.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(
@@ -30,7 +30,7 @@ startTransition;exports.unstable_useCacheRefresh=function(){return ReactSharedIn
30
30
  Context)};exports.useDebugValue=function(){};exports.useDeferredValue=function(value,initialValue){return ReactSharedInternals.H.useDeferredValue(value,initialValue)};exports.useEffect=function(create3,deps){return ReactSharedInternals.H.useEffect(create3,deps)};exports.useEffectEvent=function(callback){return ReactSharedInternals.H.useEffectEvent(callback)};exports.useId=function(){return ReactSharedInternals.H.useId()};exports.useImperativeHandle=function(ref,create3,deps){return ReactSharedInternals.
31
31
  H.useImperativeHandle(ref,create3,deps)};exports.useInsertionEffect=function(create3,deps){return ReactSharedInternals.H.useInsertionEffect(create3,deps)};exports.useLayoutEffect=function(create3,deps){return ReactSharedInternals.H.useLayoutEffect(create3,deps)};exports.useMemo=function(create3,deps){return ReactSharedInternals.H.useMemo(create3,deps)};exports.useOptimistic=function(passthrough,reducer){return ReactSharedInternals.H.useOptimistic(passthrough,reducer)};exports.useReducer=function(reducer,initialArg,init){
32
32
  return ReactSharedInternals.H.useReducer(reducer,initialArg,init)};exports.useRef=function(initialValue){return ReactSharedInternals.H.useRef(initialValue)};exports.useState=function(initialState){return ReactSharedInternals.H.useState(initialState)};exports.useSyncExternalStore=function(subscribe,getSnapshot,getServerSnapshot){return ReactSharedInternals.H.useSyncExternalStore(subscribe,getSnapshot,getServerSnapshot)};exports.useTransition=function(){return ReactSharedInternals.H.useTransition()};
33
- exports.version="19.3.0"}});var require_react=__commonJS({"node_modules/react/index.js"(exports,module){"use strict";if(true){module.exports=require_react_production()}else{module.exports=null}}});var require_signals=__commonJS({"node_modules/signal-exit/signals.js"(exports,module){"use strict";module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32"){module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT")}if(process.platform==="linux"){module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}}});var require_signal_exit=__commonJS({"node_modules/signal-exit/index.js"(exports,module){"use strict";var process14=global.process;var processOk=function(process15){return process15&&typeof process15==="object"&&typeof process15.removeListener==="function"&&typeof process15.emit==="function"&&typeof process15.reallyExit==="function"&&typeof process15.listeners==="function"&&typeof process15.kill==="function"&&typeof process15.pid==="number"&&typeof process15.on==="function"};if(!processOk(process14)){
33
+ exports.version="19.3.1"}});var require_react=__commonJS({"node_modules/react/index.js"(exports,module){"use strict";if(true){module.exports=require_react_production()}else{module.exports=null}}});var require_signals=__commonJS({"node_modules/signal-exit/signals.js"(exports,module){"use strict";module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32"){module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT")}if(process.platform==="linux"){module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}}});var require_signal_exit=__commonJS({"node_modules/signal-exit/index.js"(exports,module){"use strict";var process14=global.process;var processOk=function(process15){return process15&&typeof process15==="object"&&typeof process15.removeListener==="function"&&typeof process15.emit==="function"&&typeof process15.reallyExit==="function"&&typeof process15.listeners==="function"&&typeof process15.kill==="function"&&typeof process15.pid==="number"&&typeof process15.on==="function"};if(!processOk(process14)){
34
34
  module.exports=function(){return function(){}}}else{assert=__require("assert");signals=require_signals();isWin=/^win/i.test(process14.platform);EE=__require("events");if(typeof EE!=="function"){EE=EE.EventEmitter}if(process14.__signal_exit_emitter__){emitter=process14.__signal_exit_emitter__}else{emitter=process14.__signal_exit_emitter__=new EE;emitter.count=0;emitter.emitted={}}if(!emitter.infinite){emitter.setMaxListeners(Infinity);emitter.infinite=true}module.exports=function(cb,opts){if(!processOk(
35
35
  global.process)){return function(){}}assert.equal(typeof cb,"function","a callback must be provided for exit handler");if(loaded===false){load()}var ev="exit";if(opts&&opts.alwaysLast){ev="afterexit"}var remove=function(){emitter.removeListener(ev,cb);if(emitter.listeners("exit").length===0&&emitter.listeners("afterexit").length===0){unload()}};emitter.on(ev,cb);return remove};unload=function unload2(){if(!loaded||!processOk(global.process)){return}loaded=false;signals.forEach(function(sig){try{
36
36
  process14.removeListener(sig,sigListeners[sig])}catch(er){}});process14.emit=originalProcessEmit;process14.reallyExit=originalProcessReallyExit;emitter.count-=1};module.exports.unload=unload;emit=function emit2(event,code,signal){if(emitter.emitted[event]){return}emitter.emitted[event]=true;emitter.emit(event,code,signal)};sigListeners={};signals.forEach(function(sig){sigListeners[sig]=function listener(){if(!processOk(global.process)){return}var listeners=process14.listeners(sig);if(listeners.length===
@@ -66,20 +66,21 @@ now??new Date).getTime()*1e3;const latest=new Map;const byTask=new Map;for(const
66
66
  get(key);if(prev&&prev.sortOrder>=sortOrder)continue;latest.set(key,{sortOrder,candidate:{taskKey,skill,itemId:item.item_id,outcomeCode:normalizeOutcomeCode(item.outcome_code),outcomeRaw:(item.outcome_code??"").trim()===""?null:item.outcome_code,ageMinutes:sortOrder>0?Math.floor((nowMicros-sortOrder)/6e7):null}})}const index=new Map;for(const[key,value]of latest){let later=null;if(value.sortOrder>0){for(const run of byTask.get(value.candidate.taskKey)??[]){if(run.skill===value.candidate.skill||run.
67
67
  sortOrder<=value.sortOrder)continue;if(later===null||run.sortOrder>later.sortOrder)later=run}}index.set(key,{...value.candidate,supersededBy:later===null?null:{skill:later.skill,itemId:later.itemId}})}return index}function findRecentCandidate(index,taskKey,skill){if(taskKey.trim()===""||skill.trim()==="")return null;return index.get(advanceKey(taskKey.trim(),skill))??null}async function resolveRecentAdvance(candidate,fetchResult,advancing){if(advancing.size===0)return null;let outcome=candidate.
68
68
  outcomeCode;if(outcome===null){const result=await fetchResult(candidate.itemId);outcome=result?normalizeOutcomeCode(parseOutcomeCode(result)):null}if(outcome===null||!advancing.has(outcome))return null;return{taskKey:candidate.taskKey,skill:candidate.skill,outcome,itemId:candidate.itemId,ageMinutes:candidate.ageMinutes}}function formatRecentAdvance(advance){const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\u524D`;return`${advance.outcome}\uFF08${age} / item=${advance.
69
- itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var MARKER_PAIR_RE=/^([^=\s,]+)=([a-z]+)$/;function decodeMarkerKey(raw){let key;try{key=decodeURIComponent(raw)}catch{return null}return isTaskKey(key)&&key.trim()===key?key:null}function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.
70
- exec(body);const byKey=new Map;for(const token of body.trim().split(/\s+/)){for(const part of token.split(",")){const pair=MARKER_PAIR_RE.exec(part);if(!pair)continue;const key=decodeMarkerKey(pair[1]);if(key!==null)byKey.set(key,pair[2])}}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot,advancing){if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}
71
- if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=advancing.get(advance.outcome);if(expected===
72
- void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}
73
- var RESUME_HOLD_CAP_HOURS=6;function parseResumeCondition(raw){const head=/\b[A-Z][A-Z0-9_]*_RESULT\s*:([^|\n]*)/.exec(raw??"")?.[1]??"";let resumeAfter=null;const blockedBy=[];const prHeads=[];for(const token of head.trim().split(/\s+/)){const eq=token.indexOf("=");if(eq<=0)continue;const name=token.slice(0,eq);const value=token.slice(eq+1);if(name==="resume_after"){if(!/(Z|[+-]\d{2}:?\d{2})$/.test(value))continue;const t=new Date(value);if(Number.isNaN(t.getTime()))continue;if(resumeAfter===null||
74
- t.getTime()<resumeAfter.getTime())resumeAfter=t}else if(name==="blocked_by"){for(const key of value.split(",")){if(isTaskKey(key)&&key.trim()===key)blockedBy.push(key)}}else if(name==="pr_head"){const m=/^([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)#(\d+)@([0-9a-fA-F]{7,40})$/.exec(value);if(m)prHeads.push({repo:m[1],number:Number(m[2]),sha:m[3].toLowerCase()})}}if(resumeAfter===null&&blockedBy.length===0&&prHeads.length===0)return null;return{resumeAfter,blockedBy,prHeads}}async function resolveResumeHold(candidate,fetchResult,advancing){
69
+ itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var MARKER_PAIR_RE=/^([^=\s,]+)=([a-z]+)$/;var UPDATED_PAIR_RE=/^([^=\s,]+)=(\d+)$/;function decodeMarkerKey(raw){let key;try{key=decodeURIComponent(raw)}catch{return null}return isTaskKey(key)&&key.trim()===key?key:null}function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;
70
+ const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.exec(body);const byKey=new Map;for(const token of body.trim().split(/\s+/)){for(const part of token.split(",")){const pair=MARKER_PAIR_RE.exec(part);if(!pair)continue;const key=decodeMarkerKey(pair[1]);if(key!==null)byKey.set(key,pair[2])}}const updatedAtByKey=new Map;const u=/<!--\s*OPS_TASK_UPDATED\s([^>]*?)-->/.exec(prefetchSection);if(u&&u[1]!==void 0){for(const token of u[1].trim().split(/\s+/)){for(const part of token.split(",")){const pair=UPDATED_PAIR_RE.
71
+ exec(part);if(!pair)continue;const key=decodeMarkerKey(pair[1]);if(key!==null)updatedAtByKey.set(key,Number(pair[2]))}}}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey,updatedAtByKey}}function shouldSuppressForStatus(advance,snapshot,advancing){if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}if(!snapshot.complete){return{
72
+ suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=advancing.get(advance.outcome);if(expected===void 0){return{suppress:false,
73
+ reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}var RESUME_HOLD_CAP_HOURS=6;
74
+ function parseResumeCondition(raw){const head=/\b[A-Z][A-Z0-9_]*_RESULT\s*:([^|\n]*)/.exec(raw??"")?.[1]??"";let resumeAfter=null;const blockedBy=[];const prHeads=[];for(const token of head.trim().split(/\s+/)){const eq=token.indexOf("=");if(eq<=0)continue;const name=token.slice(0,eq);const value=token.slice(eq+1);if(name==="resume_after"){if(!/(Z|[+-]\d{2}:?\d{2})$/.test(value))continue;const t=new Date(value);if(Number.isNaN(t.getTime()))continue;if(resumeAfter===null||t.getTime()<resumeAfter.
75
+ getTime())resumeAfter=t}else if(name==="blocked_by"){for(const key of value.split(",")){if(isTaskKey(key)&&key.trim()===key)blockedBy.push(key)}}else if(name==="pr_head"){const m=/^([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)#(\d+)@([0-9a-fA-F]{7,40})$/.exec(value);if(m)prHeads.push({repo:m[1],number:Number(m[2]),sha:m[3].toLowerCase()})}}if(resumeAfter===null&&blockedBy.length===0&&prHeads.length===0)return null;return{resumeAfter,blockedBy,prHeads}}async function resolveResumeHold(candidate,fetchResult,advancing){
75
76
  let raw=candidate.outcomeRaw??null;if(raw===null){const result=await fetchResult(candidate.itemId);raw=result?parseOutcomeCode(result):null}const outcome=normalizeOutcomeCode(raw);if(outcome===null||advancing.has(outcome))return null;const condition=parseResumeCondition(raw);if(condition===null)return null;return{taskKey:candidate.taskKey,skill:candidate.skill,outcome,condition,itemId:candidate.itemId,ageMinutes:candidate.ageMinutes,supersededBy:candidate.supersededBy??null}}var HUMAN_HELD_STATUS_CODES=new Set(
76
77
  ["humanjudge","humanwork","datafix","reqwait","spec","hold"]);var DONE_STATUS_ID="default:done";function shaMatches(recorded,current){const c=current.toLowerCase();return c.startsWith(recorded)||recorded.startsWith(c)}async function shouldSuppressForResume(hold,snapshot,lookupPrHead,now=new Date,lookupTaskStatus){if(hold.ageMinutes===null){return{suppress:false,reason:"\u5148\u767A\u306E\u7D4C\u904E\u6642\u9593\u304C\u5206\u304B\u3089\u306A\u3044"}}if(hold.ageMinutes>=RESUME_HOLD_CAP_HOURS*60){return{
77
78
  suppress:false,reason:`\u4E0A\u9650${RESUME_HOLD_CAP_HOURS}\u6642\u9593\u306B\u9054\u3057\u305F`}}if(hold.supersededBy){return{suppress:false,reason:`\u636E\u3048\u7F6E\u3044\u305F\u5F8C\u306B ${hold.supersededBy.skill} \u304C\u540C\u3058\u30BF\u30B9\u30AF\u3092\u6271\u3063\u305F\uFF08item=${hold.supersededBy.itemId}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}const{resumeAfter,blockedBy,prHeads}=hold.condition;if(resumeAfter!==null&&now.getTime()>=resumeAfter.getTime()){return{suppress:false,reason:`\
78
- resume_after\uFF08${resumeAfter.toISOString()}\uFF09\u3092\u904E\u304E\u305F`}}if(blockedBy.length>0){if(snapshot===null||!snapshot.complete||snapshot.windowHours<RESUME_HOLD_CAP_HOURS){return{suppress:false,reason:"blocked_by \u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\uFF08OPS_TASK_STATUS \u304C\u7121\u3044\u30FB\u4E0D\u5B8C\u5168\u30FB\u7A93\u304C\u72ED\u3044\uFF09"}}const moved=blockedBy.find(key=>{const code=snapshot.byKey.get(key);return code!==void 0&&!HUMAN_HELD_STATUS_CODES.has(code)});if(moved!==
79
- void 0){return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${moved} \u304C\u76F4\u8FD1\u306B\u52D5\u3044\u305F\uFF08\u73FE\u5728 ${snapshot.byKey.get(moved)}\uFF09`}}if(lookupTaskStatus!==void 0){for(const key of blockedBy){if(snapshot.byKey.has(key))continue;const statusId=await lookupTaskStatus(key);if(statusId===null){return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${key} \u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u53D6\u5F97\u3067\u304D\u306A\u3044`}}if(statusId===DONE_STATUS_ID){
80
- return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${key} \u304C\u5B8C\u4E86\u3057\u305F`}}}}}for(const pr of prHeads){const current=await lookupPrHead(pr.repo,pr.number);if(current===null){return{suppress:false,reason:`${pr.repo}#${pr.number} \u306E head \u3092\u53D6\u5F97\u3067\u304D\u306A\u3044`}}if(!shaMatches(pr.sha,current)){return{suppress:false,reason:`${pr.repo}#${pr.number} \u306E head \u304C\u5909\u308F\u3063\u305F\uFF08${pr.sha} \u2192 ${current.slice(0,12)}\uFF09`}}}return{
81
- suppress:true,reason:""}}function formatResumeHold(hold){const age=hold.ageMinutes===null?"\u4E0D\u660E":`${hold.ageMinutes}\u5206\u524D`;const parts=[];if(hold.condition.resumeAfter!==null)parts.push(`resume_after=${hold.condition.resumeAfter.toISOString()}`);if(hold.condition.blockedBy.length>0)parts.push(`blocked_by=${hold.condition.blockedBy.join(",")}`);for(const pr of hold.condition.prHeads)parts.push(`pr_head=${pr.repo}#${pr.number}@${pr.sha}`);return`${hold.outcome} ${parts.join(" ")}\uFF08${age}\
82
- / item=${hold.itemId}\uFF09`}function pendingTaskKeys(items){return new Set(items.map(p=>(p.task_key??"").trim()).filter(k=>k!==""))}async function buildDynamicBlocks(src){const now=src.now??new Date;let inflight=null;if(src.processing!==null){inflight={};for(const entry of inflightEntries(src.processing,now,src.staleHours)){inflight[entry.key]=`\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u3067\u3059\uFF08${formatInflightEntry(entry)}\uFF09`}}const pending=src.pending===null?null:[...pendingTaskKeys(src.pending)].
79
+ resume_after\uFF08${resumeAfter.toISOString()}\uFF09\u3092\u904E\u304E\u305F`}}if(blockedBy.length>0){if(snapshot===null||!snapshot.complete||snapshot.windowHours<RESUME_HOLD_CAP_HOURS){return{suppress:false,reason:"blocked_by \u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\uFF08OPS_TASK_STATUS \u304C\u7121\u3044\u30FB\u4E0D\u5B8C\u5168\u30FB\u7A93\u304C\u72ED\u3044\uFF09"}}const heldAtSec=Math.floor(now.getTime()/1e3)-(hold.ageMinutes+1)*60;const moved=blockedBy.find(key=>{const code=snapshot.byKey.
80
+ get(key);if(code===void 0||HUMAN_HELD_STATUS_CODES.has(code))return false;const updatedAt=snapshot.updatedAtByKey?.get(key);return updatedAt===void 0||updatedAt>=heldAtSec});if(moved!==void 0){return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${moved} \u304C\u76F4\u8FD1\u306B\u52D5\u3044\u305F\uFF08\u73FE\u5728 ${snapshot.byKey.get(moved)}\uFF09`}}if(lookupTaskStatus!==void 0){for(const key of blockedBy){if(snapshot.byKey.has(key))continue;const statusId=await lookupTaskStatus(key);if(statusId===
81
+ null){return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${key} \u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u53D6\u5F97\u3067\u304D\u306A\u3044`}}if(statusId===DONE_STATUS_ID){return{suppress:false,reason:`\u963B\u5BB3\u30BF\u30B9\u30AF ${key} \u304C\u5B8C\u4E86\u3057\u305F`}}}}}for(const pr of prHeads){const current=await lookupPrHead(pr.repo,pr.number);if(current===null){return{suppress:false,reason:`${pr.repo}#${pr.number} \u306E head \u3092\u53D6\u5F97\u3067\u304D\u306A\u3044`}}if(!shaMatches(
82
+ pr.sha,current)){return{suppress:false,reason:`${pr.repo}#${pr.number} \u306E head \u304C\u5909\u308F\u3063\u305F\uFF08${pr.sha} \u2192 ${current.slice(0,12)}\uFF09`}}}return{suppress:true,reason:""}}function formatResumeHold(hold){const age=hold.ageMinutes===null?"\u4E0D\u660E":`${hold.ageMinutes}\u5206\u524D`;const parts=[];if(hold.condition.resumeAfter!==null)parts.push(`resume_after=${hold.condition.resumeAfter.toISOString()}`);if(hold.condition.blockedBy.length>0)parts.push(`blocked_by=${hold.
83
+ condition.blockedBy.join(",")}`);for(const pr of hold.condition.prHeads)parts.push(`pr_head=${pr.repo}#${pr.number}@${pr.sha}`);return`${hold.outcome} ${parts.join(" ")}\uFF08${age} / item=${hold.itemId}\uFF09`}function pendingTaskKeys(items){return new Set(items.map(p=>(p.task_key??"").trim()).filter(k=>k!==""))}async function buildDynamicBlocks(src){const now=src.now??new Date;let inflight=null;if(src.processing!==null){inflight={};for(const entry of inflightEntries(src.processing,now,src.staleHours)){inflight[entry.key]=`\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u3067\u3059\uFF08${formatInflightEntry(entry)}\uFF09`}}const pending=src.pending===null?null:[...pendingTaskKeys(src.pending)].
83
84
  sort();let advanced=src.advancing.size===0?{}:null;const statusUsable=src.taskStatus!==null&&src.taskStatus.complete&&src.taskStatus.windowHours>=RECENT_ADVANCE_WINDOW_HOURS;if(src.recent!==null&&src.advancing.size>0&&statusUsable){advanced={};for(const[key,candidate]of buildRecentCandidateIndex(src.recent,{now})){const advance=await resolveRecentAdvance(candidate,async()=>null,src.advancing);if(advance===null)continue;if(!shouldSuppressForStatus(advance,src.taskStatus,src.advancing).suppress)continue;
84
85
  advanced[key]=`\u76F4\u8FD1\u306B\u540C\u3058\u30B9\u30AD\u30EB\u304C\u72B6\u614B\u3092\u9032\u3081\u3066\u3044\u307E\u3059\uFF08${formatRecentAdvance(advance)}\uFF09`}}return{taken_at:now.toISOString(),inflight,pending,advanced}}function dynamicStepReasons(blocks,taskKey,skill){if(!blocks)return[];const key=taskKey.trim();if(key==="")return[];const reasons=[];const inflight=blocks.inflight?.[key];if(inflight!==void 0)reasons.push(`${key} \u306F${inflight}`);if(blocks.pending?.includes(key))reasons.
85
86
  push(`${key} \u306F\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061\uFF08pending\uFF09\u306B\u5C45\u307E\u3059`);const advanced=skill.trim()===""?void 0:blocks.advanced?.[advanceKey(key,skill)];if(advanced!==void 0)reasons.push(`${key} \u306F${advanced}`);return reasons}function unavailableChecks(blocks){if(blocks===null)return["\u51E6\u7406\u4E2D","\u30AD\u30E5\u30FC\u5F85\u3061","\u76F4\u8FD1\u3067\u72B6\u614B\u3092\u9032\u3081\u305F"];const out=[];if(blocks.inflight===null)out.push("\u51E6\u7406\u4E2D");
@@ -0,0 +1,18 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ function isAiUnavailable(outcome){return outcome==="unavailable"||outcome==="rate-limited"||outcome==="network-down"}function needsHumanToRestoreAi(outcome){return outcome==="unavailable"}function aiUnavailableLabel(outcome){if(outcome==="rate-limited")return"\u5168AI\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8";if(outcome==="network-down")return"\u30DB\u30B9\u30C8\u5074\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u969C\u5BB3";return"AI \u304C1\u3064\u3082\u4F7F\u3048\u306A\u3044\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u7B49\uFF09"}
4
+ var SERVER_AI_TYPES=["claude","gemini","codex","copilot"];function isServerAiType(value){return SERVER_AI_TYPES.includes(value)}var NoopEngine=class{constructor(note="\uFF08noop \u30A8\u30F3\u30B8\u30F3: AI \u306F\u8D77\u52D5\u3057\u3066\u3044\u307E\u305B\u3093\uFF09"){this.note=note}note;name="noop";run(req){const output=[`[noop] prompt: ${req.prompt.split("\n").slice(-1)[0]??""}`,`[noop] cwd: ${req.cwd}`,`[noop] ai_type=${req.aiType??"(\u672A\u6307\u5B9A)"} ai_model=${req.aiModel??"(\u672A\u6307\u5B9A)"}`,
5
+ this.note].join("\n");return Promise.resolve({outcome:"ok",usedAi:"noop",serverAiType:null,output})}};var UnknownEngineError=class extends Error{constructor(name,available){super(`\u672A\u77E5\u306E\u30A8\u30F3\u30B8\u30F3\u3067\u3059: ${name}\uFF08\u5229\u7528\u3067\u304D\u308B\u306E\u306F ${available.join(" / ")}\uFF09`)}};var ENGINE_NAMES=["cli","noop"];function assertKnownEngine(name){if(!ENGINE_NAMES.includes(name)){throw new UnknownEngineError(name,ENGINE_NAMES)}}var EngineNotConfiguredError=class extends Error{constructor(){
6
+ super('\u5B9F\u884C\u30A8\u30F3\u30B8\u30F3\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\n \u5B9F AI \u3092\u8D77\u52D5\u3059\u308B\u306A\u3089 --engine cli\uFF08\u8A2D\u5B9A\u306A\u3089 "engine": "cli"\uFF09\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u9AA8\u683C\u3060\u3051\u3092\u691C\u8A3C\u3057\u305F\u3044\u5834\u5408\u306F --engine noop \u3092**\u660E\u793A**\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u26A0\uFE0F noop \u306F AI \u30921\u3064\u3082\u8D77\u52D5\u305B\u305A\u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3057\u307E\u3059\u3002**\u5B9F\u30AD\u30E5\u30FC\uFF08\u672C\u756A\u306E TWP \u7B49\uFF09\u3078\u5411\u3051\u306A\u3044\u3053\u3068**\n \u5B9A\u671F\u7531\u6765\u306E\u30A2\u30A4\u30C6\u30E0\u306A\u3089\u67A0\u307E\u3067\u6D88\u5316\u3055\u308C\u3001\u305D\u306E\u7A93\u306E\u30EA\u30EA\u30FC\u30B9\u30FB\u30DE\u30FC\u30B8\u7B49\u306E\u5B9A\u671F\u51E6\u7406\u304C\u767A\u706B\u3057\u306A\u304F\u306A\u308A\u307E\u3059\u3002')}};var MAX_SCAN_BYTES=512*1024;var PROGRESS_PREFIX=/^\s*\[\d{2}:\d{2}:\d{2}\]\s*/;var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var TRANSCRIPT_MARKER=/^(>>|<<|⛔|!!)\s/;function stripProgressPrefix(line){return line.replace(PROGRESS_PREFIX,"").trim()}function stripTranscript(raw){return filterLines(raw,true)}function stripModelProse(raw){return filterLines(raw,false)}function filterLines(raw,dropToolLines){const out=[];let inReport=false;for(const line of raw.
7
+ split("\n")){if(line.includes(FINAL_REPORT_BEGIN)){inReport=true;continue}if(line.includes(FINAL_REPORT_END)){inReport=false;continue}if(inReport||line.includes("\u{1F4AC}"))continue;if(dropToolLines&&TRANSCRIPT_MARKER.test(stripProgressPrefix(line)))continue;out.push(line)}return out.join("\n")}var UNTRUSTED_PATTERNS=[/has not been trusted/i,/Ignoring [0-9]+ permissions\.allow entries/i];function isUntrusted(raw){const text=stripTranscript(raw);return UNTRUSTED_PATTERNS.some(p=>p.test(text))}var CLI_FATAL_TEXT_PATTERNS=[
8
+ /^api error\b/i,/^failed to authenticate\b/i];function isCliFatalText(text){const head=text.trim();return CLI_FATAL_TEXT_PATTERNS.some(p=>p.test(head))}var CODEX_PLAIN_LIMIT_PATTERNS=[/^(?:error\s*:\s*)?you(?:'ve| have)? hit (?:your|the) (?:usage|session|weekly|rate|quota|spend) (?:limit|cap)\b.*$/i,/^(?:error\s*:\s*)?(?:your|the) (?:usage|rate|session|quota) limit (?:has been )?(?:reached|exceeded)\b.*$/i,/^(?:error\s*:\s*)?(?:usage|rate|session|quota) limit (?:reached|exceeded)\b.*$/i,/^try again at\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+\d{1,2}(?:st|nd|rd|th)?\b.*$/i,
9
+ /^error\s*:\s*selected model is at capacity\.?(?:\s*please try a different model\.?)?$/i];var CODEX_RUST_LIMIT_PATTERN=/^(?:\d{4}-\d{2}-\d{2}T\S+\s+)?(?:ERROR|WARN)\s+codex(?:[_:]+[a-z0-9-]+){0,8}\s*:\s*.*(?:\b(?:429|529)\b|(?:usage|rate|session)[ ._-]*limit|quota[_ -]?(?:exhausted|exceeded))/i;var COMMON_LIMIT_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}429/i,/429[^0-9].{0,15}(?:too many|rate|throttl)/i,/(?:status|code|http)[^a-z0-9]{0,10}529/i,/529[^0-9].{0,15}overloaded/i,/too many requests/i,
10
+ /max.?spend.?(?:limit|reached|exceeded)/i,/spending.?limit/i,/resets?\s+\d+(?::\d+)?\s*(?:am|pm)/i];var GEMINI_LIMIT_PATTERNS=[/terminalquotaerror/i,/retryablequotaerror/i,/quota_exhausted/i,/model_capacity_exhausted/i,/exhausted your capacity/i,/no capacity available/i,/ratelimitexceeded/i];var CLAUDE_LIMIT_PATTERNS=[/rate.?limit/i,/usage.?limit/i,/session.?limit/i,/quota.?(?:exceeded|reached|limit)/i,/(?:api|server|model).{0,20}overloaded/i,/hit.{0,10}(?:your|the).{0,20}limit/i];function isRateLimited(raw,ai){
11
+ const text=stripTranscript(raw);if(ai==="codex"){for(const line of text.split("\n")){const normalized=stripProgressPrefix(line);if(CODEX_RUST_LIMIT_PATTERN.test(normalized))return true;if(CODEX_PLAIN_LIMIT_PATTERNS.some(p=>fullMatch(p,normalized)))return true}return false}const patterns=[...COMMON_LIMIT_PATTERNS,...ai==="gemini"?GEMINI_LIMIT_PATTERNS:[],...ai==="claude"?CLAUDE_LIMIT_PATTERNS:[]];return patterns.some(p=>p.test(text))}function fullMatch(pattern,value){const m=pattern.exec(value);return m!==
12
+ null&&m[0]===value}var AUTH_ERROR_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}401/i,/(?:status|code|http)[^a-z0-9]{0,10}403/i,/401\s+unauthorized/i,/403\s+forbidden/i,/invalid.{0,10}(?:api.?key|token|credential)/i,/authentication.{0,10}(?:failed|error|invalid)/i,/(?:api.?key|token).{0,10}(?:invalid|expired|missing|rejected)/i,/not logged in/i,/please (?:run )?login/i,/(?:codex|gemini|copilot|claude)\s+login/i,/failed to authenticate/i,/oauth (?:session|token).{0,30}(?:expired|invalid|revoked)/i];
13
+ function isAuthError(raw){const text=stripModelProse(raw);return AUTH_ERROR_PATTERNS.some(p=>p.test(text))}function rateLimitWaitSeconds(raw,now=new Date){const claude=/resets?\s+(\d{1,2}(?::\d{2})?)\s*(am|pm)/i.exec(raw);if(claude){const[hourStr,minStr]=(claude[1]??"").split(":");let hour=Number.parseInt(hourStr??"",10);const minute=minStr===void 0?0:Number.parseInt(minStr,10);const ampm=(claude[2]??"").toLowerCase();if(Number.isInteger(hour)&&Number.isInteger(minute)){if(ampm==="pm"&&hour!==12)
14
+ hour+=12;else if(ampm==="am"&&hour===12)hour=0;const reset=new Date(now);reset.setHours(hour,minute,0,0);if(reset.getTime()<=now.getTime())reset.setDate(reset.getDate()+1);const wait=Math.trunc((reset.getTime()-now.getTime())/1e3);if(wait>0&&wait<=21600)return wait+30}}const gemini=/reset\s+after\s+(\d+)h(\d+)m(?:(\d+)s)?/i.exec(raw);if(gemini){const wait=Number(gemini[1])*3600+Number(gemini[2])*60+Number(gemini[3]??0);if(wait>0&&wait<=86400)return wait+30}const codex=/try again at\s+(\w+)\s+(\d+)(?:st|nd|rd|th)?,?\s*(\d{4})?\s+(\d{1,2}):(\d{2})\s*(AM|PM)/i.
15
+ exec(raw);if(codex){const months={jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};const mon=months[(codex[1]??"").slice(0,3).toLowerCase()];if(mon!==void 0){let hour=Number(codex[4]);const ampm=(codex[6]??"").toLowerCase();if(ampm==="pm"&&hour!==12)hour+=12;else if(ampm==="am"&&hour===12)hour=0;const year=codex[3]?Number(codex[3]):now.getFullYear();const reset=new Date(year,mon,Number(codex[2]),hour,Number(codex[5]),0,0);const wait=Math.trunc((reset.getTime()-now.getTime())/
16
+ 1e3);if(wait>0)return wait+30}}return null}function maxTurnsReached(raw,maxTurns){if(!Number.isFinite(maxTurns)||maxTurns<=0)return false;const matches=raw.match(/完了 \(turns: (\d+)/g);const last=matches?.[matches.length-1];if(last===void 0)return false;const turns=Number.parseInt(/(\d+)$/.exec(last)?.[1]??"",10);return Number.isInteger(turns)&&turns>=maxTurns}function tailForScan(text){return text.length<=MAX_SCAN_BYTES?text:text.slice(text.length-MAX_SCAN_BYTES)}var HINT_MAX_CHARS=200;var HINT_ALLOWED=[
17
+ /^(?:error|fatal|panic|exception|warn(?:ing)?)\b\s*[:!-]?\s/i,/^(?:\d{4}-\d{2}-\d{2}T\S+\s+)?(?:ERROR|WARN)\s+codex(?:[_:]+[a-z0-9-]+){0,8}\s*:/i,/^api error\b/i,/^failed to authenticate\b/i];function failureHint(raw){const text=stripTranscript(tailForScan(raw));const lines=text.split("\n");for(let i=lines.length-1;i>=0;i-=1){const line=stripProgressPrefix(lines[i]??"");if(line===""||!HINT_ALLOWED.some(p=>p.test(line)))continue;const points=Array.from(line);return points.length<=HINT_MAX_CHARS?line:
18
+ `${points.slice(0,HINT_MAX_CHARS).join("")}\u2026`}return""}export{isAiUnavailable,needsHumanToRestoreAi,aiUnavailableLabel,isServerAiType,NoopEngine,UnknownEngineError,assertKnownEngine,EngineNotConfiguredError,isUntrusted,isCliFatalText,isRateLimited,isAuthError,rateLimitWaitSeconds,maxTurnsReached,tailForScan,failureHint};
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __twpCreateRequire } from 'node:module';
3
3
  const require = __twpCreateRequire(import.meta.url);
4
- import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{parseArgv}from"./chunk-RFXIPNKG.js";import"./chunk-2LOT54OO.js";import"./chunk-NJL3H2BB.js";import"./chunk-6FI4ZMZ7.js";import"./chunk-B2D2NO5H.js";import{formatUnknownArgs}from"./chunk-OKATZ4SN.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.97.0":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
4
+ import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{parseArgv}from"./chunk-RFXIPNKG.js";import"./chunk-2LOT54OO.js";import"./chunk-NJL3H2BB.js";import"./chunk-6FI4ZMZ7.js";import"./chunk-B2D2NO5H.js";import{formatUnknownArgs}from"./chunk-OKATZ4SN.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.97.2":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
5
5
 
6
6
  \u4F7F\u3044\u65B9:
7
7
  twp \u5BFE\u8A71 TUI \u3092\u8D77\u52D5
@@ -1574,9 +1574,9 @@ await runConfigure(rest);return}const args=parseArgv(process.argv.slice(2));if(a
1574
1574
  ${HELP}`);process.exitCode=2;return}const autoUpdate=await import("./auto-update-FXXQHBV5.js");autoUpdate.registerRunning();if(args.command==="task-loop"&&args.taskLoopAction!=="capacity"){process.env[autoUpdate.DISABLE_ENV]="1"}else if(args.command!=="update"){autoUpdate.onStartup(VERSION)}if(args.command==="domain"&&args.domain!==void 0){const{runDomain}=await import("./run-7Q3XLJFT.js");process.exitCode=await runDomain({domain:args.domain,...args.operation!==void 0?{operation:args.operation}:
1575
1575
  {},argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes,refresh:args.refresh},version:VERSION});return}if(args.command==="api"){const{runApiCommand}=await import("./api-command-STY4LFJG.js");process.exitCode=await runApiCommand({argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.
1576
1576
  profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes},version:VERSION});return}if(args.command==="update"){const{runUpdate}=await import("./update-2N3V64AA.js");process.exitCode=await runUpdate({...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}if(args.command==="login"||args.command==="logout"||args.command==="whoami"){const{runLogin,runLogout,runWhoami}=await import("./commands-CARE564N.js");
1577
- const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-HKSBT5YG.js");process.exitCode=await runTaskLoop(
1577
+ const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-AJQKYINQ.js");process.exitCode=await runTaskLoop(
1578
1578
  {action:args.taskLoopAction??"run",project:args.project,profile:args.profile,safe:args.safe,daemon:args.daemon,interval:args.interval,maxCycles:args.maxCycles,forceRunner:args.forceRunner,force:args.stopForce,drain:args.stopDrain,engine:args.engine,version:VERSION,verbose:args.verbose,scheduleNow:args.scheduleNow,scheduleCounts:args.scheduleCounts,scheduleGate:args.scheduleGate,scheduleOp:args.scheduleOp,scheduleConfigOp:args.scheduleConfigOp,scheduleId:args.scheduleId,charterOp:args.charterOp,charterInput:args.
1579
1579
  charterFile,charterOutput:args.charterOut,charterRevision:args.charterRevision,settingsOp:args.settingsOp,orientationOp:args.orientationOp,orientationArgs:args.orientationArgs,skillOp:args.skillOp,skillName:args.skillName,skillAll:args.skillAll,skillDir:args.skillDir,skillConfig:args.skillConfig,output:args.output,query:args.query,revisionFrom:args.revisionFrom,revisionTo:args.revisionTo,planOp:args.planOp,capacityOp:args.capacityOp,includeStopped:args.includeStopped,runnerOp:args.runnerOp,runnerId:args.
1580
1580
  runnerTargetId,triggerOp:args.triggerOp,triggerId:args.triggerId,triggerKey:args.triggerKey,triggerLimit:args.triggerLimit,planEmpty:args.planEmpty,planCheck:args.planCheck,yes:args.yes,ais:args.ais,workspace:args.workspace,aiConfigFile:args.aiConfigFile,noAiConfigFile:args.noAiConfigFile});return}if(args.command==="print"){const{runOneShot}=await import("./oneshot-JAA46MUA.js");process.exitCode=await runOneShot({prompt:args.prompt??"",fromStdin:args.promptFromStdin,mode:args.mode??"dev",...args.
1581
- permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:{},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-WICUAA5V.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||
1581
+ permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:{},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-XFKEG3JB.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||
1582
1582
  !process.stdout.isTTY,doctor:args.doctor,version:VERSION})}await main();
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-6M5NUVJJ.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-MBPJV745.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-5YJSWKQG.js";
3
+ import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-6M5NUVJJ.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-REWDCJNB.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-5YJSWKQG.js";
4
4
  import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-3OCV6SOR.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import{NO_PLAN_SESSION,RECENT_ADVANCE_WINDOW_HOURS,buildDynamicBlocks,buildRecentCandidateIndex,createItem,enqueueBlockerRecovery,enqueueDevVerifyForMerged,enqueueReleasePartialMergeRerun,enqueueReleasePhase5Recovery,fileSkillNames,findRecentCandidate,formatInflightEntry,formatPlanResultLine,formatRecentAdvance,formatResumeHold,inflightEntries,inflightStaleHours,
5
- openPlanSession,parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,resolveResumeHold,shouldSuppressForResume,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-J6A575H2.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,stepToItem,zeroTargetDropReasons}from"./chunk-HUKKZ252.js";
5
+ openPlanSession,parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,resolveResumeHold,shouldSuppressForResume,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-QQFCSSFF.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,stepToItem,zeroTargetDropReasons}from"./chunk-HUKKZ252.js";
6
6
  import{redactLoopOutput}from"./chunk-VEEZJNOB.js";import{buildLoopConfig,evaluateOwnership,exportStateDirEnv,localConfigPath,loopStateDir}from"./chunk-INS77QHY.js";import{describeOperations,evaluatePlanGate,planGateStatePath,recordPlanned}from"./chunk-CVX2YWHC.js";import{CapacityReporter}from"./chunk-VYDPW2YO.js";import{formatHookIds,formatHookWiring,runHook,runPrefetch,runPreflight}from"./chunk-TTST7UDR.js";import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,
7
7
  spawnSyncResolved}from"./chunk-FABDZBDZ.js";import{setSkillPrefix,skillCommand,skillFromPrompt,stripSkillCommand}from"./chunk-6CS5L24D.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{AgentLoopApi,describeError,filterByStatus,isPermanent,pick,pickString}from"./chunk-UZUV5FYG.js";import{PRIVATE_PROJECT_REF,isPrivateProjectId,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-RMFLTSOV.js";import"./chunk-BD7O73GK.js";import{ULID_RE,loopProjectIdPolicy,
8
8
  resolveProjectRef}from"./chunk-HVZUXLQ4.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{AuthSession}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import{effectiveApiUrl,resolveProfile}from"./chunk-EDF4U5BT.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{
@@ -299,10 +299,10 @@ const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)re
299
299
  decision.key)return;warned=decision.key;handlers.onWarn(decision.reason);return}done=true;const recorded=writeRestartAttempt(opts.stateDir,opts.projectKey,{from:decision.from,to:decision.to,at:new Date(now()).toISOString()},opts.store);if(!recorded){handlers.onWarn(`\u518D\u8D77\u52D5\u8A18\u9332\u3092\u66F8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${restartAttemptPath(opts.stateDir,opts.projectKey)}\uFF09\u3002\u540C\u3058\u7248\u30C9\u30EA\u30D5\u30C8\u304C\u89E3\u6D88\u3057\u306A\u3044\u5834\u5408\u3001\u518D\u8D77\u52D5\u3092\u7E70\u308A\u8FD4\u3059\u9632\u6CE2\u5824\u304C\u52B9\u304D\u307E\u305B\u3093`)}
300
300
  handlers.onRestart({from:decision.from,to:decision.to})};const timer=setInterval(check,opts.intervalMs??DRIFT_POLL_MS);timer.unref?.();return{stop:()=>{done=true;clearInterval(timer)},check}}import fs8 from"fs";import path6 from"path";var POLL_MS=1e3;var MAX_STOP_BYTES=4096;var MAX_AT_LENGTH=64;function markerPath(lockDir2,kind){return path6.join(lockDir2,kind)}function requestMarker(lockDir2,kind,pid,deps={}){const target=markerPath(lockDir2,kind);const write=deps.writeFileSync??((p,d)=>fs8.writeFileSync(p,d,{flag:"wx",mode:384}));const now=deps.now??(()=>new Date);clearMarker(lockDir2,kind,deps);try{write(target,`${JSON.stringify({pid,at:now().toISOString()})}
301
301
  `);return{ok:true}}catch(err){const e=err;return{ok:false,reason:e.code??"UNKNOWN"}}}function readMarker(lockDir2,kind,deps={}){const target=markerPath(lockDir2,kind);const read=deps.readFileSync??(p=>fs8.readFileSync(p,"utf8"));const size=deps.statSize??(p=>fs8.statSync(p).size);let raw;try{if(size(target)>MAX_STOP_BYTES)return null;raw=read(target)}catch{return null}if(raw.length>MAX_STOP_BYTES)return null;try{const parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return null;const pid=parsed.pid;const at=parsed.at;if(typeof pid!=="number"||!Number.isInteger(pid)||
302
- pid<=0)return null;return{pid,at:sanitizeAt(at)}}catch{return null}}function sanitizeAt(at){if(typeof at!=="string")return"";return at.replace(/[\u0000-\u001f\u007f]/g," ").slice(0,MAX_AT_LENGTH)}function clearMarker(lockDir2,kind,deps={}){const rm=deps.rmSync??(p=>fs8.rmSync(p,{recursive:true,force:true}));try{rm(markerPath(lockDir2,kind))}catch{}}function watchMarker(lockDir2,kind,selfPid,onStop,deps={}){let fired=false;const timer=setInterval(()=>{if(fired)return;const req=readMarker(lockDir2,kind,deps);if(req===null||req.pid!==selfPid)return;fired=true;onStop(req)},deps.intervalMs??POLL_MS);timer.unref?.();return()=>{fired=true;clearInterval(timer)}}function safe(s){return stripTerminalControls(s)}function compactTimestamp(at=new Date){const p2=n=>String(n).padStart(2,"0");return`${at.getFullYear()}${p2(at.getMonth()+1)}${p2(at.getDate())}-${p2(at.getHours())}${p2(at.getMinutes())}${p2(at.getSeconds())}`}async function buildEngine(config,log){if(config.engine==="noop")return new NoopEngine;const{DispatchEngine}=await import("./ai-dispatch-FAX42DSC.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-FAX42DSC.js");const extraHosts=config.
302
+ pid<=0)return null;return{pid,at:sanitizeAt(at)}}catch{return null}}function sanitizeAt(at){if(typeof at!=="string")return"";return at.replace(/[\u0000-\u001f\u007f]/g," ").slice(0,MAX_AT_LENGTH)}function clearMarker(lockDir2,kind,deps={}){const rm=deps.rmSync??(p=>fs8.rmSync(p,{recursive:true,force:true}));try{rm(markerPath(lockDir2,kind))}catch{}}function watchMarker(lockDir2,kind,selfPid,onStop,deps={}){let fired=false;const timer=setInterval(()=>{if(fired)return;const req=readMarker(lockDir2,kind,deps);if(req===null||req.pid!==selfPid)return;fired=true;onStop(req)},deps.intervalMs??POLL_MS);timer.unref?.();return()=>{fired=true;clearInterval(timer)}}function safe(s){return stripTerminalControls(s)}function compactTimestamp(at=new Date){const p2=n=>String(n).padStart(2,"0");return`${at.getFullYear()}${p2(at.getMonth()+1)}${p2(at.getDate())}-${p2(at.getHours())}${p2(at.getMinutes())}${p2(at.getSeconds())}`}async function buildEngine(config,log){if(config.engine==="noop")return new NoopEngine;const{DispatchEngine}=await import("./ai-dispatch-QXSO4EQF.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-QXSO4EQF.js");const extraHosts=config.
303
303
  operations.preflightHosts;return new DispatchEngine(config.ai,log,{workspace:config.workspace,charterFile:config.charterFile??void 0,charterEnabled:config.charterEnabled,...config.charterPrefix===null?{}:{charterPrefix:config.charterPrefix},...config.charterSuffix===null?{}:{charterSuffix:config.charterSuffix},serverPrompts:()=>config.serverPrompts??{},compileCommand:config.compileCommand??void 0,skillOverlayDir:path7.join(config.stateDir,"skill-overlay",projectFileKey(config.projectId)),launcherBin:config.
304
304
  claudeLauncher.bin,...extraHosts.length>0?{preflightHosts:[...DEFAULT_PREFLIGHT_HOSTS,...extraHosts]}:{}})}function lockDir(config){return path7.join(config.stateDir,`task-loop-${projectFileKey(config.projectId)}.lock.d`)}function runnerIdPersisted(stateDir,env=process.env){if((env.RUNNER_ID?.trim()??"")!=="")return true;const file=env.RUNNER_ID_FILE&&env.RUNNER_ID_FILE.trim()!==""?env.RUNNER_ID_FILE:path7.join(stateDir,"runner-id");return fs9.existsSync(file)}async function runTaskLoop(opts){if(opts.
305
- action==="stop")return await stopLoop(opts);if(opts.action==="plan"){if(opts.planOp!=="submit"){process.stderr.write("plan \u306B\u306F submit \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}const{runPlanSubmit}=await import("./plan-submit-4LAFJQP4.js");return runPlanSubmit({file:opts.charterInput,empty:opts.planEmpty===true,check:opts.planCheck===true},{env:process.env,readStdin:()=>fs9.readFileSync(0,"utf8"),stdout:s=>process.stdout.write(s),stderr:s=>process.stderr.write(s)})}
305
+ action==="stop")return await stopLoop(opts);if(opts.action==="plan"){if(opts.planOp!=="submit"){process.stderr.write("plan \u306B\u306F submit \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}const{runPlanSubmit}=await import("./plan-submit-Y3KO33P7.js");return runPlanSubmit({file:opts.charterInput,empty:opts.planEmpty===true,check:opts.planCheck===true},{env:process.env,readStdin:()=>fs9.readFileSync(0,"utf8"),stdout:s=>process.stdout.write(s),stderr:s=>process.stderr.write(s)})}
306
306
  const profile=resolveProfile(opts.profile);let creds;try{creds=new AuthSession(profile.name,profile.apiUrl).loadOrThrow()}catch(err){process.stderr.write(`${err.message}
307
307
  `);return 1}const apiUrl=effectiveApiUrl(profile,creds.api_url);const session=new AuthSession(profile.name,apiUrl);if(opts.action==="capacity"&&opts.capacityOp==="list"){let filterId;if(opts.project!==void 0&&opts.project!==""){try{filterId=(await new ProjectApi(apiUrl,session).resolve(opts.project)).id}catch(err){process.stderr.write(`${err.message}
308
308
  `);return 1}}const api2=new AgentLoopApi({apiUrl,projectId:filterId??"",session});const{runCapacityList}=await import("./capacity-list-command-DDCYRLGV.js");return runCapacityList({get:()=>api2.runnersOverview()},{output:opts.output,query:opts.query,includeStopped:opts.includeStopped===true,projectId:filterId})}const projectRef=opts.project??process.env.TWP_PROJECT??"";if(projectRef===""){process.stderr.write("--project <\u30AD\u30FC|UUID> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08TWP_PROJECT \u3067\u3082\u53EF\uFF09\n");
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{NO_PLAN_SESSION,PLAN_DIR_ENV,PLAN_TOKEN_ENV,checkPlan,fileSkillNames,formatCheck,openPlanSession,runPlanSubmit}from"./chunk-J6A575H2.js";import"./chunk-HUKKZ252.js";import"./chunk-VEEZJNOB.js";import"./chunk-INS77QHY.js";import"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";
3
+ import{NO_PLAN_SESSION,PLAN_DIR_ENV,PLAN_TOKEN_ENV,checkPlan,fileSkillNames,formatCheck,openPlanSession,runPlanSubmit}from"./chunk-QQFCSSFF.js";import"./chunk-HUKKZ252.js";import"./chunk-VEEZJNOB.js";import"./chunk-INS77QHY.js";import"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-UZUV5FYG.js";import"./chunk-RMFLTSOV.js";
4
4
  import"./chunk-BD7O73GK.js";import"./chunk-II5RVJQN.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{NO_PLAN_SESSION,PLAN_DIR_ENV,PLAN_TOKEN_ENV,checkPlan,fileSkillNames,formatCheck,openPlanSession,runPlanSubmit};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tocca-systems/twp-cli",
3
- "version": "0.97.0",
3
+ "version": "0.97.2",
4
4
  "description": "TWP CLI — Tocca Working Platform の CLI 型統合インターフェース(AIエージェントハーネス)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,17 +0,0 @@
1
- import { createRequire as __twpCreateRequire } from 'node:module';
2
- const require = __twpCreateRequire(import.meta.url);
3
- function isAiUnavailable(outcome){return outcome==="unavailable"||outcome==="rate-limited"||outcome==="network-down"}function needsHumanToRestoreAi(outcome){return outcome==="unavailable"}function aiUnavailableLabel(outcome){if(outcome==="rate-limited")return"\u5168AI\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8";if(outcome==="network-down")return"\u30DB\u30B9\u30C8\u5074\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u969C\u5BB3";return"AI \u304C1\u3064\u3082\u4F7F\u3048\u306A\u3044\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u7B49\uFF09"}
4
- var SERVER_AI_TYPES=["claude","gemini","codex","copilot"];function isServerAiType(value){return SERVER_AI_TYPES.includes(value)}var NoopEngine=class{constructor(note="\uFF08noop \u30A8\u30F3\u30B8\u30F3: AI \u306F\u8D77\u52D5\u3057\u3066\u3044\u307E\u305B\u3093\uFF09"){this.note=note}note;name="noop";run(req){const output=[`[noop] prompt: ${req.prompt.split("\n").slice(-1)[0]??""}`,`[noop] cwd: ${req.cwd}`,`[noop] ai_type=${req.aiType??"(\u672A\u6307\u5B9A)"} ai_model=${req.aiModel??"(\u672A\u6307\u5B9A)"}`,
5
- this.note].join("\n");return Promise.resolve({outcome:"ok",usedAi:"noop",serverAiType:null,output})}};var UnknownEngineError=class extends Error{constructor(name,available){super(`\u672A\u77E5\u306E\u30A8\u30F3\u30B8\u30F3\u3067\u3059: ${name}\uFF08\u5229\u7528\u3067\u304D\u308B\u306E\u306F ${available.join(" / ")}\uFF09`)}};var ENGINE_NAMES=["cli","noop"];function assertKnownEngine(name){if(!ENGINE_NAMES.includes(name)){throw new UnknownEngineError(name,ENGINE_NAMES)}}var EngineNotConfiguredError=class extends Error{constructor(){
6
- super('\u5B9F\u884C\u30A8\u30F3\u30B8\u30F3\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\n \u5B9F AI \u3092\u8D77\u52D5\u3059\u308B\u306A\u3089 --engine cli\uFF08\u8A2D\u5B9A\u306A\u3089 "engine": "cli"\uFF09\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u9AA8\u683C\u3060\u3051\u3092\u691C\u8A3C\u3057\u305F\u3044\u5834\u5408\u306F --engine noop \u3092**\u660E\u793A**\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u26A0\uFE0F noop \u306F AI \u30921\u3064\u3082\u8D77\u52D5\u305B\u305A\u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3057\u307E\u3059\u3002**\u5B9F\u30AD\u30E5\u30FC\uFF08\u672C\u756A\u306E TWP \u7B49\uFF09\u3078\u5411\u3051\u306A\u3044\u3053\u3068**\n \u5B9A\u671F\u7531\u6765\u306E\u30A2\u30A4\u30C6\u30E0\u306A\u3089\u67A0\u307E\u3067\u6D88\u5316\u3055\u308C\u3001\u305D\u306E\u7A93\u306E\u30EA\u30EA\u30FC\u30B9\u30FB\u30DE\u30FC\u30B8\u7B49\u306E\u5B9A\u671F\u51E6\u7406\u304C\u767A\u706B\u3057\u306A\u304F\u306A\u308A\u307E\u3059\u3002')}};var MAX_SCAN_BYTES=512*1024;var PROGRESS_PREFIX=/^\s*\[\d{2}:\d{2}:\d{2}\]\s*/;var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var TRANSCRIPT_MARKER=/^(>>|<<|⛔|!!)\s/;function stripProgressPrefix(line){return line.replace(PROGRESS_PREFIX,"").trim()}function stripTranscript(raw){return filterLines(raw,true)}function stripModelProse(raw){return filterLines(raw,false)}function filterLines(raw,dropToolLines){const out=[];let inReport=false;for(const line of raw.
7
- split("\n")){if(line.includes(FINAL_REPORT_BEGIN)){inReport=true;continue}if(line.includes(FINAL_REPORT_END)){inReport=false;continue}if(inReport||line.includes("\u{1F4AC}"))continue;if(dropToolLines&&TRANSCRIPT_MARKER.test(stripProgressPrefix(line)))continue;out.push(line)}return out.join("\n")}var UNTRUSTED_PATTERNS=[/has not been trusted/i,/Ignoring [0-9]+ permissions\.allow entries/i];function isUntrusted(raw){const text=stripTranscript(raw);return UNTRUSTED_PATTERNS.some(p=>p.test(text))}var CLI_FATAL_TEXT_PATTERNS=[
8
- /^api error\b/i,/^failed to authenticate\b/i];function isCliFatalText(text){const head=text.trim();return CLI_FATAL_TEXT_PATTERNS.some(p=>p.test(head))}var CODEX_PLAIN_LIMIT_PATTERNS=[/^(?:error\s*:\s*)?you(?:'ve| have)? hit (?:your|the) (?:usage|session|weekly|rate|quota|spend) (?:limit|cap)\b.*$/i,/^(?:error\s*:\s*)?(?:your|the) (?:usage|rate|session|quota) limit (?:has been )?(?:reached|exceeded)\b.*$/i,/^(?:error\s*:\s*)?(?:usage|rate|session|quota) limit (?:reached|exceeded)\b.*$/i,/^try again at\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+\d{1,2}(?:st|nd|rd|th)?\b.*$/i];
9
- var CODEX_RUST_LIMIT_PATTERN=/^(?:\d{4}-\d{2}-\d{2}T\S+\s+)?(?:ERROR|WARN)\s+codex(?:[_:]+[a-z0-9-]+){0,8}\s*:\s*.*(?:\b(?:429|529)\b|(?:usage|rate|session)[ ._-]*limit|quota[_ -]?(?:exhausted|exceeded))/i;var COMMON_LIMIT_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}429/i,/429[^0-9].{0,15}(?:too many|rate|throttl)/i,/(?:status|code|http)[^a-z0-9]{0,10}529/i,/529[^0-9].{0,15}overloaded/i,/too many requests/i,/max.?spend.?(?:limit|reached|exceeded)/i,/spending.?limit/i,/resets?\s+\d+(?::\d+)?\s*(?:am|pm)/i];
10
- var GEMINI_LIMIT_PATTERNS=[/terminalquotaerror/i,/retryablequotaerror/i,/quota_exhausted/i,/model_capacity_exhausted/i,/exhausted your capacity/i,/no capacity available/i,/ratelimitexceeded/i];var CLAUDE_LIMIT_PATTERNS=[/rate.?limit/i,/usage.?limit/i,/session.?limit/i,/quota.?(?:exceeded|reached|limit)/i,/(?:api|server|model).{0,20}overloaded/i,/hit.{0,10}(?:your|the).{0,20}limit/i];function isRateLimited(raw,ai){const text=stripTranscript(raw);if(ai==="codex"){for(const line of text.split("\n")){
11
- const normalized=stripProgressPrefix(line);if(CODEX_RUST_LIMIT_PATTERN.test(normalized))return true;if(CODEX_PLAIN_LIMIT_PATTERNS.some(p=>fullMatch(p,normalized)))return true}return false}const patterns=[...COMMON_LIMIT_PATTERNS,...ai==="gemini"?GEMINI_LIMIT_PATTERNS:[],...ai==="claude"?CLAUDE_LIMIT_PATTERNS:[]];return patterns.some(p=>p.test(text))}function fullMatch(pattern,value){const m=pattern.exec(value);return m!==null&&m[0]===value}var AUTH_ERROR_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}401/i,
12
- /(?:status|code|http)[^a-z0-9]{0,10}403/i,/401\s+unauthorized/i,/403\s+forbidden/i,/invalid.{0,10}(?:api.?key|token|credential)/i,/authentication.{0,10}(?:failed|error|invalid)/i,/(?:api.?key|token).{0,10}(?:invalid|expired|missing|rejected)/i,/not logged in/i,/please (?:run )?login/i,/(?:codex|gemini|copilot|claude)\s+login/i,/failed to authenticate/i,/oauth (?:session|token).{0,30}(?:expired|invalid|revoked)/i];function isAuthError(raw){const text=stripModelProse(raw);return AUTH_ERROR_PATTERNS.
13
- some(p=>p.test(text))}function rateLimitWaitSeconds(raw,now=new Date){const claude=/resets?\s+(\d{1,2}(?::\d{2})?)\s*(am|pm)/i.exec(raw);if(claude){const[hourStr,minStr]=(claude[1]??"").split(":");let hour=Number.parseInt(hourStr??"",10);const minute=minStr===void 0?0:Number.parseInt(minStr,10);const ampm=(claude[2]??"").toLowerCase();if(Number.isInteger(hour)&&Number.isInteger(minute)){if(ampm==="pm"&&hour!==12)hour+=12;else if(ampm==="am"&&hour===12)hour=0;const reset=new Date(now);reset.setHours(
14
- hour,minute,0,0);if(reset.getTime()<=now.getTime())reset.setDate(reset.getDate()+1);const wait=Math.trunc((reset.getTime()-now.getTime())/1e3);if(wait>0&&wait<=21600)return wait+30}}const gemini=/reset\s+after\s+(\d+)h(\d+)m(?:(\d+)s)?/i.exec(raw);if(gemini){const wait=Number(gemini[1])*3600+Number(gemini[2])*60+Number(gemini[3]??0);if(wait>0&&wait<=86400)return wait+30}const codex=/try again at\s+(\w+)\s+(\d+)(?:st|nd|rd|th)?,?\s*(\d{4})?\s+(\d{1,2}):(\d{2})\s*(AM|PM)/i.exec(raw);if(codex){const months={
15
- jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};const mon=months[(codex[1]??"").slice(0,3).toLowerCase()];if(mon!==void 0){let hour=Number(codex[4]);const ampm=(codex[6]??"").toLowerCase();if(ampm==="pm"&&hour!==12)hour+=12;else if(ampm==="am"&&hour===12)hour=0;const year=codex[3]?Number(codex[3]):now.getFullYear();const reset=new Date(year,mon,Number(codex[2]),hour,Number(codex[5]),0,0);const wait=Math.trunc((reset.getTime()-now.getTime())/1e3);if(wait>0)return wait+30}}
16
- return null}function maxTurnsReached(raw,maxTurns){if(!Number.isFinite(maxTurns)||maxTurns<=0)return false;const matches=raw.match(/完了 \(turns: (\d+)/g);const last=matches?.[matches.length-1];if(last===void 0)return false;const turns=Number.parseInt(/(\d+)$/.exec(last)?.[1]??"",10);return Number.isInteger(turns)&&turns>=maxTurns}function tailForScan(text){return text.length<=MAX_SCAN_BYTES?text:text.slice(text.length-MAX_SCAN_BYTES)}var HINT_MAX_CHARS=200;var HINT_ALLOWED=[/^(?:error|fatal|panic|exception|warn(?:ing)?)\b\s*[:!-]?\s/i,
17
- /^(?:\d{4}-\d{2}-\d{2}T\S+\s+)?(?:ERROR|WARN)\s+codex(?:[_:]+[a-z0-9-]+){0,8}\s*:/i,/^api error\b/i,/^failed to authenticate\b/i];function failureHint(raw){const text=stripTranscript(tailForScan(raw));const lines=text.split("\n");for(let i=lines.length-1;i>=0;i-=1){const line=stripProgressPrefix(lines[i]??"");if(line===""||!HINT_ALLOWED.some(p=>p.test(line)))continue;const points=Array.from(line);return points.length<=HINT_MAX_CHARS?line:`${points.slice(0,HINT_MAX_CHARS).join("")}\u2026`}return""}export{isAiUnavailable,needsHumanToRestoreAi,aiUnavailableLabel,isServerAiType,NoopEngine,UnknownEngineError,assertKnownEngine,EngineNotConfiguredError,isUntrusted,isCliFatalText,isRateLimited,isAuthError,rateLimitWaitSeconds,maxTurnsReached,tailForScan,failureHint};