@tocca-systems/twp-cli 0.81.0 → 0.83.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 (32) hide show
  1. package/CHANGELOG.public.md +8 -0
  2. package/README.md +1 -1
  3. package/dist/{agent-loop-ZGHJGHFQ.js → agent-loop-W2KS5JJV.js} +1 -1
  4. package/dist/{ai-dispatch-DJ5JT5BE.js → ai-dispatch-CE7RIQL6.js} +1 -1
  5. package/dist/{api-command-IKQCTKPH.js → api-command-KBH7ML2J.js} +1 -1
  6. package/dist/{app-JGYZPOH7.js → app-ORQBEJPS.js} +3 -3
  7. package/dist/{auto-update-worker-5J4XXQ6J.js → auto-update-worker-OIVQGG34.js} +1 -1
  8. package/dist/{chunk-YPULDSJ3.js → chunk-4DY3NU53.js} +2 -2
  9. package/dist/{chunk-5YJAT7HE.js → chunk-4FCPLEZN.js} +1 -1
  10. package/dist/{chunk-KRPJ4UFW.js → chunk-7KFX2TPV.js} +1 -1
  11. package/dist/{chunk-QGJYT4NH.js → chunk-7VMPEAAL.js} +1 -1
  12. package/dist/{chunk-XMPHGOW4.js → chunk-CVX2YWHC.js} +21 -17
  13. package/dist/{chunk-TH3NVRAU.js → chunk-DRERU42W.js} +1 -1
  14. package/dist/{chunk-ZOOEH7ZE.js → chunk-MBPJV745.js} +1 -1
  15. package/dist/{chunk-TVTJRNUC.js → chunk-VON6ODNL.js} +12 -3
  16. package/dist/{chunk-AK7CNRVB.js → chunk-WMIIFPXT.js} +1 -1
  17. package/dist/{chunk-RCUI6WWU.js → chunk-Y24FMUYU.js} +1 -1
  18. package/dist/{chunk-M6FZ62YR.js → chunk-ZPQZLUYY.js} +21 -21
  19. package/dist/cli.js +9 -9
  20. package/dist/{commands-D65LPET6.js → commands-X2FS3DN7.js} +75 -75
  21. package/dist/{commands-ZIRZVBH6.js → commands-XD25HOMA.js} +1 -1
  22. package/dist/{logout-guard-57LHDX6L.js → logout-guard-FCCJSF5V.js} +1 -1
  23. package/dist/{media-KWSFHGAQ.js → media-CTIY3IAB.js} +1 -1
  24. package/dist/{oneshot-TH4PFDWC.js → oneshot-R7BDYFEN.js} +2 -2
  25. package/dist/{plan-submit-4NT4OC7J.js → plan-submit-AZKVMJKV.js} +1 -1
  26. package/dist/{registry-QXXEYQZZ.js → registry-7ETH2NOG.js} +1 -1
  27. package/dist/{run-SUYWHFJS.js → run-OKRSGCIR.js} +1 -1
  28. package/dist/{server-settings-OB7JF757.js → server-settings-GFWQ5ERV.js} +1 -1
  29. package/dist/{setup-FMSAHRGZ.js → setup-DW2H7BDN.js} +1 -1
  30. package/dist/{skill-check-CKLMW2AJ.js → skill-check-JBRUAUID.js} +1 -1
  31. package/dist/{update-ZKZGDGMC.js → update-XUIOLVEL.js} +1 -1
  32. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
3
  import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-IIK77LSC.js";import{NO_PLAN_SESSION,RECENT_ADVANCE_WINDOW_HOURS,ReleaseOutcomeLog,buildDynamicBlocks,buildRecentCandidateIndex,createItem,enqueueBlockerRecovery,enqueueDevVerifyForMerged,enqueueReleasePartialMergeRerun,enqueueReleasePhase5Recovery,fileSkillNames,findRecentCandidate,formatInflightEntry,formatPlanResultLine,formatRecentAdvance,formatResumeHold,inflightEntries,inflightStaleHours,openPlanSession,
4
- parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,resolveResumeHold,shouldSuppressForResume,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-M6FZ62YR.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-QGRBZ2C2.js";
5
- import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-5YJAT7HE.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,
6
- stepToItem,zeroTargetDropReasons}from"./chunk-QGJYT4NH.js";import{redactLoopOutput}from"./chunk-JUJSF5ZG.js";import{buildLoopConfig,evaluateOwnership,exportStateDirEnv,localConfigPath,loopStateDir}from"./chunk-RCUI6WWU.js";import{describeOperations,evaluatePlanGate,planGateStatePath,recordPlanned}from"./chunk-XMPHGOW4.js";import{CapacityReporter}from"./chunk-VYDPW2YO.js";import{formatHookIds,formatHookWiring,runHook,runPrefetch,runPreflight}from"./chunk-TTST7UDR.js";
4
+ parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,resolveResumeHold,shouldSuppressForResume,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-ZPQZLUYY.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-MBPJV745.js";import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-QGRBZ2C2.js";
5
+ import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-4FCPLEZN.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,
6
+ stepToItem,zeroTargetDropReasons}from"./chunk-7VMPEAAL.js";import{redactLoopOutput}from"./chunk-JUJSF5ZG.js";import{buildLoopConfig,evaluateOwnership,exportStateDirEnv,localConfigPath,loopStateDir}from"./chunk-Y24FMUYU.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";
7
7
  import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,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-O52RKZCC.js";import"./chunk-LDBYJPRD.js";import{PRIVATE_PROJECT_REF,isPrivateProjectId,isPrivateProjectRef,privateProjectId,
8
8
  projectFileKey}from"./chunk-RMFLTSOV.js";import{ULID_RE,loopProjectIdPolicy,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";
9
9
  import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs9 from"fs";import path7 from"path";import fs from"fs";import path from"path";var LoopLogger=class{constructor(runnerId,logFile,out=process.stdout,now=()=>new Date){this.runnerId=runnerId;this.out=out;this.now=now;if(logFile){fs.mkdirSync(path.dirname(logFile),{recursive:true});this.stream=fs.createWriteStream(logFile,{flags:"a"})}}runnerId;out;now;stream=null;log(message){const d=this.now();const ts=`${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;const line=`[${ts}] [${this.runnerId}] ${stripTerminalControls(
@@ -98,13 +98,13 @@ return"failed"}stash(itemId,payload){if(!/^[A-Za-z0-9_-]+$/.test(itemId))return
98
98
  continue}try{const ageDays=(now-fs4.statSync(file).mtimeMs)/864e5;if(ageDays>this.config.writebackMaxAgeDays){fs4.rmSync(file,{force:true});this.log.log(` \u26D4 \u9000\u907F\u304B\u3089 ${this.config.writebackMaxAgeDays} \u65E5\u3092\u8D85\u3048\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);continue}}catch{continue}let payload;try{payload=JSON.parse(fs4.readFileSync(file,"utf8"))}catch{fs4.rmSync(file,{force:true});this.log.log(` \u26A0\uFE0F \u9000\u907F\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u3081\u306A\u304B\u3063\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);
99
99
  continue}const{run_id:runId,...rest}=redactStashedPayload(payload);const res=await this.api.update(itemId,rest,runId||this.config.runId);if(res.ok){fs4.rmSync(file,{force:true});this.log.log(` \u2705 \u5B9F\u884C\u7D50\u679C\u3092\u518D\u9001\u3057\u307E\u3057\u305F: item=${itemId}\uFF08status=${payload.status}\uFF09`);if(payload.status==="completed")recorded.push(itemId)}else if(res.status===409){fs4.rmSync(file,{force:true});this.log.log(` \u26A0\uFE0F \u518D\u9001\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08409\u30FB\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC/\u5225\u306E run \u304C\u4FDD\u6301\uFF09: item=${itemId}\
100
100
  \u2192 \u7D50\u679C\u306F\u7834\u68C4\u3057\u307E\u3059`)}else if(res.status!==null&&res.status>=400&&res.status<500&&res.status!==408&&res.status!==429){fs4.rmSync(file,{force:true});this.log.log(` \u26D4 \u30B5\u30FC\u30D0\u306B\u6052\u4E45\u7684\u306B\u62D2\u5426\u3055\u308C\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3059\uFF08http=${res.status}\uFF09: item=${itemId}`)}else{this.log.log(` \u26A0\uFE0F \u518D\u9001\u306B\u5931\u6557\uFF08${describeError(res)}\uFF09: item=${itemId}\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\
101
- \u884C\u3057\u307E\u3059`)}}return recorded}};var PLAN_SUPPRESS_REASONS={"step \u306E\u5F62\u304C\u4E0D\u6B63":"invalid_step","\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0":"placeholder_key","release-deploy \u306E\u7A7A\u632F\u308A\u9632\u6B62":"release_deploy_guard","\u5BFE\u8C610\u4EF6":"zero_target","\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D":"inflight","\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061":"already_pending","\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC":"duplicate_in_\
102
- plan","\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B":"human_ball","\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F":"recently_advanced","\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB":"resume_pending","\u6642\u9593\u5E2F\u30B2\u30FC\u30C8":"schedule_gate","\u8A08\u753B\u30ED\u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406":"lock_lost","\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C":"exclusive_skill"};var ENQUEUE_ERROR_PREFIX="\u6295\u5165\u30A8\u30E9\u30FC: ";
101
+ \u884C\u3057\u307E\u3059`)}}return recorded}};var PLAN_SUPPRESS_REASONS={"step \u306E\u5F62\u304C\u4E0D\u6B63":"invalid_step","\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0":"placeholder_key","\u5BFE\u8C610\u4EF6":"zero_target","\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D":"inflight","\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061":"already_pending","\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC":"duplicate_in_plan","\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B":"human_ball","\u524D\u56DE\u304C\u72B6\u614B\u3092\
102
+ \u9032\u3081\u305F":"recently_advanced","\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB":"resume_pending","\u6642\u9593\u5E2F\u30B2\u30FC\u30C8":"schedule_gate","\u8A08\u753B\u30ED\u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406":"lock_lost","\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C":"exclusive_skill"};var PLAN_GUARD_REASON_SUFFIX=" \u306E\u7A7A\u632F\u308A\u9632\u6B62";var PLAN_GUARD_REASON_CODE="release_deploy_guard";var ENQUEUE_ERROR_PREFIX="\u6295\u5165\u30A8\u30E9\u30FC: ";
103
103
  var MAX_STEPS=100;var MAX_SCHEDULED=100;var MAX_CONTRACT_LINES=20;var MAX_CONTRACT_LINE_CHARS=1e3;var MAX_LABEL_CHARS=300;var MAX_DETAIL_CHARS=500;var MAX_TASK_KEY_CHARS=64;function clip(value,max){const s=(value??"").trim();return s===""?null:s.slice(0,max)}function dropToStep(drop){const base={task_key:clip(drop.task_key,MAX_TASK_KEY_CHARS),label:clip(drop.skill,MAX_LABEL_CHARS),item_id:null};if(drop.reason.startsWith(ENQUEUE_ERROR_PREFIX)){return{...base,outcome:"error",reason:"enqueue_error",
104
- detail:clip(redactLoopOutput(drop.reason.slice(ENQUEUE_ERROR_PREFIX.length)),MAX_DETAIL_CHARS)}}const code=PLAN_SUPPRESS_REASONS[drop.reason];return{...base,outcome:"suppressed",reason:code??"other",detail:code===void 0?clip(redactLoopOutput(drop.reason),MAX_DETAIL_CHARS):null}}function extractContractLines(output){const lines=[...output.matchAll(/^.*\b[A-Z][A-Z0-9_]*_RESULT:.*$/gm)].map(m=>m[0].trim().slice(0,MAX_CONTRACT_LINE_CHARS)).filter(l=>l!=="");return lines.slice(-MAX_CONTRACT_LINES)}function standaloneRecord(result,scheduled){
105
- return{result,ai_type:null,ai_model:null,cost_usd:null,tokens_in:null,tokens_out:null,turns:null,duration_ms:null,final_report:null,contract_lines:[],steps:[],scheduled:scheduled.slice(0,MAX_SCHEDULED)}}function planRecord(input){const{engine,summary}=input;const metrics=engine?.metrics;const steps=[...input.enqueuedSteps.map(s=>({outcome:"enqueued",task_key:clip(s.task_key,MAX_TASK_KEY_CHARS),label:clip(s.label,MAX_LABEL_CHARS),item_id:s.item_id,reason:null,detail:null})),...(summary?.dropped??
106
- []).map(dropToStep)];const output=redactLoopOutput(engine?.output??"");return{result:input.result,ai_type:engine?.serverAiType??null,ai_model:null,cost_usd:metrics?.costUsd??null,tokens_in:metrics?.tokensIn??null,tokens_out:metrics?.tokensOut??null,turns:metrics?.turns??null,duration_ms:input.durationMs===null?null:Math.max(0,Math.trunc(input.durationMs)),final_report:output.trim()===""?null:truncateResult(output),contract_lines:extractContractLines(output),steps:steps.slice(0,MAX_STEPS),scheduled:input.
107
- scheduled.slice(0,MAX_SCHEDULED)}}import{execFile}from"child_process";async function lookupPrHead(repo,number,timeoutMs=15e3){if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo)||!Number.isInteger(number)||number<=0)return null;const viaGh=await run("gh",["api",`repos/${repo}/pulls/${number}`,"--jq",".head.sha"],timeoutMs);const ghSha=/^([0-9a-f]{40})\s*$/.exec(viaGh??"")?.[1];if(ghSha)return ghSha;const viaGit=await run("git",["ls-remote",`https://github.com/${repo}.git`,`refs/pull/${number}/head`],timeoutMs);return/^([0-9a-f]{40})\s/m.
104
+ detail:clip(redactLoopOutput(drop.reason.slice(ENQUEUE_ERROR_PREFIX.length)),MAX_DETAIL_CHARS)}}const code=PLAN_SUPPRESS_REASONS[drop.reason]??(drop.reason.endsWith(PLAN_GUARD_REASON_SUFFIX)?PLAN_GUARD_REASON_CODE:void 0);return{...base,outcome:"suppressed",reason:code??"other",detail:code===void 0?clip(redactLoopOutput(drop.reason),MAX_DETAIL_CHARS):null}}function extractContractLines(output){const lines=[...output.matchAll(/^.*\b[A-Z][A-Z0-9_]*_RESULT:.*$/gm)].map(m=>m[0].trim().slice(0,MAX_CONTRACT_LINE_CHARS)).
105
+ filter(l=>l!=="");return lines.slice(-MAX_CONTRACT_LINES)}function standaloneRecord(result,scheduled){return{result,ai_type:null,ai_model:null,cost_usd:null,tokens_in:null,tokens_out:null,turns:null,duration_ms:null,final_report:null,contract_lines:[],steps:[],scheduled:scheduled.slice(0,MAX_SCHEDULED)}}function planRecord(input){const{engine,summary}=input;const metrics=engine?.metrics;const steps=[...input.enqueuedSteps.map(s=>({outcome:"enqueued",task_key:clip(s.task_key,MAX_TASK_KEY_CHARS),label:clip(
106
+ s.label,MAX_LABEL_CHARS),item_id:s.item_id,reason:null,detail:null})),...(summary?.dropped??[]).map(dropToStep)];const output=redactLoopOutput(engine?.output??"");return{result:input.result,ai_type:engine?.serverAiType??null,ai_model:null,cost_usd:metrics?.costUsd??null,tokens_in:metrics?.tokensIn??null,tokens_out:metrics?.tokensOut??null,turns:metrics?.turns??null,duration_ms:input.durationMs===null?null:Math.max(0,Math.trunc(input.durationMs)),final_report:output.trim()===""?null:truncateResult(
107
+ output),contract_lines:extractContractLines(output),steps:steps.slice(0,MAX_STEPS),scheduled:input.scheduled.slice(0,MAX_SCHEDULED)}}import{execFile}from"child_process";async function lookupPrHead(repo,number,timeoutMs=15e3){if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo)||!Number.isInteger(number)||number<=0)return null;const viaGh=await run("gh",["api",`repos/${repo}/pulls/${number}`,"--jq",".head.sha"],timeoutMs);const ghSha=/^([0-9a-f]{40})\s*$/.exec(viaGh??"")?.[1];if(ghSha)return ghSha;const viaGit=await run("git",["ls-remote",`https://github.com/${repo}.git`,`refs/pull/${number}/head`],timeoutMs);return/^([0-9a-f]{40})\s/m.
108
108
  exec(viaGit??"")?.[1]??null}function run(file,args,timeoutMs){return new Promise(resolve=>{execFile(file,args,{timeout:timeoutMs,env:{...process.env,GIT_TERMINAL_PROMPT:"0",GH_PROMPT_DISABLED:"1"}},(err,stdout)=>resolve(err?null:String(stdout)))})}var USER_ID_RE=/^[A-Za-z0-9._-]{1,64}$/;var ProjectApi=class{constructor(apiUrl,session,fetchImpl=httpFetch){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl}apiUrl;session;fetchImpl;async resolve(ref){if(isPrivateProjectRef(ref))return this.resolvePrivate();return resolveProjectRef(ref,path8=>this.get(path8),loopProjectIdPolicy)}async resolvePrivate(){const res=await this.get("/api/v2/user");if(!res.ok){throw new Error(`\u30ED\u30B0\u30A4\u30F3\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08HTTP ${res.
109
109
  status}\uFF09\u3002\u500B\u4EBA\u30AD\u30E5\u30FC\u3092\u56DE\u3059\u306B\u306F \`twp login\` \u304C\u5FC5\u8981\u3067\u3059\u3002\u63A5\u7D9A\u5148\u3068\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}const userId=res.json?.user?.id;if(typeof userId!=="string"||!USER_ID_RE.test(userId)){throw new Error(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u30E6\u30FC\u30B6\u30FCID\u3092\u500B\u4EBA\u30AD\u30E5\u30FC\u306EID\u306B\u4F7F\u3048\u307E\u305B\u3093\uFF08${String(
110
110
  userId).slice(0,60)}\uFF09\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return{id:privateProjectId(userId),code:PRIVATE_PROJECT_REF,name:"\u500B\u4EBA\u30BF\u30B9\u30AF"}}async countByStatus(projectId,statusId){const res=await this.get(`/api/v2/projects/${projectId}/tasks?status_id=${encodeURIComponent(statusId)}&limit=1`);if(!res.ok){return{total:null,error:res.status===null?res.error??"\u901A\u4FE1\u5931\u6557":`HTTP ${res.status}`}}const total=res.json?.
@@ -196,52 +196,52 @@ setRecord("error",null);return"ok"}const unchecked=unavailableChecks(blocks);con
196
196
  ${line}
197
197
  `)}catch{}};if(submitted?.empty===true){log.log("\u8A08\u753BAI\u306F\u7A7A\u306E\u8A08\u753B\uFF080\u4EF6\uFF09\u3092\u63D0\u51FA\u3057\u307E\u3057\u305F");recordResult({source:"submit",empty:true,planned:0,enqueued:0,dropped:[],unchecked});setRecord("empty",null);this.lastPlanWasEmpty=true;return"ok"}if(submitted!==null){log.log(`\u63D0\u51FA\u3055\u308C\u305F\u8A08\u753B\u3092\u4F7F\u3044\u307E\u3059\uFF08plan submit\u30FB${submitted.plan.steps.length}\u4EF6\u30FB${submitted.submitted_at}\uFF09`)}else{
198
198
  log.log("\u8A08\u753B\u306E\u63D0\u51FA\u304C\u7121\u3044\u305F\u3081\u3001\u5FDC\u7B54\u306E\u6587\u7AE0\u304B\u3089\u8A08\u753B\u3092\u53D6\u308A\u51FA\u3057\u307E\u3059")}const plan=submitted?.plan??extractPlanJson(result.output);const source=submitted!==null?"submit":plan?"text":"none";if(!plan||plan.steps.length===0){log.log("\u8A08\u753B\u306Bsteps\u304C\u3042\u308A\u307E\u305B\u3093");recordResult({source,empty:true,planned:0,enqueued:0,dropped:[],unchecked});setRecord(plan?"empty":"json_\
199
- not_found",null);this.lastPlanWasEmpty=true;return"ok"}const verifyBacklog=parseOpsCount(prefetchSection,"verify");const devVerifyPlanned=plan.steps.filter(s=>(s.skill??"").trim()==="dev-verify").length;const releaseDeployDrop=releaseDeployDropReason(verifyBacklog,devVerifyPlanned);if(releaseDeployDrop!==null&&plan.steps.some(s=>normalizeSkillName(s.skill??"")==="release-deploy")){log.log(` release-deploy \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u7A7A\u632F\u308A\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${releaseDeployDrop}`)}
200
- const zeroTargetDrops=zeroTargetDropReasons(prefetchSection,config.operations.zeroTargetGates);for(const[skill,reason]of zeroTargetDrops){if(plan.steps.some(s=>normalizeSkillName(s.skill??"")===skill)){log.log(` ${skill} \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u5BFE\u8C61\u8AAD\u307F\u66FF\u3048\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${reason}`)}}const processing=await this.deps.api.processingSnapshot();const inflightKeys=new Set;if(processing===null){log.log(" \u26A0\uFE0F \u51E6\u7406\u4E2D\
201
- \u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u540C\u4E00\u30BF\u30B9\u30AF\u306E\u4E8C\u91CD\u7740\u624B\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09")}else{const entries=inflightEntries(processing,new Date,inflightStaleHours(config.aiTimeoutSec));for(const entry of entries)inflightKeys.add(entry.key);if(entries.length>
202
- 0){log.log(" \u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u306E task_key\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of entries)log.log(` - ${formatInflightEntry(entry)}`)}}let pendingCache=null;let pendingFetched=false;const pendingOnce=async()=>{if(!pendingFetched){pendingFetched=true;pendingCache=await this.deps.api.pendingSnapshot()}return pendingCache};let pendingKeys=null;let pendingKeysResolved=false;const queuedPendingKeys=async()=>{
203
- if(pendingKeysResolved)return pendingKeys;pendingKeysResolved=true;const pending=await pendingOnce();if(pending===null){log.log(" \u26A0\uFE0F pending \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u30AD\u30E5\u30FC\u5F85\u3061\u30AD\u30FC\u306E\u7A4D\u307F\u76F4\u3057\u6291\u6B62\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");return null}pendingKeys=pendingTaskKeys(
204
- pending);return pendingKeys};let exclusiveQueued=null;let exclusiveFetched=false;const exclusiveInflight=async()=>{if(exclusiveFetched)return exclusiveQueued;exclusiveFetched=true;const pending=await pendingOnce();if(pending===null&&processing===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");
205
- return null}if(pending===null||processing===null){log.log(` \u26A0\uFE0F ${pending===null?"pending":"processing"} \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u305D\u306E\u3076\u3093\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F\u7DE9\u307F\u307E\u3059`)}const entries=exclusiveInflightEntries([{status:"processing",items:processing??[]},{status:"pending",items:pending??[]}],{staleHours:inflightStaleHours(
206
- config.aiTimeoutSec)});const exclusive=entries.filter(e=>config.ai.isExclusiveSkill(e.skill));if(exclusive.length>0){log.log(" \u65E2\u306B\u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u306E\u6392\u4ED6\u30B9\u30AD\u30EB\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of exclusive)log.log(` - ${formatExclusiveEntry(entry)}`)}exclusiveQueued=new Set(exclusive.map(e=>e.skill));return exclusiveQueued};let recentCandidates=null;let recentFetched=false;
207
- let resultFetchBudget=5;const recentCandidateFor=async(taskKey,skill)=>{if(!recentFetched){recentFetched=true;const items=await this.deps.api.completedSince(windowStartMicros(new Date));if(items===null){log.log(" \u26A0\uFE0F \u76F4\u8FD1\u306E\u5B9F\u884C\u53F0\u5E33\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u300C\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F\uFF0F\u518D\u958B\u6761\u4EF6\u4ED8\u304D\u3067\u636E\u3048\u7F6E\u3044\u305F\u5834\u5408\u306E\u518D\u6295\u5165\u6291\u6B62\u300D\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09")}else{
208
- recentCandidates=buildRecentCandidateIndex(items);log.log(` \u76F4\u8FD1${RECENT_ADVANCE_WINDOW_HOURS}\u6642\u9593\u306B\u540C\u4E00\u30BF\u30B9\u30AF\u3092\u6271\u3063\u305F\u5B9F\u884C: ${recentCandidates.size}\u4EF6`)}}if(recentCandidates===null)return null;return findRecentCandidate(recentCandidates,taskKey,skill)};const resultCache=new Map;const fetchResultFor=taskKey=>async itemId=>{if(resultCache.has(itemId))return resultCache.get(itemId)??null;if(resultFetchBudget<=0)return null;resultFetchBudget-=
209
- 1;const res=await this.deps.api.getItem(itemId);if(!res.ok){log.log(` \u26A0\uFE0F \u76F4\u8FD1\u30A2\u30A4\u30C6\u30E0\u306E\u7D50\u679C\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002${taskKey} \u306E\u518D\u6295\u5165\u306F\u6291\u6B62\u3057\u307E\u305B\u3093`);return null}const result2=res.json?.item?.result??null;resultCache.set(itemId,result2);return result2};const recentAdvanceFor=async(taskKey,skill)=>{if(config.operations.advancingOutcomes.
210
- size===0)return null;const candidate=await recentCandidateFor(taskKey,skill);if(candidate===null)return null;return resolveRecentAdvance(candidate,fetchResultFor(taskKey),config.operations.advancingOutcomes)};const resumeHoldFor=async(taskKey,skill)=>{const candidate=await recentCandidateFor(taskKey,skill);if(candidate===null)return null;return resolveResumeHold(candidate,fetchResultFor(taskKey),config.operations.advancingOutcomes)};const prHeadCache=new Map;const prHeadLookup=async(repo,n)=>{const key=`${repo}\
211
- #${n}`;if(prHeadCache.has(key))return prHeadCache.get(key)??null;const sha=await(this.deps.prHeadLookup??lookupPrHead)(repo,n);if(sha===null)log.log(` \u26A0\uFE0F ${key} \u306E head \u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08pr_head \u6761\u4EF6\u306F\u6210\u7ACB\u6271\u3044\uFF1D\u6291\u6B62\u3057\u307E\u305B\u3093\uFF09`);prHeadCache.set(key,sha);return sha};const exclusiveEnqueued=new Set;const enqueuedTaskKeys=new Set;let enqueued=0;const dropped=[];let lockLostMidway=false;
212
- for(const[stepIndex,step]of plan.steps.entries()){const item=stepToItem(step,config.ai);if(!item){dropped.push({skill:String(step.skill??""),task_key:null,reason:"step \u306E\u5F62\u304C\u4E0D\u6B63"});continue}if(!/^[a-z][a-z0-9-]*$/.test(step.skill)){log.log(` \u26A0\uFE0F \u30B9\u30AD\u30EB\u540D\u304C\u60F3\u5B9A\u306E\u6587\u5B57\u7A2E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF08skill='${step.skill}'\uFF09\u3002\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3068\u30AB\u30C6\u30B4\u30EA\u5224\u5B9A\u304C\u52B9\u304D\u307E\u305B\u3093`)}
213
- const placeholder=placeholderTaskKey(step.args??"");if(placeholder!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\uFF09: ${step.skill} \u2014 args \u306B '${placeholder}' \u304C\u6B8B\u3063\u3066\u3044\u307E\u3059 | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0"});continue}const stepSkill=normalizeSkillName(
214
- step.skill??"");if(stepSkill==="release-deploy"&&releaseDeployDrop!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08release-deploy \u306E\u7A7A\u632F\u308A\u9632\u6B62\uFF09: ${releaseDeployDrop} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"release-deploy \u306E\u7A7A\u632F\u308A\u9632\u6B62"});continue}const zeroTargetReason=zeroTargetDrops.get(stepSkill);if(zeroTargetReason!==void 0){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5BFE\u8C610\u4EF6\uFF09: ${step.
215
- skill} \u2014 ${zeroTargetReason} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u5BFE\u8C610\u4EF6"});continue}if(item.task_key&&inflightKeys.has(item.task_key)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,
216
- reason:"\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D"});continue}if(item.task_key&&(await queuedPendingKeys())?.has(item.task_key)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F pending \u306B\u5C45\u307E\u3059 | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061"});continue}const duplicateKey=duplicateTaskKeyDropReason(
217
- enqueuedTaskKeys,item.task_key);if(duplicateKey!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC\uFF09: ${step.skill} \u2014 ${duplicateKey} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC"});continue}const excludedKey=excludedKeyInArgs(step.args??"",excludeKeys);if(excludedKey!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B\uFF09: ${step.
218
- skill} \u2014 ${excludedKey} \u306F\u672A\u56DE\u7B54\u306E\u8CEA\u554F\u3092\u6301\u3064\u4EBA\u9593\u5F85\u3061\u30BF\u30B9\u30AF | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B"});continue}if(item.task_key){const advance=await recentAdvanceFor(item.task_key,step.skill);if(advance!==null){const gate2=shouldSuppressForStatus(advance,taskStatusSnapshot,config.operations.advancingOutcomes);if(gate2.suppress){log.
219
- log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F ${formatRecentAdvance(advance)} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F"});continue}log.log(` \u6291\u6B62\u3092\u898B\u9001\u308A: ${step.skill} \u2014 ${item.task_key} \u306F ${formatRecentAdvance(advance)} \u3060\u304C ${gate2.reason}\
220
- | ${item.label}`)}}if(item.task_key){const hold=await resumeHoldFor(item.task_key,step.skill);if(hold!==null){const gate2=await shouldSuppressForResume(hold,taskStatusSnapshot,prHeadLookup);if(gate2.suppress){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F ${formatResumeHold(hold)} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB"});
221
- continue}log.log(` \u636E\u3048\u7F6E\u304D\u306E\u518D\u958B: ${step.skill} \u2014 ${item.task_key} \u306F ${formatResumeHold(hold)} \u3060\u304C ${gate2.reason} | ${item.label}`)}}const gate=await this.schedule.gateAllows(step.skill);if(!gate.allowed){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\uFF09: ${step.skill} \u2014 ${gate.reason} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u6642\u9593\u5E2F\u30B2\u30FC\u30C8"});
222
- continue}if(this.planLock.isLost()){log.log(` \u26D4 \u30A8\u30F3\u30AD\u30E5\u30FC\u4E2D\u306B\u8A08\u753B\u30ED\u30C3\u30AF\u3092\u5931\u3044\u307E\u3057\u305F\uFF08reason=${this.planLock.lostReasonText()}\uFF09\u2192 \u3053\u3053\u3067\u4E2D\u6B62\u3057\u307E\u3059\uFF08\u6295\u5165\u6E08\u307F: ${enqueued}\u4EF6\uFF09`);lockLostMidway=true;for(const rest of plan.steps.slice(stepIndex)){dropped.push({skill:String(rest.skill??""),task_key:stepToItem(rest,config.ai)?.task_key||null,reason:"\u8A08\u753B\u30ED\
223
- \u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406"})}break}const exclusiveSkill=config.ai.isExclusiveSkill(step.skill)?normalizeSkillName(step.skill):null;if(exclusiveSkill!==null){if(exclusiveEnqueued.has(exclusiveSkill)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\uFF09: ${step.skill} \u2014 \u540C\u3058\u8A08\u753B\u306B\u65E2\u306B1\u4EF6\u3042\u308A\u307E\u3059 | ${item.label}`);dropped.push({skill:step.skill,
224
- task_key:item.task_key||null,reason:"\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C"});continue}const queuedSkills=await exclusiveInflight();if(queuedSkills?.has(exclusiveSkill)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\uFF09: ${step.skill} \u2014 \u65E2\u306B\u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u306E\u305F\u3081\u7A4D\u307F\u307E\u305B\u3093 | ${item.label}`);dropped.push({skill:step.
225
- skill,task_key:item.task_key||null,reason:"\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C"});continue}}const{itemId,detail}=await createItem(this.deps.api,item);if(itemId){enqueued+=1;enqueuedSteps.push({skill:step.skill,task_key:item.task_key||null,label:item.label,item_id:itemId});if(exclusiveSkill!==null)exclusiveEnqueued.add(exclusiveSkill);if(item.task_key)enqueuedTaskKeys.add(item.task_key)}else{dropped.push({skill:step.skill,task_key:item.task_key||null,reason:`\u6295\
226
- \u5165\u30A8\u30E9\u30FC: ${String(detail).slice(0,200)}`});log.log(` \u8B66\u544A: \u30A8\u30F3\u30AD\u30E5\u30FC\u5931\u6557: ${item.label} \u2014 ${detail}`)}}log.log(`\u8A08\u753B\u5B8C\u4E86: ${enqueued} \u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F`);const summary={source,empty:false,planned:plan.steps.length,enqueued,dropped,unchecked,...lockLostMidway?{aborted:true}:{}};recordResult(summary);setRecord("enqueued",summary);return"ok"}async snapshotDynamicBlocks(taskStatus){
227
- const{config,log,api}=this.deps;try{const advancing=config.operations.advancingOutcomes;const[processing,pending,recent]=await Promise.all([api.processingSnapshot(),api.pendingSnapshot(),advancing.size>0?api.completedSince(windowStartMicros(new Date)):Promise.resolve(null)]);const blocks=await buildDynamicBlocks({processing,pending,recent,taskStatus,advancing,staleHours:inflightStaleHours(config.aiTimeoutSec)});const missing=unavailableChecks(blocks);if(missing.length>0){log.log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306B\u306F\u52B9\u304B\u306A\u3044\
228
- \u691C\u67FB\u304C\u3042\u308A\u307E\u3059\uFF08${missing.join("\u30FB")}\u30FB\u5B9F\u6E2C\u304B\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u5199\u3057\u3092\u53D6\u308C\u305A\uFF09\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306E\u691C\u67FB\u306F\u52B9\u304D\u307E\u3059`)}return blocks}catch(err){log.log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306E\u691C\u67FB\u306B\u4F7F\u3046\u5B9F\u6E2C\u3092\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\uFF09\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306E\u691C\u67FB\u306F\u52B9\u304D\u307E\u3059`);
229
- return null}}async runDequeueLoop(cycle){const{config,log,api,runner}=this.deps;log.separator();log.log("Phase 2: \u30AD\u30E5\u30FC\u304B\u3089\u30C7\u30AD\u30E5\u30FC\u3057\u3066\u9806\u6B21\u5B9F\u884C...");log.separator();let completed=0;let failed=0;let unexecuted=0;let unexecutedNeedsHuman=false;let stepNum=0;let contendedRetry=0;let undetermined=false;let stop=false;this.nothingClaimableBacklog=false;dequeue:for(;;){if(this.draining){log.log("\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081\u3001\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u306F\u53D6\u5F97\u3057\u307E\u305B\u3093\u3002Phase 2 \u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");
230
- stop=true;break}const claimed=await this.claimOne();if(claimed.kind==="undetermined"){undetermined=true;break}if(claimed.kind==="contended"){contendedRetry+=1;if(contendedRetry>=config.contendedMax){log.log(` \u26A0\uFE0F contended \u304C ${contendedRetry} \u56DE\u7D9A\u304D\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u306E\u53D6\u5F97\u3092\u8AE6\u3081\u307E\u3059\uFF08\u4ED6\u6A5F\u304C\u51E6\u7406\u3092\u7D9A\u3051\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u9AD8\u3044\uFF09`);
231
- undetermined=true;break}log.log(` \u2139\uFE0F \u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u5148\u306B\u53D6\u5F97\u3057\u307E\u3057\u305F\uFF08contended\u30FB${contendedRetry}\u56DE\u76EE\uFF09\u30023\u79D2\u5F8C\u306B\u518D\u8A66\u884C\u3057\u307E\u3059`);await this.sleep(3e3);continue}contendedRetry=0;this.nothingClaimableBacklog=claimed.kind==="filtered"&&claimed.by.length>0&&claimed.by.every(b=>b==="prerequisite"||b==="platform");if(claimed.kind==="empty"){log.log("\u30AD\u30E5\u30FC\u306Bpending\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002Pha\
232
- se 2 \u5B8C\u4E86\u3002");break}if(claimed.kind==="filtered"){const reasons=claimed.by.includes("platform")?claimed.by.includes("prerequisite")?"\u524D\u63D0\u672A\u5145\u8DB3\u30FB\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u524D\u63D0\u672A\u5145\u8DB3\u306E\u307F";log.log(this.nothingClaimableBacklog?`\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${reasons}\
233
- \uFF09\u3002Phase 2 \u5B8C\u4E86\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u306F\u8A08\u753B\u3057\u307E\u3059\u3002`:"\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7406\u7531\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u6B21\u30B5\u30A4\u30AF\u30EB\u3082\u8A08\u753B\u3057\u307E\u305B\u3093\uFF09\u3002Phase 2 \u5B8C\u4E86\u3002");break}const item=claimed.item;const itemId=item.item_id??"";const prompt=(item.
234
- prompt??"").trim();const label=item.label??"";if(!itemId||!prompt){log.log(`\u30C7\u30AD\u30E5\u30FC\u7D50\u679C\u306E\u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${JSON.stringify(item).slice(0,200)}`);break}stepNum+=1;log.separator();log.log(`[${stepNum}] ${label}`);log.log(` item_id: ${itemId}`);await runner.beat("dequeue",itemId);log.log(` prompt: ${prompt}`);log.separator();const stopMatch=/^\/stop(?:\s+(\d+))?$/.exec(prompt);if(stopMatch){const res=await api.update(itemId,
235
- {status:"completed"},config.runId);if(res.status===409){log.log(" \u26A0\uFE0F /stop \u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093")}else if(!res.ok){log.log(` \u26D4 /stop \u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09`);log.log(" \u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u56DE\u53CE\u5F8C\u306B\
236
- pending \u3078\u623B\u308B\u305F\u3081\u3001**\u6B21\u56DE\u8D77\u52D5\u6642\u3082\u5373\u505C\u6B62\u3057\u307E\u3059**");log.log(` \u5FA9\u65E7: UI \u304BAPI\u3067 item=${itemId} \u3092 completed / failed \u306B\u3057\u3066\u304F\u3060\u3055\u3044`)}completed+=1;const waitSec=stopMatch[1];if(waitSec){const requested=Number.parseInt(waitSec,10);const capped=Math.min(requested,STOP_WAIT_MAX_SEC);if(capped!==requested){log.log(` \u26A0\uFE0F /stop \u306E\u5F85\u6A5F ${requested}\u79D2 \u306F\u4E0A\u9650 ${STOP_WAIT_MAX_SEC}\
237
- \u79D2 \u306B\u4E38\u3081\u307E\u3059`)}log.log(`[${stepNum}] /stop ${capped} \u2192 ${capped}\u79D2\u9593\u5F85\u6A5F\u3057\u307E\u3059...`);await this.sleepUnlessDraining(capped*1e3);log.log(`[${stepNum}] \u5F85\u6A5F\u5B8C\u4E86\u3002\u6B21\u306E\u30A2\u30A4\u30C6\u30E0\u306B\u9032\u307F\u307E\u3059\u3002`);continue}log.log(`[${stepNum}] /stop \u2192 \u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002`);stop=true;break}const skillName=skillFromPrompt(prompt)??"";const promptPlaceholder=placeholderTaskKey(
238
- stripSkillCommand(prompt));if(promptPlaceholder!==null){const reason=`\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306E\u307E\u307E\u3067\u3059\uFF08'${promptPlaceholder}'\uFF09\u3002\u8A08\u753B\u6642\u306E\u96DB\u5F62\u304C\u7F6E\u63DB\u3055\u308C\u3066\u3044\u307E\u305B\u3093`;log.log(` \u26D4 \u5B9F\u884C\u3057\u307E\u305B\u3093: ${reason}`);const res=await api.update(itemId,{status:"failed",error_message:reason},config.runId);if(res.status===409){log.log(
239
- ` \u26A0\uFE0F \u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093: item=${itemId}`)}else if(!res.ok){log.log(` \u26A0\uFE0F failed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09: item=${itemId}`)}else{log.log(`[${stepNum}] ${label} \u2192 \u5931\u6557 [ai=-] (0s)`);await this.schedule.recordByItem(itemId,"failed")}failed+=
240
- 1;continue}if(skillName){const gate=await this.schedule.gateAllows(skillName);if(!gate.allowed){stepNum-=1;if(this.deferredIds.has(itemId)){log.log(" \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3067\u5F85\u6A5F\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u518D\u3073\u30C7\u30AD\u30E5\u30FC\u3055\u308C\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306EPhase 2\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");break}const res=await api.update(itemId,{status:"pending"},config.runId);if(res.status===
241
- 409){log.log(` \u26A0\uFE0F \u5F8C\u56DE\u3057\u306B\u3057\u3088\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`);log.log(" \u81EA\u5206\u306E claim \u306F\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\u3002**\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u5B9F\u884C\u305B\u305A\u653E\u68C4\u3057\u307E\u3059**");continue}if(res.ok){this.deferredIds.add(itemId);log.log(
242
- ` \u23F8 \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u306B\u3088\u308A\u5F8C\u56DE\u3057: ${skillName} \u2014 ${gate.reason}`);continue}log.log(" \u26A0\uFE0F pending\u3078\u623B\u305B\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3092\u7121\u8996\u3057\u3066\u3053\u306E\u307E\u307E\u5B9F\u884C\u3057\u307E\u3059");stepNum+=1}}const stepLog=path4.join(config.logDir,`step-${this.timestamp}-${cycle}-${stepNum}.log`);const startedAt=Date.now();const taggedCategory=/#ai:([a-z]+)/.
243
- exec(label)?.[1];this.itemInFlight=itemId;const resolvedSkills=await this.skills.resolve(prompt);const skillOrigins=formatSkillOrigins(resolvedSkills.origins);if(skillOrigins!=="")log.log(` \u30B9\u30AD\u30EB: ${skillOrigins}`);const ownershipWatch=this.startOwnershipWatch(itemId);let result;try{result=await this.engine.run({serverSkills:resolvedSkills.bodies,prompt:buildStepPrompt(config,prompt),promptPrefix:this.cyclePreflightSection,logFile:stepLog,aiType:item.ai_type??void 0,aiModel:item.ai_model??
244
- void 0,aiEffort:item.ai_effort??void 0,timeoutSec:config.aiTimeoutSec,cwd:config.workspace,skill:skillName,...skillName===""&&taggedCategory!==void 0?{category:taggedCategory}:{}})}finally{ownershipWatch.stop();this.itemInFlight=null}writeLogFile(stepLog,skillOrigins===""?result.output:`[skill] ${skillOrigins}
199
+ not_found",null);this.lastPlanWasEmpty=true;return"ok"}const releaseHooks=config.operations.releaseHooks;const releaseGuard=releaseHooks?.planGuard??null;const releaseSkill=releaseHooks?.skill??null;let releaseDeployDrop=null;if(releaseHooks!==null&&releaseGuard!==null){const verifyBacklog=parseOpsCount(prefetchSection,releaseGuard.countField);const devVerifyPlanned=plan.steps.filter(s=>(s.skill??"").trim()===releaseGuard.drainedBy).length;releaseDeployDrop=releaseDeployDropReason(verifyBacklog,
200
+ devVerifyPlanned,releaseGuard);if(releaseDeployDrop!==null&&plan.steps.some(s=>normalizeSkillName(s.skill??"")===releaseHooks.skill)){log.log(` ${releaseHooks.skill} \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u7A7A\u632F\u308A\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${releaseDeployDrop}`)}}const zeroTargetDrops=zeroTargetDropReasons(prefetchSection,config.operations.zeroTargetGates);for(const[skill,reason]of zeroTargetDrops){if(plan.steps.some(s=>normalizeSkillName(s.skill??
201
+ "")===skill)){log.log(` ${skill} \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u5BFE\u8C61\u8AAD\u307F\u66FF\u3048\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${reason}`)}}const processing=await this.deps.api.processingSnapshot();const inflightKeys=new Set;if(processing===null){log.log(" \u26A0\uFE0F \u51E6\u7406\u4E2D\u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u540C\u4E00\u30BF\u30B9\u30AF\u306E\u4E8C\u91CD\u7740\u624B\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09")}else{
202
+ const entries=inflightEntries(processing,new Date,inflightStaleHours(config.aiTimeoutSec));for(const entry of entries)inflightKeys.add(entry.key);if(entries.length>0){log.log(" \u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u306E task_key\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of entries)log.log(` - ${formatInflightEntry(entry)}`)}}let pendingCache=null;let pendingFetched=false;const pendingOnce=async()=>{if(!pendingFetched){
203
+ pendingFetched=true;pendingCache=await this.deps.api.pendingSnapshot()}return pendingCache};let pendingKeys=null;let pendingKeysResolved=false;const queuedPendingKeys=async()=>{if(pendingKeysResolved)return pendingKeys;pendingKeysResolved=true;const pending=await pendingOnce();if(pending===null){log.log(" \u26A0\uFE0F pending \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u30AD\u30E5\u30FC\u5F85\u3061\u30AD\u30FC\u306E\u7A4D\u307F\u76F4\u3057\u6291\u6B62\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");
204
+ return null}pendingKeys=pendingTaskKeys(pending);return pendingKeys};let exclusiveQueued=null;let exclusiveFetched=false;const exclusiveInflight=async()=>{if(exclusiveFetched)return exclusiveQueued;exclusiveFetched=true;const pending=await pendingOnce();if(pending===null&&processing===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\
205
+ \u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");return null}if(pending===null||processing===null){log.log(` \u26A0\uFE0F ${pending===null?"pending":"processing"} \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u305D\u306E\u3076\u3093\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F\u7DE9\u307F\u307E\u3059`)}const entries=exclusiveInflightEntries([
206
+ {status:"processing",items:processing??[]},{status:"pending",items:pending??[]}],{staleHours:inflightStaleHours(config.aiTimeoutSec)});const exclusive=entries.filter(e=>config.ai.isExclusiveSkill(e.skill));if(exclusive.length>0){log.log(" \u65E2\u306B\u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u306E\u6392\u4ED6\u30B9\u30AD\u30EB\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of exclusive)log.log(` - ${formatExclusiveEntry(entry)}`)}exclusiveQueued=
207
+ new Set(exclusive.map(e=>e.skill));return exclusiveQueued};let recentCandidates=null;let recentFetched=false;let resultFetchBudget=5;const recentCandidateFor=async(taskKey,skill)=>{if(!recentFetched){recentFetched=true;const items=await this.deps.api.completedSince(windowStartMicros(new Date));if(items===null){log.log(" \u26A0\uFE0F \u76F4\u8FD1\u306E\u5B9F\u884C\u53F0\u5E33\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u300C\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F\uFF0F\u518D\u958B\u6761\u4EF6\u4ED8\u304D\u3067\u636E\u3048\u7F6E\u3044\u305F\u5834\u5408\u306E\u518D\u6295\u5165\u6291\u6B62\u300D\u306F**\u3053\u306E\u30B5\
208
+ \u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09")}else{recentCandidates=buildRecentCandidateIndex(items);log.log(` \u76F4\u8FD1${RECENT_ADVANCE_WINDOW_HOURS}\u6642\u9593\u306B\u540C\u4E00\u30BF\u30B9\u30AF\u3092\u6271\u3063\u305F\u5B9F\u884C: ${recentCandidates.size}\u4EF6`)}}if(recentCandidates===null)return null;return findRecentCandidate(recentCandidates,taskKey,skill)};const resultCache=new Map;const fetchResultFor=taskKey=>async itemId=>{
209
+ if(resultCache.has(itemId))return resultCache.get(itemId)??null;if(resultFetchBudget<=0)return null;resultFetchBudget-=1;const res=await this.deps.api.getItem(itemId);if(!res.ok){log.log(` \u26A0\uFE0F \u76F4\u8FD1\u30A2\u30A4\u30C6\u30E0\u306E\u7D50\u679C\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002${taskKey} \u306E\u518D\u6295\u5165\u306F\u6291\u6B62\u3057\u307E\u305B\u3093`);return null}const result2=res.json?.item?.result??null;resultCache.
210
+ set(itemId,result2);return result2};const recentAdvanceFor=async(taskKey,skill)=>{if(config.operations.advancingOutcomes.size===0)return null;const candidate=await recentCandidateFor(taskKey,skill);if(candidate===null)return null;return resolveRecentAdvance(candidate,fetchResultFor(taskKey),config.operations.advancingOutcomes)};const resumeHoldFor=async(taskKey,skill)=>{const candidate=await recentCandidateFor(taskKey,skill);if(candidate===null)return null;return resolveResumeHold(candidate,fetchResultFor(
211
+ taskKey),config.operations.advancingOutcomes)};const prHeadCache=new Map;const prHeadLookup=async(repo,n)=>{const key=`${repo}#${n}`;if(prHeadCache.has(key))return prHeadCache.get(key)??null;const sha=await(this.deps.prHeadLookup??lookupPrHead)(repo,n);if(sha===null)log.log(` \u26A0\uFE0F ${key} \u306E head \u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08pr_head \u6761\u4EF6\u306F\u6210\u7ACB\u6271\u3044\uFF1D\u6291\u6B62\u3057\u307E\u305B\u3093\uFF09`);prHeadCache.set(
212
+ key,sha);return sha};const exclusiveEnqueued=new Set;const enqueuedTaskKeys=new Set;let enqueued=0;const dropped=[];let lockLostMidway=false;for(const[stepIndex,step]of plan.steps.entries()){const item=stepToItem(step,config.ai);if(!item){dropped.push({skill:String(step.skill??""),task_key:null,reason:"step \u306E\u5F62\u304C\u4E0D\u6B63"});continue}if(!/^[a-z][a-z0-9-]*$/.test(step.skill)){log.log(` \u26A0\uFE0F \u30B9\u30AD\u30EB\u540D\u304C\u60F3\u5B9A\u306E\u6587\u5B57\u7A2E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF08skill='${step.
213
+ skill}'\uFF09\u3002\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3068\u30AB\u30C6\u30B4\u30EA\u5224\u5B9A\u304C\u52B9\u304D\u307E\u305B\u3093`)}const placeholder=placeholderTaskKey(step.args??"");if(placeholder!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\uFF09: ${step.skill} \u2014 args \u306B '${placeholder}' \u304C\u6B8B\u3063\u3066\u3044\u307E\u3059 | ${item.label}`);dropped.push({skill:step.skill,task_key:item.
214
+ task_key||null,reason:"\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0"});continue}const stepSkill=normalizeSkillName(step.skill??"");if(releaseSkill!==null&&stepSkill===releaseSkill&&releaseDeployDrop!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08${releaseSkill} \u306E\u7A7A\u632F\u308A\u9632\u6B62\uFF09: ${releaseDeployDrop} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:`${releaseSkill} \u306E\u7A7A\u632F\u308A\u9632\u6B62`});
215
+ continue}const zeroTargetReason=zeroTargetDrops.get(stepSkill);if(zeroTargetReason!==void 0){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5BFE\u8C610\u4EF6\uFF09: ${step.skill} \u2014 ${zeroTargetReason} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u5BFE\u8C610\u4EF6"});continue}if(item.task_key&&inflightKeys.has(item.task_key)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\uFF09: ${step.
216
+ skill} \u2014 ${item.task_key} \u306F\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D"});continue}if(item.task_key&&(await queuedPendingKeys())?.has(item.task_key)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F pending \u306B\u5C45\u307E\u3059 | ${item.
217
+ label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061"});continue}const duplicateKey=duplicateTaskKeyDropReason(enqueuedTaskKeys,item.task_key);if(duplicateKey!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC\uFF09: ${step.skill} \u2014 ${duplicateKey} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC"});
218
+ continue}const excludedKey=excludedKeyInArgs(step.args??"",excludeKeys);if(excludedKey!==null){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B\uFF09: ${step.skill} \u2014 ${excludedKey} \u306F\u672A\u56DE\u7B54\u306E\u8CEA\u554F\u3092\u6301\u3064\u4EBA\u9593\u5F85\u3061\u30BF\u30B9\u30AF | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B"});continue}if(item.
219
+ task_key){const advance=await recentAdvanceFor(item.task_key,step.skill);if(advance!==null){const gate2=shouldSuppressForStatus(advance,taskStatusSnapshot,config.operations.advancingOutcomes);if(gate2.suppress){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F\uFF09: ${step.skill} \u2014 ${item.task_key} \u306F ${formatRecentAdvance(advance)} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u524D\u56DE\u304C\u72B6\u614B\
220
+ \u3092\u9032\u3081\u305F"});continue}log.log(` \u6291\u6B62\u3092\u898B\u9001\u308A: ${step.skill} \u2014 ${item.task_key} \u306F ${formatRecentAdvance(advance)} \u3060\u304C ${gate2.reason} | ${item.label}`)}}if(item.task_key){const hold=await resumeHoldFor(item.task_key,step.skill);if(hold!==null){const gate2=await shouldSuppressForResume(hold,taskStatusSnapshot,prHeadLookup);if(gate2.suppress){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB\uFF09: ${step.
221
+ skill} \u2014 ${item.task_key} \u306F ${formatResumeHold(hold)} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u518D\u958B\u6761\u4EF6\u304C\u672A\u6210\u7ACB"});continue}log.log(` \u636E\u3048\u7F6E\u304D\u306E\u518D\u958B: ${step.skill} \u2014 ${item.task_key} \u306F ${formatResumeHold(hold)} \u3060\u304C ${gate2.reason} | ${item.label}`)}}const gate=await this.schedule.gateAllows(step.skill);if(!gate.allowed){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\uFF09: ${step.
222
+ skill} \u2014 ${gate.reason} | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u6642\u9593\u5E2F\u30B2\u30FC\u30C8"});continue}if(this.planLock.isLost()){log.log(` \u26D4 \u30A8\u30F3\u30AD\u30E5\u30FC\u4E2D\u306B\u8A08\u753B\u30ED\u30C3\u30AF\u3092\u5931\u3044\u307E\u3057\u305F\uFF08reason=${this.planLock.lostReasonText()}\uFF09\u2192 \u3053\u3053\u3067\u4E2D\u6B62\u3057\u307E\u3059\uFF08\u6295\u5165\u6E08\u307F: ${enqueued}\u4EF6\uFF09`);lockLostMidway=true;
223
+ for(const rest of plan.steps.slice(stepIndex)){dropped.push({skill:String(rest.skill??""),task_key:stepToItem(rest,config.ai)?.task_key||null,reason:"\u8A08\u753B\u30ED\u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406"})}break}const exclusiveSkill=config.ai.isExclusiveSkill(step.skill)?normalizeSkillName(step.skill):null;if(exclusiveSkill!==null){if(exclusiveEnqueued.has(exclusiveSkill)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\uFF09: ${step.
224
+ skill} \u2014 \u540C\u3058\u8A08\u753B\u306B\u65E2\u306B1\u4EF6\u3042\u308A\u307E\u3059 | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C"});continue}const queuedSkills=await exclusiveInflight();if(queuedSkills?.has(exclusiveSkill)){log.log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\uFF09: ${step.skill} \u2014 \u65E2\u306B\u30AD\
225
+ \u30E5\u30FC/\u5B9F\u884C\u4E2D\u306E\u305F\u3081\u7A4D\u307F\u307E\u305B\u3093 | ${item.label}`);dropped.push({skill:step.skill,task_key:item.task_key||null,reason:"\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C"});continue}}const{itemId,detail}=await createItem(this.deps.api,item);if(itemId){enqueued+=1;enqueuedSteps.push({skill:step.skill,task_key:item.task_key||null,label:item.label,item_id:itemId});if(exclusiveSkill!==null)exclusiveEnqueued.add(exclusiveSkill);if(item.
226
+ task_key)enqueuedTaskKeys.add(item.task_key)}else{dropped.push({skill:step.skill,task_key:item.task_key||null,reason:`\u6295\u5165\u30A8\u30E9\u30FC: ${String(detail).slice(0,200)}`});log.log(` \u8B66\u544A: \u30A8\u30F3\u30AD\u30E5\u30FC\u5931\u6557: ${item.label} \u2014 ${detail}`)}}log.log(`\u8A08\u753B\u5B8C\u4E86: ${enqueued} \u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F`);const summary={source,empty:false,planned:plan.steps.length,enqueued,dropped,
227
+ unchecked,...lockLostMidway?{aborted:true}:{}};recordResult(summary);setRecord("enqueued",summary);return"ok"}async snapshotDynamicBlocks(taskStatus){const{config,log,api}=this.deps;try{const advancing=config.operations.advancingOutcomes;const[processing,pending,recent]=await Promise.all([api.processingSnapshot(),api.pendingSnapshot(),advancing.size>0?api.completedSince(windowStartMicros(new Date)):Promise.resolve(null)]);const blocks=await buildDynamicBlocks({processing,pending,recent,taskStatus,
228
+ advancing,staleHours:inflightStaleHours(config.aiTimeoutSec)});const missing=unavailableChecks(blocks);if(missing.length>0){log.log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306B\u306F\u52B9\u304B\u306A\u3044\u691C\u67FB\u304C\u3042\u308A\u307E\u3059\uFF08${missing.join("\u30FB")}\u30FB\u5B9F\u6E2C\u304B\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u5199\u3057\u3092\u53D6\u308C\u305A\uFF09\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306E\u691C\u67FB\u306F\u52B9\u304D\u307E\u3059`)}return blocks}catch(err){log.
229
+ log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306E\u691C\u67FB\u306B\u4F7F\u3046\u5B9F\u6E2C\u3092\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\uFF09\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306E\u691C\u67FB\u306F\u52B9\u304D\u307E\u3059`);return null}}async runDequeueLoop(cycle){const{config,log,api,runner}=this.deps;log.separator();log.log("Phase 2: \u30AD\u30E5\u30FC\u304B\u3089\u30C7\u30AD\u30E5\u30FC\u3057\u3066\u9806\u6B21\u5B9F\u884C...");log.separator();let completed=0;
230
+ let failed=0;let unexecuted=0;let unexecutedNeedsHuman=false;let stepNum=0;let contendedRetry=0;let undetermined=false;let stop=false;this.nothingClaimableBacklog=false;dequeue:for(;;){if(this.draining){log.log("\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081\u3001\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u306F\u53D6\u5F97\u3057\u307E\u305B\u3093\u3002Phase 2 \u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");stop=true;break}const claimed=await this.claimOne();if(claimed.
231
+ kind==="undetermined"){undetermined=true;break}if(claimed.kind==="contended"){contendedRetry+=1;if(contendedRetry>=config.contendedMax){log.log(` \u26A0\uFE0F contended \u304C ${contendedRetry} \u56DE\u7D9A\u304D\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u306E\u53D6\u5F97\u3092\u8AE6\u3081\u307E\u3059\uFF08\u4ED6\u6A5F\u304C\u51E6\u7406\u3092\u7D9A\u3051\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u9AD8\u3044\uFF09`);undetermined=true;break}log.log(` \u2139\uFE0F \u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u5148\u306B\u53D6\u5F97\u3057\u307E\u3057\u305F\uFF08c\
232
+ ontended\u30FB${contendedRetry}\u56DE\u76EE\uFF09\u30023\u79D2\u5F8C\u306B\u518D\u8A66\u884C\u3057\u307E\u3059`);await this.sleep(3e3);continue}contendedRetry=0;this.nothingClaimableBacklog=claimed.kind==="filtered"&&claimed.by.length>0&&claimed.by.every(b=>b==="prerequisite"||b==="platform");if(claimed.kind==="empty"){log.log("\u30AD\u30E5\u30FC\u306Bpending\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002Phase 2 \u5B8C\u4E86\u3002");break}if(claimed.kind==="filtered"){const reasons=claimed.
233
+ by.includes("platform")?claimed.by.includes("prerequisite")?"\u524D\u63D0\u672A\u5145\u8DB3\u30FB\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u524D\u63D0\u672A\u5145\u8DB3\u306E\u307F";log.log(this.nothingClaimableBacklog?`\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${reasons}\uFF09\u3002Phase 2 \u5B8C\u4E86\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u306F\u8A08\u753B\u3057\u307E\u3059\u3002`:
234
+ "\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7406\u7531\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u6B21\u30B5\u30A4\u30AF\u30EB\u3082\u8A08\u753B\u3057\u307E\u305B\u3093\uFF09\u3002Phase 2 \u5B8C\u4E86\u3002");break}const item=claimed.item;const itemId=item.item_id??"";const prompt=(item.prompt??"").trim();const label=item.label??"";if(!itemId||!prompt){log.log(`\u30C7\u30AD\u30E5\u30FC\u7D50\u679C\u306E\u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${JSON.
235
+ stringify(item).slice(0,200)}`);break}stepNum+=1;log.separator();log.log(`[${stepNum}] ${label}`);log.log(` item_id: ${itemId}`);await runner.beat("dequeue",itemId);log.log(` prompt: ${prompt}`);log.separator();const stopMatch=/^\/stop(?:\s+(\d+))?$/.exec(prompt);if(stopMatch){const res=await api.update(itemId,{status:"completed"},config.runId);if(res.status===409){log.log(" \u26A0\uFE0F /stop \u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093")}else if(!res.
236
+ ok){log.log(` \u26D4 /stop \u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09`);log.log(" \u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u56DE\u53CE\u5F8C\u306B pending \u3078\u623B\u308B\u305F\u3081\u3001**\u6B21\u56DE\u8D77\u52D5\u6642\u3082\u5373\u505C\u6B62\u3057\u307E\u3059**");log.log(` \u5FA9\u65E7: UI \u304BAPI\u3067 item=${itemId} \u3092 completed / failed \u306B\u3057\u3066\u304F\u3060\u3055\u3044`)}completed+=
237
+ 1;const waitSec=stopMatch[1];if(waitSec){const requested=Number.parseInt(waitSec,10);const capped=Math.min(requested,STOP_WAIT_MAX_SEC);if(capped!==requested){log.log(` \u26A0\uFE0F /stop \u306E\u5F85\u6A5F ${requested}\u79D2 \u306F\u4E0A\u9650 ${STOP_WAIT_MAX_SEC}\u79D2 \u306B\u4E38\u3081\u307E\u3059`)}log.log(`[${stepNum}] /stop ${capped} \u2192 ${capped}\u79D2\u9593\u5F85\u6A5F\u3057\u307E\u3059...`);await this.sleepUnlessDraining(capped*1e3);log.log(`[${stepNum}] \u5F85\u6A5F\u5B8C\u4E86\u3002\u6B21\u306E\u30A2\u30A4\u30C6\u30E0\u306B\u9032\u307F\u307E\u3059\u3002`);
238
+ continue}log.log(`[${stepNum}] /stop \u2192 \u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002`);stop=true;break}const skillName=skillFromPrompt(prompt)??"";const promptPlaceholder=placeholderTaskKey(stripSkillCommand(prompt));if(promptPlaceholder!==null){const reason=`\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306E\u307E\u307E\u3067\u3059\uFF08'${promptPlaceholder}'\uFF09\u3002\u8A08\u753B\u6642\u306E\u96DB\u5F62\u304C\u7F6E\u63DB\u3055\u308C\u3066\u3044\u307E\u305B\u3093`;
239
+ log.log(` \u26D4 \u5B9F\u884C\u3057\u307E\u305B\u3093: ${reason}`);const res=await api.update(itemId,{status:"failed",error_message:reason},config.runId);if(res.status===409){log.log(` \u26A0\uFE0F \u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093: item=${itemId}`)}else if(!res.ok){log.log(` \u26A0\uFE0F failed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(
240
+ res)}\uFF09: item=${itemId}`)}else{log.log(`[${stepNum}] ${label} \u2192 \u5931\u6557 [ai=-] (0s)`);await this.schedule.recordByItem(itemId,"failed")}failed+=1;continue}if(skillName){const gate=await this.schedule.gateAllows(skillName);if(!gate.allowed){stepNum-=1;if(this.deferredIds.has(itemId)){log.log(" \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3067\u5F85\u6A5F\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u518D\u3073\u30C7\u30AD\u30E5\u30FC\u3055\u308C\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306EPhase 2\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");
241
+ break}const res=await api.update(itemId,{status:"pending"},config.runId);if(res.status===409){log.log(` \u26A0\uFE0F \u5F8C\u56DE\u3057\u306B\u3057\u3088\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`);log.log(" \u81EA\u5206\u306E claim \u306F\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\u3002**\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u5B9F\u884C\u305B\u305A\u653E\u68C4\u3057\u307E\u3059**");
242
+ continue}if(res.ok){this.deferredIds.add(itemId);log.log(` \u23F8 \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u306B\u3088\u308A\u5F8C\u56DE\u3057: ${skillName} \u2014 ${gate.reason}`);continue}log.log(" \u26A0\uFE0F pending\u3078\u623B\u305B\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3092\u7121\u8996\u3057\u3066\u3053\u306E\u307E\u307E\u5B9F\u884C\u3057\u307E\u3059");stepNum+=1}}const stepLog=path4.join(config.logDir,`step-${this.timestamp}-${cycle}-${stepNum}.lo\
243
+ g`);const startedAt=Date.now();const taggedCategory=/#ai:([a-z]+)/.exec(label)?.[1];this.itemInFlight=itemId;const resolvedSkills=await this.skills.resolve(prompt);const skillOrigins=formatSkillOrigins(resolvedSkills.origins);if(skillOrigins!=="")log.log(` \u30B9\u30AD\u30EB: ${skillOrigins}`);const ownershipWatch=this.startOwnershipWatch(itemId);let result;try{result=await this.engine.run({serverSkills:resolvedSkills.bodies,prompt:buildStepPrompt(config,prompt),promptPrefix:this.cyclePreflightSection,
244
+ logFile:stepLog,aiType:item.ai_type??void 0,aiModel:item.ai_model??void 0,aiEffort:item.ai_effort??void 0,timeoutSec:config.aiTimeoutSec,cwd:config.workspace,skill:skillName,...skillName===""&&taggedCategory!==void 0?{category:taggedCategory}:{}})}finally{ownershipWatch.stop();this.itemInFlight=null}writeLogFile(stepLog,skillOrigins===""?result.output:`[skill] ${skillOrigins}
245
245
  ${result.output}`);const durationSec=Math.trunc((Date.now()-startedAt)/1e3);if(this.ownershipLostItemId===itemId){this.ownershipLostItemId=null;log.log(`[${stepNum}] ${label} \u2192 \u26A0\uFE0F \u6240\u6709\u6A29\u3092\u5931\u3063\u3066\u3044\u305F\u305F\u3081\u7D50\u679C\u3092\u7834\u68C4\u3057\u307E\u3057\u305F [ai=${result.usedAi||"-"}] (${durationSec}s)`);log.log(" \u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306E\u5F8C\u51E6\u7406\uFF08\u5B9A\u671F\u67A0\u306E\u8A18\u9332\u30FB\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u306E\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");
246
246
  this.abortDrained?.();this.abortDrained=null;continue dequeue}if(result.outcome==="aborted"){log.log(`[${stepNum}] ${label} \u2192 \u4E2D\u65AD [ai=${result.usedAi||"-"}] (${durationSec}s)`);const res=await api.update(itemId,{status:"pending",result:serverResult(result.output),error_message:"aborted: \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A AI \u3092\u505C\u6B62\u3057\u307E\u3057\u305F\uFF08\u4F5C\u696D\u306F\u9014\u4E2D\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09"},
247
247
  config.runId);if(res.status===409){log.log(` \u26A0\uFE0F \u30AD\u30E5\u30FC\u3078\u8FD4\u305D\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`)}else if(res.ok){log.log(" \u2192 \u30A2\u30A4\u30C6\u30E0\u3092 pending \u306B\u623B\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u8D77\u52D5\u3067\u62FE\u3044\u76F4\u3057\u307E\u3059\uFF09")}else{log.log(` \u26A0\uFE0F pending \u3078\u623B\
@@ -256,22 +256,22 @@ write(itemId,payload);if(outcome!=="ok"){log.log(outcome==="lost"?`[${stepNum}]
256
256
  usedAi}] (${durationSec}s)`);log.log(" turns=0 \u304B\u3064\u51FA\u529B\u5951\u7D04\u884C\u306A\u3057\u3002completed \u306B\u3059\u308B\u3068\u518D\u6295\u5165\u3055\u308C\u306A\u3044\u305F\u3081 failed \u3067\u8A18\u9332\u3057\u307E\u3057\u305F")}else if(result.outcome==="max-turns"){failed+=1;log.log(`[${stepNum}] ${label} \u2192 \u26A0\uFE0F \u30BF\u30FC\u30F3\u4E0A\u9650\u5230\u9054\u3067\u6253\u3061\u5207\u308A [ai=${result.usedAi}] (${durationSec}s)`)}else{failed+=1;log.log(`[${stepNum}] ${label}\
257
257
  \u2192 \u5931\u6557 [ai=${result.usedAi}] (${durationSec}s)`)}if(this.deps.engine.name==="noop"){log.log(" \u23ED engine=noop \u306E\u305F\u3081\u5B9A\u671F\u67A0\u306E\u8A18\u9332\u30FB\u5B8C\u4E86\u5F8C\u51E6\u7406\u306F\u884C\u3044\u307E\u305B\u3093\uFF08AI \u3092\u8D77\u52D5\u3057\u3066\u3044\u306A\u3044\u306E\u3067\u5B9F\u4F53\u304C\u3042\u308A\u307E\u305B\u3093\uFF09");continue dequeue}await this.schedule.recordByItem(itemId,status);if(status==="completed"){await this.runCompletionHooks(
258
258
  skillName,result.output,result.usedAi)}else if(result.outcome==="max-turns"){await this.runMaxTurnsHooks(skillName,result.output,result.usedAi)}await this.maybeEnqueueDueMidcycle()}log.separator();log.log(`Phase 2 \u5B8C\u4E86: ${completed} \u5B8C\u4E86 / ${failed} \u5931\u6557`+(unexecuted>0?` / ${unexecuted} \u672A\u5B9F\u884C`:"")+` (\u8A08 ${stepNum} \u30A2\u30A4\u30C6\u30E0)`);log.separator();return{progress:completed>0,emptyQueue:stepNum===0&&!undetermined,undetermined,stop,deferred:this.deferredIds.
259
- size,unexecuted,needsHuman:unexecutedNeedsHuman}}async runCompletionHooks(skillName,logText,usedAi){const{log}=this.deps;if(skillName==="release-deploy"){const parsed=parseReleaseResult(logText);if(!parsed){log.log(" \u26A0\uFE0F release-deploy \u304C RELEASE_RESULT \u884C\u3092\u51FA\u529B\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09\u2192 \u30EA\u30EA\u30FC\u30B9\u672A\u5B9F\u884C\u3068\u3057\u3066\u6271\u3044\u307E\u3059");this.releaseLog.record("NOT_E\
260
- XECUTED","unknown","RELEASE_RESULT\u884C\u306A\u3057\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09",usedAi);return}if(parsed.executed){log.log(` \u2705 \u30EA\u30EA\u30FC\u30B9\u5B9F\u884C\u6E08\u307F: ${parsed.line.slice(0,120)}`);this.releaseLog.record("EXECUTED","Phase5",parsed.reason,usedAi);return}log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u672A\u5B9F\u884C: ${parsed.phase} \u3067\u4E2D\u6B62 \u2014 ${parsed.reason}`);this.releaseLog.record("NOT_EXECUTED",parsed.phase,parsed.reason,
261
- usedAi);await enqueueBlockerRecovery(this.postDeps,parsed.line);await enqueueReleasePhase5Recovery(this.postDeps,parsed.line);await enqueueReleasePartialMergeRerun(this.postDeps,parsed.line);return}const followUp=this.deps.config.operations.postSuccessEnqueue.get(skillName);if(followUp){await enqueueDevVerifyForMerged(this.postDeps,logText,followUp)}}async runMaxTurnsHooks(skillName,logText,usedAi){const{log}=this.deps;log.log(" \u4F5C\u696D\u306E\u5927\u534A\u304C\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u4EE5\u4E0B\u306E\u672A\u5B9F\u65BD\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044:");
262
- log.log(" - TWP\u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\uFF08\u9032\u884C\u4E2D\u306E\u307E\u307E\u653E\u7F6E\u3055\u308C\u3066\u3044\u306A\u3044\u304B\uFF09");log.log(" - PR\u4F5C\u6210\u6E08\u307F\u306E\u5834\u5408\u306E\u30EC\u30D3\u30E5\u30FC\u4F9D\u983C\u30B3\u30E1\u30F3\u30C8\u30FB\u62C5\u5F53\u8005\u5909\u66F4");log.log(" - \u30A8\u30D3\u30C7\u30F3\u30B9\u6DFB\u4ED8\u30FB\u691C\u8A3C\u30C7\u30FC\u30BF\u306E\u30AF\u30EA\u30FC\u30F3\u30A2\u30C3\u30D7");log.log("\
263
- \u6B21\u30B5\u30A4\u30AF\u30EB\u306E\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3067 /twp-task-resume \u3068\u3057\u3066\u518D\u6295\u5165\u3055\u308C\u308B\u3053\u3068\u3092\u60F3\u5B9A\u3057\u3066\u3044\u307E\u3059\u3002");if(!this.deps.config.operations.contractSkills.has(skillName))return;const contract=lastContractLine(logText,this.deps.config.operations.contractLines.get(skillName)?.line??null);if(contract!==""){log.log(` \u26A0\uFE0F \u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F\u304C\u5951\u7D04\u884C\u306F\u51FA\u3066\u3044\u307E\u3059: ${contract.
259
+ size,unexecuted,needsHuman:unexecutedNeedsHuman}}async runCompletionHooks(skillName,logText,usedAi){const{log}=this.deps;const hooks=this.deps.config.operations.releaseHooks;if(hooks!==null&&hooks.line!==null&&skillName===hooks.skill){const parsed=parseReleaseResult(logText,hooks.line);if(!parsed){log.log(` \u26A0\uFE0F ${skillName} \u304C ${hooks.line} \u884C\u3092\u51FA\u529B\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09\u2192 \u30EA\u30EA\u30FC\u30B9\u672A\u5B9F\u884C\u3068\u3057\u3066\u6271\u3044\u307E\u3059`);
260
+ this.releaseLog.record("NOT_EXECUTED","unknown",`${hooks.line}\u884C\u306A\u3057\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09`,usedAi);return}if(parsed.executed){log.log(` \u2705 \u30EA\u30EA\u30FC\u30B9\u5B9F\u884C\u6E08\u307F: ${parsed.line.slice(0,120)}`);this.releaseLog.record("EXECUTED","Phase5",parsed.reason,usedAi);return}log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u672A\u5B9F\u884C: ${parsed.phase} \u3067\u4E2D\u6B62 \u2014 ${parsed.reason}`);this.releaseLog.record("NOT_EXECUTE\
261
+ D",parsed.phase,parsed.reason,usedAi);await enqueueBlockerRecovery(this.postDeps,parsed.line);await enqueueReleasePhase5Recovery(this.postDeps,parsed.line);await enqueueReleasePartialMergeRerun(this.postDeps,parsed.line);return}const followUp=this.deps.config.operations.postSuccessEnqueue.get(skillName);if(followUp){await enqueueDevVerifyForMerged(this.postDeps,logText,followUp)}}async runMaxTurnsHooks(skillName,logText,usedAi){const{log}=this.deps;log.log(" \u4F5C\u696D\u306E\u5927\u534A\u304C\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u4EE5\u4E0B\u306E\u672A\u5B9F\u65BD\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\
262
+ :");log.log(" - TWP\u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\uFF08\u9032\u884C\u4E2D\u306E\u307E\u307E\u653E\u7F6E\u3055\u308C\u3066\u3044\u306A\u3044\u304B\uFF09");log.log(" - PR\u4F5C\u6210\u6E08\u307F\u306E\u5834\u5408\u306E\u30EC\u30D3\u30E5\u30FC\u4F9D\u983C\u30B3\u30E1\u30F3\u30C8\u30FB\u62C5\u5F53\u8005\u5909\u66F4");log.log(" - \u30A8\u30D3\u30C7\u30F3\u30B9\u6DFB\u4ED8\u30FB\u691C\u8A3C\u30C7\u30FC\u30BF\u306E\u30AF\u30EA\u30FC\u30F3\u30A2\u30C3\u30D7");log.log(
263
+ " \u6B21\u30B5\u30A4\u30AF\u30EB\u306E\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3067 /twp-task-resume \u3068\u3057\u3066\u518D\u6295\u5165\u3055\u308C\u308B\u3053\u3068\u3092\u60F3\u5B9A\u3057\u3066\u3044\u307E\u3059\u3002");if(!this.deps.config.operations.contractSkills.has(skillName))return;const contract=lastContractLine(logText,this.deps.config.operations.contractLines.get(skillName)?.line??null);if(contract!==""){log.log(` \u26A0\uFE0F \u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F\u304C\u5951\u7D04\u884C\u306F\u51FA\u3066\u3044\u307E\u3059: ${contract.
264
264
  slice(0,120)}`)}else{log.log(` \u26A0\uFE0F ${skillName} \u304C\u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u3001\u5951\u7D04\u884C\u304C\u3042\u308A\u307E\u305B\u3093\u3002`);log.log(" develop \u3078\u306E\u30DE\u30FC\u30B8\u30FB\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u304C**\u9014\u4E2D\u307E\u3067\u5B9F\u884C\u3055\u308C\u305F\u53EF\u80FD\u6027**\u304C\u3042\u308A\u307E\u3059\u3002");log.log(" \u6B21\u30B5\u30A4\u30AF\u30EB\u306E\u524D\u306B git\u30FB\u30EA\u30EA\u30FC\u30B9\u5C65\u6B74\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08A3: \u72B6\u614B\u3092\u73FE\u5B9F\u3068\u4E00\u81F4\u3055\u305B\u308B\uFF09\u3002")}
265
- if(skillName==="release-deploy"){if(/RELEASE_RESULT:\s*EXECUTED/.test(contract)){this.releaseLog.record("EXECUTED","max-turns","\u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u305F\u304C\u5951\u7D04\u884C\u306FEXECUTED",usedAi)}else{this.releaseLog.record("NOT_EXECUTED","max-turns",`\u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u308A\uFF08\u5951\u7D04\u884C: ${contract===""?"\u306A\u3057":contract}\uFF09`,usedAi);await enqueueBlockerRecovery(this.postDeps,contract)}await enqueueReleasePartialMergeRerun(
266
- this.postDeps,contract);return}const followUpOnCut=this.deps.config.operations.postSuccessEnqueue.get(skillName);if(followUpOnCut){await enqueueDevVerifyForMerged(this.postDeps,logText,followUpOnCut)}}async claimOne(){const{api,config,log,runner}=this.deps;let attempt=0;for(;;){const res=await api.claim(config.runnerId,config.runId);if(res.ok){const reason=pickString(res.json,"reason");if(reason==="contended")return{kind:"contended"};if(reason==="claimed"){const item=res.json?.item;if(item&&typeof item===
267
- "object")return{kind:"claimed",item};log.log(` \u26A0\uFE0F claim \u304C claimed \u3092\u8FD4\u3057\u307E\u3057\u305F\u304C item \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}\uFF09`);return{kind:"undetermined"}}if(reason==="empty")return{kind:"empty"};if(reason==="filtered"){const by=res.json?.filtered_by;return{kind:"filtered",by:Array.isArray(by)?by.filter(b=>typeof b==="string"):[]}}if(reason!=="runner_not_registered"){log.log(` \u26A0\uFE0F claim\
268
- \u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08reason='${reason}'\uFF09\u3002`);log.log(` **\u30AD\u30E5\u30FC\u304C\u7A7A\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return{kind:"undetermined"}}}attempt+=1;if(res.status===409||pickString(res.json,"reason")==="runner_not_registered"){log.log(" \u26A0\uFE0F claim \u304C 409\uFF08\u30E9\u30F3\u30CA\u30FC\u672A\u767B\u9332\u6271\u3044\uFF09\u3002register \u304B\u3089\u3084\u308A\u76F4\u3057\u307E\u3059");
269
- runner.registered=false;try{await runner.registerOrThrow()}catch{return{kind:"undetermined"}}if(attempt>=3)return{kind:"undetermined"};continue}if(attempt>=3){log.log(` \u26A0\uFE0F claim API\u304C3\u56DE\u9023\u7D9A\u3067\u5931\u6557\uFF08${describeError(res)}\uFF09\u3002`);log.log(" **\u30AD\u30E5\u30FC\u304C\u7A7A\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u672A\u51E6\u7406\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u6B8B\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002");
270
- return{kind:"undetermined"}}log.log(` \u26A0\uFE0F claim API\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C`);await this.sleep(5e3)}}};function writeLogFile(file,text){try{fs6.mkdirSync(path4.dirname(file),{recursive:true});fs6.writeFileSync(file,text)}catch{}}function buildPlanPrompt(config,planSkill,scheduleSection,prefetchSection,outcomeSection=""){return[promptText(config,"plan_preamble",""),
271
- config.safeMode?promptText(config,"safe_mode_note",SAFE_MODE_NOTE):"",promptText(config,"non_interactive_note",NON_INTERACTIVE_NOTE),scheduleSection,prefetchSection,outcomeSection,planSkill].filter(s=>s!=="").join("\n\n")}function promptText(config,key,builtin){return config.serverPrompts?.[key]??builtin}function buildStepPrompt(config,body){const timeoutMin=Math.trunc(config.aiTimeoutSec/60);const softMin=Math.trunc(config.aiTimeoutSec*config.aiSoftDeadlineRatio/100/60);const wrapUpMin=Math.max(
272
- 0,timeoutMin-softMin);return[renderStepBudget(promptText(config,"step_budget",STEP_BUDGET),{timeoutMin,softMin,wrapUpMin}),config.safeMode?promptText(config,"safe_mode_note",SAFE_MODE_NOTE):"",promptText(config,"non_interactive_note",NON_INTERACTIVE_NOTE),body].filter(s=>s!=="").join("\n\n")}var STEP_BUDGET=["\u3010\u5B9F\u884C\u6642\u9593\u306E\u4E88\u7B97\u3011\u3053\u306E\u5B9F\u884C\u306F {timeout_min}\u5206 \u3067\u30D7\u30ED\u30BB\u30B9\u304C\u5F37\u5236\u7D42\u4E86\u3055\u308C\u307E\u3059\u3002\u4E88\u544A\u3084\u7336\u4E88\u306F\u3042\u308A\u307E\u305B\u3093\u3002",
273
- ["- \u958B\u59CB\u304B\u3089 **{soft_min}\u5206** \u3092\u904E\u304E\u305F\u3089\u3001\u4F5C\u696D\u3092\u6253\u3061\u5207\u3063\u3066\u7DE0\u3081\u51E6\u7406\u306B\u5165\u3063\u3066\u304F\u3060\u3055\u3044\uFF08\u30B3\u30DF\u30C3\u30C8 \u2192 push \u2192 PR\u4F5C\u6210 \u2192 \u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u62C5\u5F53\u306E\u66F4\u65B0 \u2192 \u5F15\u304D\u7D99\u304E\u30B3\u30E1\u30F3\u30C8\uFF09","- \u7DE0\u3081\u51E6\u7406\u306B\u306F10\u5206\u7A0B\u5EA6\u3092\u898B\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\uFF08{soft_min}\u5206\u6642\u70B9\u3067\u306E\u6B8B\u308A\u306F {wrap_up_min}\u5206\uFF09",
274
- "- **\u7D4C\u904E\u6642\u9593\u306F `date` \u3067\u5B9F\u6E2C\u3057\u3066\u304F\u3060\u3055\u3044\u3002** \u4F53\u611F\u3067\u300C\u4E88\u7B97\u304C\u5C3D\u304D\u304B\u3051\u3066\u3044\u308B\u300D\u3068\u5224\u65AD\u3057\u306A\u3044\u3053\u3068\u2014\u2014\u5B9F\u6E2C\u305B\u305A\u306B\u65E9\u671F\u96E2\u8131\u3059\u308B\u3068\u3001\u6B8B\u308A\u6642\u9593\u304C\u3042\u308B\u306E\u306B\u5DE5\u7A0B\u304C\u9014\u4E2D\u3067\u6B62\u307E\u308A\u307E\u3059\uFF08\u5B9F\u6E2C\u305B\u305A\u306B\u8FF0\u3079\u305F\u6B8B\u308A\u6642\u9593\u306F\u61B2\u7AE0A3\u9055\u53CD\uFF09",
265
+ const hooks=this.deps.config.operations.releaseHooks;if(hooks!==null&&hooks.line!==null&&skillName===hooks.skill){if(new RegExp(`${hooks.line}:\\s*EXECUTED`).test(contract)){this.releaseLog.record("EXECUTED","max-turns","\u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u3089\u308C\u305F\u304C\u5951\u7D04\u884C\u306FEXECUTED",usedAi)}else{this.releaseLog.record("NOT_EXECUTED","max-turns",`\u30BF\u30FC\u30F3\u4E0A\u9650\u3067\u6253\u3061\u5207\u308A\uFF08\u5951\u7D04\u884C: ${contract===""?"\
266
+ \u306A\u3057":contract}\uFF09`,usedAi);await enqueueBlockerRecovery(this.postDeps,contract)}await enqueueReleasePartialMergeRerun(this.postDeps,contract);return}const followUpOnCut=this.deps.config.operations.postSuccessEnqueue.get(skillName);if(followUpOnCut){await enqueueDevVerifyForMerged(this.postDeps,logText,followUpOnCut)}}async claimOne(){const{api,config,log,runner}=this.deps;let attempt=0;for(;;){const res=await api.claim(config.runnerId,config.runId);if(res.ok){const reason=pickString(
267
+ res.json,"reason");if(reason==="contended")return{kind:"contended"};if(reason==="claimed"){const item=res.json?.item;if(item&&typeof item==="object")return{kind:"claimed",item};log.log(` \u26A0\uFE0F claim \u304C claimed \u3092\u8FD4\u3057\u307E\u3057\u305F\u304C item \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}\uFF09`);return{kind:"undetermined"}}if(reason==="empty")return{kind:"empty"};if(reason==="filtered"){const by=res.json?.filtered_by;
268
+ return{kind:"filtered",by:Array.isArray(by)?by.filter(b=>typeof b==="string"):[]}}if(reason!=="runner_not_registered"){log.log(` \u26A0\uFE0F claim \u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08reason='${reason}'\uFF09\u3002`);log.log(` **\u30AD\u30E5\u30FC\u304C\u7A7A\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return{kind:"undetermined"}}}attempt+=1;if(res.status===409||
269
+ pickString(res.json,"reason")==="runner_not_registered"){log.log(" \u26A0\uFE0F claim \u304C 409\uFF08\u30E9\u30F3\u30CA\u30FC\u672A\u767B\u9332\u6271\u3044\uFF09\u3002register \u304B\u3089\u3084\u308A\u76F4\u3057\u307E\u3059");runner.registered=false;try{await runner.registerOrThrow()}catch{return{kind:"undetermined"}}if(attempt>=3)return{kind:"undetermined"};continue}if(attempt>=3){log.log(` \u26A0\uFE0F claim API\u304C3\u56DE\u9023\u7D9A\u3067\u5931\u6557\uFF08${describeError(res)}\uFF09\u3002`);
270
+ log.log(" **\u30AD\u30E5\u30FC\u304C\u7A7A\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u672A\u51E6\u7406\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u6B8B\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002");return{kind:"undetermined"}}log.log(` \u26A0\uFE0F claim API\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C`);await this.sleep(5e3)}}};
271
+ function writeLogFile(file,text){try{fs6.mkdirSync(path4.dirname(file),{recursive:true});fs6.writeFileSync(file,text)}catch{}}function buildPlanPrompt(config,planSkill,scheduleSection,prefetchSection,outcomeSection=""){return[promptText(config,"plan_preamble",""),config.safeMode?promptText(config,"safe_mode_note",SAFE_MODE_NOTE):"",promptText(config,"non_interactive_note",NON_INTERACTIVE_NOTE),scheduleSection,prefetchSection,outcomeSection,planSkill].filter(s=>s!=="").join("\n\n")}function promptText(config,key,builtin){
272
+ return config.serverPrompts?.[key]??builtin}function buildStepPrompt(config,body){const timeoutMin=Math.trunc(config.aiTimeoutSec/60);const softMin=Math.trunc(config.aiTimeoutSec*config.aiSoftDeadlineRatio/100/60);const wrapUpMin=Math.max(0,timeoutMin-softMin);return[renderStepBudget(promptText(config,"step_budget",STEP_BUDGET),{timeoutMin,softMin,wrapUpMin}),config.safeMode?promptText(config,"safe_mode_note",SAFE_MODE_NOTE):"",promptText(config,"non_interactive_note",NON_INTERACTIVE_NOTE),body].
273
+ filter(s=>s!=="").join("\n\n")}var STEP_BUDGET=["\u3010\u5B9F\u884C\u6642\u9593\u306E\u4E88\u7B97\u3011\u3053\u306E\u5B9F\u884C\u306F {timeout_min}\u5206 \u3067\u30D7\u30ED\u30BB\u30B9\u304C\u5F37\u5236\u7D42\u4E86\u3055\u308C\u307E\u3059\u3002\u4E88\u544A\u3084\u7336\u4E88\u306F\u3042\u308A\u307E\u305B\u3093\u3002",["- \u958B\u59CB\u304B\u3089 **{soft_min}\u5206** \u3092\u904E\u304E\u305F\u3089\u3001\u4F5C\u696D\u3092\u6253\u3061\u5207\u3063\u3066\u7DE0\u3081\u51E6\u7406\u306B\u5165\u3063\u3066\u304F\u3060\u3055\u3044\uFF08\u30B3\u30DF\u30C3\u30C8 \u2192 push \u2192 PR\u4F5C\u6210 \u2192 \u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u62C5\u5F53\u306E\u66F4\u65B0 \u2192 \u5F15\u304D\u7D99\u304E\u30B3\u30E1\u30F3\u30C8\uFF09",
274
+ "- \u7DE0\u3081\u51E6\u7406\u306B\u306F10\u5206\u7A0B\u5EA6\u3092\u898B\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\uFF08{soft_min}\u5206\u6642\u70B9\u3067\u306E\u6B8B\u308A\u306F {wrap_up_min}\u5206\uFF09","- **\u7D4C\u904E\u6642\u9593\u306F `date` \u3067\u5B9F\u6E2C\u3057\u3066\u304F\u3060\u3055\u3044\u3002** \u4F53\u611F\u3067\u300C\u4E88\u7B97\u304C\u5C3D\u304D\u304B\u3051\u3066\u3044\u308B\u300D\u3068\u5224\u65AD\u3057\u306A\u3044\u3053\u3068\u2014\u2014\u5B9F\u6E2C\u305B\u305A\u306B\u65E9\u671F\u96E2\u8131\u3059\u308B\u3068\u3001\u6B8B\u308A\u6642\u9593\u304C\u3042\u308B\u306E\u306B\u5DE5\u7A0B\u304C\u9014\u4E2D\u3067\u6B62\u307E\u308A\u307E\u3059\uFF08\u5B9F\u6E2C\u305B\u305A\u306B\u8FF0\u3079\u305F\u6B8B\u308A\u6642\u9593\u306F\u61B2\u7AE0A3\u9055\u53CD\uFF09",
275
275
  "- \u6B8B\u4F5C\u696D\u306F\u300C\u5B8C\u4E86\u3057\u305F\u7BC4\u56F2\u300D\u3068\u300C\u672A\u7740\u624B\u306E\u7BC4\u56F2\u300D\u3092\u5206\u3051\u3066\u30BF\u30B9\u30AF\u3078\u66F8\u3051\u3070\u3001\u6B21\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u7D99\u7D9A\u3067\u304D\u307E\u3059","- \u30B9\u30B3\u30FC\u30D7\u304C {timeout_min}\u5206 \u306B\u53CE\u307E\u3089\u306A\u3044\u3068\u5224\u65AD\u3057\u305F\u3089\u3001\u5B9F\u88C5\u3092\u7D9A\u3051\u305A\u30BF\u30B9\u30AF\u306E\u5206\u5272\u3092\u63D0\u6848\u3057\u3066\u304F\u3060\u3055\u3044"].
276
276
  join("\n"),"**\u5927\u304D\u306A\u672A\u5B8C\u6210\u3088\u308A\u3001\u5C0F\u3055\u304F\u3066\u3082\u5B8C\u6210\u3057\u3066\u3044\u308B\u72B6\u614B\u3092\u512A\u5148\u3057\u3066\u304F\u3060\u3055\u3044**\uFF08\u61B2\u7AE0A2: \u9593\u306B\u5408\u308F\u306A\u3044\u3068\u304D\u306B\u524A\u308B\u306E\u306F\u30B9\u30B3\u30FC\u30D7\u3067\u3042\u3063\u3066\u62C5\u4FDD\u3067\u306F\u306A\u3044\uFF09\u3002"].join("\n\n");var SAFE_MODE_NOTE=`\u3010\u5B89\u5168\u30E2\u30FC\u30C9\u6709\u52B9\u3011\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u306F\u7981\u6B62\u3067\u3059\u3002\u4EE5\u4E0B\u3092\u7D76\u5BFE\u306B\u5B9F\u884C\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044:
277
277
  - \u672C\u756A\u30EA\u30EA\u30FC\u30B9\u306E\u5B9F\u884C
@@ -295,14 +295,14 @@ const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)re
295
295
  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`)}
296
296
  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()})}
297
297
  `);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)||
298
- 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-DJ5JT5BE.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-DJ5JT5BE.js");const extraHosts=config.
298
+ 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-CE7RIQL6.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-CE7RIQL6.js");const extraHosts=config.
299
299
  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.
300
300
  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.
301
- 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-4NT4OC7J.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)})}
301
+ 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-AZKVMJKV.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)})}
302
302
  const profile=resolveProfile(opts.profile);let creds;try{creds=new AuthSession(profile.name,profile.apiUrl).loadOrThrow()}catch(err){process.stderr.write(`${err.message}
303
303
  `);return 1}const apiUrl=effectiveApiUrl(profile,creds.api_url);const session=new AuthSession(profile.name,apiUrl);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");return 2}const projectApi=new ProjectApi(apiUrl,session);let project;try{project=await projectApi.resolve(projectRef)}catch(err){process.stderr.write(`${err.
304
304
  message}
305
- `);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-FMSAHRGZ.js");let ais;if(opts.ais!==void 0&&opts.ais.length>0){const parsed=parseAiList(opts.ais.join(","));if(parsed.unknown.length>0){process.stderr.write(`--ai \u306B\u672A\u77E5\u306E\u5024\u304C\u3042\u308A\u307E\u3059: ${parsed.unknown.join(" / ")}
305
+ `);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-DW2H7BDN.js");let ais;if(opts.ais!==void 0&&opts.ais.length>0){const parsed=parseAiList(opts.ais.join(","));if(parsed.unknown.length>0){process.stderr.write(`--ai \u306B\u672A\u77E5\u306E\u5024\u304C\u3042\u308A\u307E\u3059: ${parsed.unknown.join(" / ")}
306
306
  `);return 2}ais=parsed.ais}return runSetup({projectId,projectRef,projectName:project.name===project.id?projectRef:`${project.code} / ${project.name}`,apiUrl,yes:opts.yes===true,...ais!==void 0?{ais}:{},...opts.workspace!==void 0?{workspace:opts.workspace}:{},...opts.aiConfigFile!==void 0?{aiConfigFile:opts.aiConfigFile}:{},...opts.noAiConfigFile===true?{noAiConfigFile:true}:{},...opts.profile!==void 0?{profile:opts.profile}:{}})}if(opts.action==="charter"){if(opts.charterOp===void 0){process.stderr.
307
307
  write("charter \u306B\u306F push / pull / history / diff / revert \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u61B2\u7AE0\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}if(opts.charterOp!=="push"&&opts.charterOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-KT7NMRES.js");
308
308
  return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"charter",op:opts.charterOp,from:opts.revisionFrom,to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const{runCharterCommand}=await import("./charter-command-A4MFFBGE.js");return runCharterCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.charterOp,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,
@@ -310,7 +310,7 @@ profile:opts.profile})}if(opts.action==="runner"){if(opts.runnerOp===void 0){pro
310
310
  if(opts.action==="schedule"&&opts.scheduleOp!==void 0){const{runScheduleDefCommand}=await import("./schedule-def-command-OFCA5VH3.js");return runScheduleDefCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.scheduleOp,configOp:opts.scheduleConfigOp,id:opts.scheduleId,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.action==="settings"){if(opts.settingsOp===void 0){process.stderr.write("settings \u306B\u306F pu\
311
311
  sh / pull \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u30EB\u30FC\u30D7\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}const{runSettingsCommand}=await import("./settings-command-TEVH2MNY.js");return runSettingsCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.settingsOp,
312
312
  file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.action==="skill"){if(opts.skillOp===void 0){process.stderr.write("skill \u306B\u306F push / pull / list / show / delete / history / diff / revert / check \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u30B9\u30AD\u30EB\u5B9A\u7FA9\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");
313
- return 2}if(opts.skillOp==="check"){const{runSkillCheck}=await import("./skill-check-CKLMW2AJ.js");return runSkillCheck({api:new AgentLoopApi({apiUrl,projectId,session})},{configPath:opts.skillConfig,defaultConfigPath:localConfigPath(projectId),output:opts.output})}if(opts.skillOp==="list"||opts.skillOp==="show"||opts.skillOp==="delete"){const{runSkillManageCommand}=await import("./skill-manage-command-UOWZCF6R.js");return runSkillManageCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.
313
+ return 2}if(opts.skillOp==="check"){const{runSkillCheck}=await import("./skill-check-JBRUAUID.js");return runSkillCheck({api:new AgentLoopApi({apiUrl,projectId,session})},{configPath:opts.skillConfig,defaultConfigPath:localConfigPath(projectId),output:opts.output})}if(opts.skillOp==="list"||opts.skillOp==="show"||opts.skillOp==="delete"){const{runSkillManageCommand}=await import("./skill-manage-command-UOWZCF6R.js");return runSkillManageCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.
314
314
  skillOp,name:opts.skillName,output:opts.output,query:opts.query,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.skillOp!=="push"&&opts.skillOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-KT7NMRES.js");return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"skill",op:opts.skillOp,name:opts.skillName,from:opts.revisionFrom,to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.
315
315
  profile})}const{runSkillCommand}=await import("./skill-command-4VMZ2H6A.js");return runSkillCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.skillOp,name:opts.skillName,all:opts.skillAll===true,dir:opts.skillDir,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const config=buildLoopConfig({projectId,projectRef,apiUrl,safeMode:opts.safe,daemon:opts.daemon,...opts.maxCycles!==void 0?{maxCycles:opts.maxCycles}:{},...opts.interval!==void 0?{intervalSec:opts.
316
316
  interval}:{},forceRunner:opts.forceRunner,...opts.engine!==void 0?{engine:opts.engine}:{},version:opts.version});const api=new AgentLoopApi({apiUrl,projectId,session});if(opts.action==="capacity"){if(opts.capacityOp!=="report"){process.stderr.write("capacity \u306B\u306F report \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}for(const warning of config.warnings)process.stderr.write(`\u26A0\uFE0F ${warning}
@@ -332,7 +332,7 @@ log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u4FE1\u3057\u307E\u305
332
332
  "\u6642\u523B\u4E0D\u660E"}\uFF09\u3002\u7D42\u4E86\u3057\u307E\u3059...`);stopWatcher?.();drainWatcher?.();driftWatcher?.();void shutdown().catch(()=>void 0).then(()=>process.exit(130))});drainWatcher=watchMarker(lockDir(config),"drain",process.pid,req=>{drainWatcher?.();if(loop===null){pendingDrain.value={reason:`stop --drain\u30FB${req.at||"\u6642\u523B\u4E0D\u660E"}`,exitCode:0};log.log(`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${req.at||"\u6642\u523B\u4E0D\u660E"}\
333
333
  \uFF09\u3002\u8D77\u52D5\u51E6\u7406\u306E\u5B8C\u4E86\u5F8C\u306B\u53CD\u6620\u3057\u307E\u3059\u3002`);return}loop.requestDrain(`stop --drain\u30FB${req.at||"\u6642\u523B\u4E0D\u660E"}`)});if(installed!==null){const watch=watchVersionDrift({runningVersion:opts.version,stateDir:config.stateDir,projectKey:projectFileKey(config.projectId),supervised:autoRestart.supervised,disabled:autoRestart.disabled},{onWarn:reason=>log.log(`\u26A0\uFE0F ${reason}`),onRestart:({from,to})=>{driftWatcher?.();log.
334
334
  log(`\u7248\u30C9\u30EA\u30D5\u30C8\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\uFF08${from} \u2192 ${to}\uFF09\u3002`);log.log(` \u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u3092\u5B8C\u8D70\u3055\u305B\u3066\u304B\u3089\u7D42\u4E86\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 ${EXIT_VERSION_DRIFT}\uFF09\u3002\u518D\u8D77\u52D5\u306F systemd\uFF08Restart=always\uFF09\u304C\u884C\u3044\u307E\u3059`);const reason=`\u7248\u30C9\u30EA\u30D5\u30C8 ${from} \u2192 ${to} \u306B\u3088\u308B\u81EA\u52D5\u518D\u8D77\u52D5`;
335
- if(loop===null)pendingDrain.value={reason,exitCode:EXIT_VERSION_DRIFT};else loop.requestDrain(reason,EXIT_VERSION_DRIFT)}});driftWatcher=watch.stop}try{const{LoopSettingsApplier:LoopSettingsApplier2}=await import("./server-settings-OB7JF757.js");const settings=new LoopSettingsApplier2({api,config,log:m=>log.log(m)});await settings.apply();const{ServerSkillCatalog:ServerSkillCatalog2}=await import("./server-skills-FVYYZ54O.js");const skills=new ServerSkillCatalog2({api,config,log:m=>log.log(m)});await skills.
335
+ if(loop===null)pendingDrain.value={reason,exitCode:EXIT_VERSION_DRIFT};else loop.requestDrain(reason,EXIT_VERSION_DRIFT)}});driftWatcher=watch.stop}try{const{LoopSettingsApplier:LoopSettingsApplier2}=await import("./server-settings-GFWQ5ERV.js");const settings=new LoopSettingsApplier2({api,config,log:m=>log.log(m)});await settings.apply();const{ServerSkillCatalog:ServerSkillCatalog2}=await import("./server-skills-FVYYZ54O.js");const skills=new ServerSkillCatalog2({api,config,log:m=>log.log(m)});await skills.
336
336
  refresh();await runner.checkHeartbeatInterval();await runner.registerOrThrow();runner.startHeartbeatWorker();log.log(` heartbeat: ${config.heartbeatIntervalSec}\u79D2\u3054\u3068\u306B\u9001\u4FE1${runner.heartbeatTimeoutServer?`\uFF08\u30B5\u30FC\u30D0\u306E\u6B7B\u6D3B\u3057\u304D\u3044\u5024 ${runner.heartbeatTimeoutServer}\u79D2\uFF09`:""}`);loop=new TaskLoop({api,projectApi,config,log,runner,engine:await buildEngine(config,m=>log.log(m)),settings,skills});if(pendingDrain.value!==null){loop.
337
337
  requestDrain(pendingDrain.value.reason,pendingDrain.value.exitCode)}exitCode=await loop.run()}catch(err){if(err instanceof RunnerRegistrationError){exitCode=1}else{log.log(`\u26D4 \u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u3067\u7D42\u4E86\u3057\u307E\u3059: ${err.message}`);exitCode=1}}finally{await shutdown()}return exitCode}async function showStatus(api,config,opts){const{runStatusCommand}=await import("./status-command-C42CVQ3Q.js");const lock=lockDir(config);return runStatusCommand(api,
338
338
  {projectRef:config.projectRef,projectId:config.projectId,apiUrl:config.apiUrl,lockPath:lock,lockHeld:fs9.existsSync(lock),profile:opts.profile},{output:opts.output,query:opts.query},{out:s=>process.stdout.write(s),err:s=>process.stderr.write(s)})}var STOP_WAIT_MS=18e4;var STOP_POLL_MS=250;function defaultIsAlive(pid){try{process.kill(pid,0);return true}catch(err){return err.code==="EPERM"}}async function stopLoop(opts,deps={}){const platform=deps.platform??process.platform;const isLoopProcess=deps.
@@ -50,7 +50,7 @@ ${err.hint?`${err.hint}
50
50
  `);return 1}writeErr(`\u30A8\u30E9\u30FC: ${err.message}
51
51
  `);return 1}}async function runLogin(options){return run(async()=>{const profile=resolveProfile(options.profile);const io=makeIo(options.cliVersion);if(options.method==="password"){await passwordLogin(profile,{tenantCode:options.tenant??void 0},process.env,io)}else if(options.method==="token"){await tokenLogin(profile,process.env,io)}else{await browserLogin(profile,process.env,io,{noBrowser:options.noBrowser})}})}async function runLogout(options){return run(async()=>{const profile=resolveProfile(
52
52
  options.profile);const creds=loadCredentials(profile.name);if(!creds){writeOut(`\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u300C${profile.name}\u300D\u306F\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002
53
- `);return}const{describeLogoutImpact,findLoopsUsingProfile}=await import("./logout-guard-57LHDX6L.js");const found=findLoopsUsingProfile(profile.name,options.logoutGuard);if(found.users.length>0||found.undetermined.length>0){writeErr(describeLogoutImpact(profile.name,found,options.force===true));if(options.force!==true)throw new LogoutRefusedError}const apiUrl=effectiveApiUrl(profile,creds.api_url);const revoked=await httpFetch(`${apiUrl}/api/v2/auth/logout`,{method:"POST",headers:{Accept:"applic\
53
+ `);return}const{describeLogoutImpact,findLoopsUsingProfile}=await import("./logout-guard-FCCJSF5V.js");const found=findLoopsUsingProfile(profile.name,options.logoutGuard);if(found.users.length>0||found.undetermined.length>0){writeErr(describeLogoutImpact(profile.name,found,options.force===true));if(options.force!==true)throw new LogoutRefusedError}const apiUrl=effectiveApiUrl(profile,creds.api_url);const revoked=await httpFetch(`${apiUrl}/api/v2/auth/logout`,{method:"POST",headers:{Accept:"applic\
54
54
  ation/json",Authorization:`Bearer ${creds.token}`}}).then(res=>res.ok,()=>false);await deleteCredentials(profile.name);writeOut(`\u2705 \u30ED\u30B0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF08\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: ${profile.name} / \u30C8\u30FC\u30AF\u30F3: ${maskToken(creds.token)}\uFF09
55
55
  `);if(!revoked){writeOut("\u26A0 \u30B5\u30FC\u30D0\u5074\u306E\u30C8\u30FC\u30AF\u30F3\u5931\u52B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u7B49\uFF09\u3002TWP \u306E\u300C\u8A2D\u5B9A > CLI\u7AEF\u672B\u300D\u304B\u3089\u3082\u5931\u52B9\u3067\u304D\u307E\u3059\u3002\n")}})}async function runWhoami(options){return run(async()=>{const profile=resolveProfile(options.profile);const structured=options.output!==void 0||options.query!==void 0;let format=null;if(structured){
56
56
  const{resolveOutputFormat,OUTPUT_FORMATS}=await import("./format-F6PPBPY5.js");format=resolveOutputFormat({...options.output!==void 0?{flag:options.output}:{},isTty:process.stdout.isTTY===true});if(format===null){throw new UsageError(`--output \u306B\u300C${options.output??""}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${OUTPUT_FORMATS.join(" / ")} \u3067\u3059`)}}const stored=loadCredentials(profile.name);const apiUrl=effectiveApiUrl(
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{defaultIsLoopProcess,readLockOwner,sameTwpHome}from"./chunk-3WHC4FSG.js";import{LEGACY_STATE_DIR_NAME,STATE_DIR_NAME,loopStateDir}from"./chunk-RCUI6WWU.js";import"./chunk-XMPHGOW4.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";
3
+ import{defaultIsLoopProcess,readLockOwner,sameTwpHome}from"./chunk-3WHC4FSG.js";import{LEGACY_STATE_DIR_NAME,STATE_DIR_NAME,loopStateDir}from"./chunk-Y24FMUYU.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-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";
4
4
  import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import os from"os";import path from"path";var PIDLESS_GRACE_MS=6e4;function defaultStateDirs(env){const home=os.homedir();const dirs=[loopStateDir(env),path.join(home,STATE_DIR_NAME),path.join(home,LEGACY_STATE_DIR_NAME)].map(d=>path.resolve(d));return[...new Set(dirs)]}function readPidFile(lockDir){try{const raw=fs.readFileSync(path.join(lockDir,"pid"),"utf8").split("\n")[0]?.trim()??"";const n=Number.parseInt(raw,10);return{pid:Number.isInteger(n)&&n>0?n:null,error:null}}catch(err){const code=err.code;return{pid:null,error:code==="ENO\
5
5
  ENT"?null:code??err.message}}}function findLoopsUsingProfile(profileName,deps={}){const env=deps.env??process.env;const now=deps.now??Date.now;const isLoopProcess=deps.isLoopProcess??defaultIsLoopProcess;const myHome=twpHomeDir(env);const result={users:[],undetermined:[]};for(const stateDir of deps.stateDirs??defaultStateDirs(env)){let dirs;try{dirs=fs.readdirSync(stateDir).filter(d=>/^task-loop-.*\.lock\.d$/.test(d))}catch(err){if(err.code==="ENOENT")continue;result.undetermined.push({pid:null,
6
6
  lockDir:stateDir,reason:`\u30ED\u30C3\u30AF\u306E\u7F6E\u304D\u5834\u6240\u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${err.code??err.message}\uFF09`});continue}for(const dir of dirs){const lockDir=path.join(stateDir,dir);const pidFile=readPidFile(lockDir);if(pidFile.error!==null){result.undetermined.push({pid:null,lockDir,reason:`pid \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${pidFile.error}\uFF09`});continue}const owner=readLockOwner(lockDir);let pid=pidFile.pid;if(pid===null){if(owner.ok){pid=owner.
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{checkOutTarget}from"./chunk-AK7CNRVB.js";import"./chunk-YPULDSJ3.js";import"./chunk-PO35MCYP.js";import"./chunk-Q3B65OFC.js";import"./chunk-GFLGXGWE.js";import{contentTypeFor,inspectLocalFile}from"./chunk-WTYIFLVB.js";import{checkUploadQuota}from"./chunk-V64CGX7V.js";import{parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";import"./chunk-LDBYJPRD.js";import"./chunk-RMFLTSOV.js";import{repeatedValues}from"./chunk-RX5HWI4L.js";
3
+ import{checkOutTarget}from"./chunk-WMIIFPXT.js";import"./chunk-4DY3NU53.js";import"./chunk-PO35MCYP.js";import"./chunk-Q3B65OFC.js";import"./chunk-GFLGXGWE.js";import{contentTypeFor,inspectLocalFile}from"./chunk-WTYIFLVB.js";import{checkUploadQuota}from"./chunk-V64CGX7V.js";import{parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";import"./chunk-LDBYJPRD.js";import"./chunk-RMFLTSOV.js";import{repeatedValues}from"./chunk-RX5HWI4L.js";
4
4
  import{readBody}from"./chunk-6LSQCOCJ.js";import"./chunk-RSSPNFSK.js";import{collapsesInUrlPath,isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import{acknowledgement,
5
5
  isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,NetworkError,UsageError,WaitTimeoutError}from"./chunk-VFPY2A23.js";import"./chunk-PECIBNFD.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-MLRBDF44.js";import"./chunk-QQRJLH6B.js";import"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import"./chunk-NHYMHCAT.js";
6
6
  import"./chunk-VSJBJXZO.js";import crypto2 from"crypto";import fs2 from"fs";import path from"path";var SCOPE_PERSONAL="personal";var SCOPE_PROJECT="project";var UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var FORBIDDEN_NAME=/[/\\:*?"<>|]/;var NAME_MAX=255;var ROW_COLUMNS=["id","path","name","file_count","subfolder_count","parent_id","updated_at"];var TRASH_COLUMNS=["id","path","name","file_count","subfolder_count","parent_id","deleted_at"];function folderRows(raw){return raw.map(row=>{const id=row["id"];const name=row["name"];const parentId=row["parent_id"];if(typeof id!==
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,displayCwd,residentInputs,runTurn}from"./chunk-TH3NVRAU.js";import"./chunk-NZ7WI4RZ.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";
4
- import{RelayError,createRuntime,pickModel,specFor}from"./chunk-TVTJRNUC.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,enforceMinSupportedVersion,floorNeedsRefresh}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{getMode}from"./chunk-2LOT54OO.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
3
+ import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,displayCwd,residentInputs,runTurn}from"./chunk-DRERU42W.js";import"./chunk-NZ7WI4RZ.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";
4
+ import{RelayError,createRuntime,pickModel,specFor}from"./chunk-VON6ODNL.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,enforceMinSupportedVersion,floorNeedsRefresh}from"./chunk-DXXFUNYN.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import{getMode}from"./chunk-2LOT54OO.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
5
5
  import"./chunk-VSJBJXZO.js";async function runOneShot(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));activateModeFiles(err);const permissionLayers=activatePermissionSettings(err,{...opts.allowedTools?{allowedTools:opts.allowedTools}:{},...opts.disallowedTools?{disallowedTools:opts.disallowedTools}:{}});const prompt=opts.fromStdin?await(deps.readStdin??readStdin)():opts.prompt;if(prompt.trim()===
6
6
  ""){err('\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u7A7A\u3067\u3059\u3002`twp -p "\u8CEA\u554F"`\uFF08`-p -` \u3067\u6A19\u6E96\u5165\u529B\uFF09\n');return 2}const runtime=deps.runtime??createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},...opts.model!==void 0?{model:opts.model}:{},cliVersion:opts.version});const cachedFloor=runtime.loadCachedFloor();if(await checkMinSupportedVersion({current:opts.version,cachedFloor:cachedFloor.minSupportedVersion,refresh:async()=>(await runtime.loadCatalog()).
7
7
  minSupportedVersion,write:err})){return 1}if(!runtime.loggedIn){err("\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002`twp login` \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n");return 1}let model=runtime.configuredModel??"";let catalog=null;if(model===""){catalog=await runtime.loadCatalog();const picked=pickModel(catalog,void 0);model=picked.model;if(catalog.source!=="server"){err(`\u26A0 \u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081 ${model}\
@@ -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-M6FZ62YR.js";import"./chunk-QGJYT4NH.js";import"./chunk-JUJSF5ZG.js";import"./chunk-RCUI6WWU.js";import"./chunk-XMPHGOW4.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-LDBYJPRD.js";
3
+ import{NO_PLAN_SESSION,PLAN_DIR_ENV,PLAN_TOKEN_ENV,checkPlan,fileSkillNames,formatCheck,openPlanSession,runPlanSubmit}from"./chunk-ZPQZLUYY.js";import"./chunk-7VMPEAAL.js";import"./chunk-JUJSF5ZG.js";import"./chunk-Y24FMUYU.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-O52RKZCC.js";import"./chunk-LDBYJPRD.js";
4
4
  import"./chunk-RMFLTSOV.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};
@@ -1,3 +1,3 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{loadDomain}from"./chunk-YPULDSJ3.js";import"./chunk-VSJBJXZO.js";export{loadDomain};
3
+ import{loadDomain}from"./chunk-4DY3NU53.js";import"./chunk-VSJBJXZO.js";export{loadDomain};
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CURATED_PAGING_VOCABULARY,buildPrepareContext,checkOutTarget,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-AK7CNRVB.js";import"./chunk-YPULDSJ3.js";import"./chunk-PO35MCYP.js";import"./chunk-Q3B65OFC.js";import"./chunk-GFLGXGWE.js";import"./chunk-LDBYJPRD.js";import"./chunk-RX5HWI4L.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";
3
+ import{CURATED_PAGING_VOCABULARY,buildPrepareContext,checkOutTarget,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-WMIIFPXT.js";import"./chunk-4DY3NU53.js";import"./chunk-PO35MCYP.js";import"./chunk-Q3B65OFC.js";import"./chunk-GFLGXGWE.js";import"./chunk-LDBYJPRD.js";import"./chunk-RX5HWI4L.js";import"./chunk-RSSPNFSK.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";
4
4
  import"./chunk-MI6HVYR2.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import"./chunk-VFPY2A23.js";import"./chunk-PECIBNFD.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-MLRBDF44.js";import"./chunk-QQRJLH6B.js";import"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{CURATED_PAGING_VOCABULARY,buildPrepareContext,checkOutTarget,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain};
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{LoopSettingsApplier,PROMPT_KEYS,formatConfigHash,parseServerSettings,renderStepBudget}from"./chunk-5YJAT7HE.js";import"./chunk-RCUI6WWU.js";import"./chunk-XMPHGOW4.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-O52RKZCC.js";import"./chunk-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";
3
+ import{LoopSettingsApplier,PROMPT_KEYS,formatConfigHash,parseServerSettings,renderStepBudget}from"./chunk-4FCPLEZN.js";import"./chunk-Y24FMUYU.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-O52RKZCC.js";import"./chunk-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";
4
4
  import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{LoopSettingsApplier,PROMPT_KEYS,formatConfigHash,parseServerSettings,renderStepBudget};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{detectAiClis,formatDetection,isDetectableAi,isSelectable}from"./chunk-5SONMN6K.js";import{PromptAbortedError,promptText}from"./chunk-L37NS5L2.js";import{localConfigPath,parseClaudeLauncher}from"./chunk-RCUI6WWU.js";import"./chunk-XMPHGOW4.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import{AiConfig}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";
3
+ import{detectAiClis,formatDetection,isDetectableAi,isSelectable}from"./chunk-5SONMN6K.js";import{PromptAbortedError,promptText}from"./chunk-L37NS5L2.js";import{localConfigPath,parseClaudeLauncher}from"./chunk-Y24FMUYU.js";import"./chunk-CVX2YWHC.js";import"./chunk-VYDPW2YO.js";import"./chunk-TTST7UDR.js";import{AiConfig}from"./chunk-FABDZBDZ.js";import"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";import"./chunk-RMFLTSOV.js";import"./chunk-PMOUHEJQ.js";
4
4
  import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";var RECOMMENDED_ROTATION={complex:["claude"],verify:["claude"],security:["claude"],support:["claude"],triage:["claude"],search:["claude"],simple:["claude"]};var RECOMMENDED_CHAINS={complex:["claude","codex"],verify:["claude","codex","copilot"],security:["claude","codex","copilot"],support:["claude","codex","copilot"],triage:["codex","gemini","copilot","claude"],search:["codex","gemini","copilot","claude"],simple:["codex","gemini","copilot","claude"]};var PREFERENCE=["claude","codex","gemini","co\
5
5
  pilot"];function buildAiAssignment(selected){if(selected.length===0)throw new Error("\u9078\u629E\u3055\u308C\u305FAI\u304C\u7A7A\u3067\u3059");const fallbackOrder=PREFERENCE.filter(ai=>selected.includes(ai));for(const ai of selected)if(!fallbackOrder.includes(ai))fallbackOrder.push(ai);const chains={};const rotation={};for(const category of Object.keys(RECOMMENDED_CHAINS)){const filtered=(RECOMMENDED_CHAINS[category]??[]).filter(ai=>selected.includes(ai));const chain=filtered.length>0?filtered:
6
6
  [...fallbackOrder];chains[category]=chain;const rot=(RECOMMENDED_ROTATION[category]??[]).filter(ai=>selected.includes(ai));const head=chain[0];rotation[category]=rot.length>0?rot:head===void 0?[...fallbackOrder]:[head]}return{primary_rotation:rotation,fallback_chains:chains}}var SETUP_EXIT_NO_CLI=3;var SETUP_EXIT_ABORTED=130;async function runSetup(opts){const env=opts.env??process.env;const rawOut=opts.out??(t=>void process.stdout.write(t));const rawErr=opts.err??(t=>void process.stderr.write(t));
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{ScheduleApi,flag}from"./chunk-IIK77LSC.js";import{DEFAULT_CHARTER_FILE}from"./chunk-LH4AZKLT.js";import{DEFAULT_SKILL_DIR,fetchList,fetchSkill}from"./chunk-MYBIPHZ7.js";import{apiExit,errorDetail,pickNumber,readUtf8Strict}from"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{parseOperations}from"./chunk-XMPHGOW4.js";import"./chunk-TTST7UDR.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";
3
+ import{ScheduleApi,flag}from"./chunk-IIK77LSC.js";import{DEFAULT_CHARTER_FILE}from"./chunk-LH4AZKLT.js";import{DEFAULT_SKILL_DIR,fetchList,fetchSkill}from"./chunk-MYBIPHZ7.js";import{apiExit,errorDetail,pickNumber,readUtf8Strict}from"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{parseOperations}from"./chunk-CVX2YWHC.js";import"./chunk-TTST7UDR.js";import{DEFAULT_SKILL_PREFIX,SKILL_PREFIX_RE}from"./chunk-6CS5L24D.js";import"./chunk-N2UVRM3Z.js";
4
4
  import"./chunk-O52RKZCC.js";import"./chunk-RMFLTSOV.js";import{EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,EXIT_FAILURE,EXIT_OK,EXIT_USAGE}from"./chunk-VFPY2A23.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var KIND_LABEL={broken_ref:"\u58CA\u308C\u305F\u53C2\u7167",missing_plan_skill:"\u8A08\u753B\u30B9\u30AD\u30EB\u304C\u7121\u3044",missing_release_recovery:"\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u30B9\u30AD\u30EB\u304C\u7121\u3044",missing_follow_up:"\u5F8C\u7D9A\u6295\u5165\u306E\u30B9\u30AD\u30EB\u304C\u7121\u3044",missing_schedule_skill:"\u5B9A\u671F\u67A0\u306E\u30B9\u30AD\u30EB\u304C\u7121\u3044",stale_path:"\u53E4\u3044\u30D1\u30B9"};function defaultReadConfig(p){try{return readUtf8Strict(
5
5
  p)}catch(e){if(e.code==="ENOENT")return null;throw e}}function escapeRe(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function clip(line){const t=line.trim();return t.length>200?`${t.slice(0,200)}\u2026`:t}function referencesInLine(line,prefix){const p=escapeRe(prefix);const out=[];const slash=prefix===""?/^[ \t]*\/([a-z][a-z0-9-]*)(?=[ \t]|$)/g:new RegExp(`(?<![A-Za-z0-9_.~:/-])\\/(${p}[a-z0-9][a-z0-9-]*)(?![A-Za-z0-9_/*-])`,"g");for(const m of line.matchAll(slash))out.push(m[1]??"");if(prefix!==
6
6
  ""){const prose=new RegExp(`\u30B9\u30AD\u30EB\\s*\`\\/?(${p}[a-z][a-z0-9-]*)\``,"g");for(const m of line.matchAll(prose))out.push(m[1]??"")}return out.filter(n=>n!=="")}var STALE_PATHS=[new RegExp(`${escapeRe(DEFAULT_SKILL_DIR)}/`),new RegExp(`\\]\\([^)]*${escapeRe(DEFAULT_CHARTER_FILE)}[^)]*\\)`)];function invokedName(invocation){return invocation.trim().replace(/^\//,"").split(/\s+/)[0]??""}function byName(a,b){return a<b?-1:a>b?1:0}function checkCorpus(input){const problems=[];const referenced=new Set;
@@ -1,3 +1,3 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{fetchLatestVersion,isBehindLatest,runUpdate}from"./chunk-KRPJ4UFW.js";import"./chunk-TVTJRNUC.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-CH6QU76P.js";import"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{fetchLatestVersion,isBehindLatest,runUpdate};
3
+ import{fetchLatestVersion,isBehindLatest,runUpdate}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"./chunk-CH6QU76P.js";import"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import"./chunk-EDF4U5BT.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{fetchLatestVersion,isBehindLatest,runUpdate};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tocca-systems/twp-cli",
3
- "version": "0.81.0",
3
+ "version": "0.83.0",
4
4
  "description": "TWP CLI — Tocca Working Platform の CLI 型統合インターフェース(AIエージェントハーネス)",
5
5
  "type": "module",
6
6
  "bin": {