@tocca-systems/twp-cli 0.64.0 → 0.65.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.
- package/CHANGELOG.public.md +12 -0
- package/README.md +69 -4
- package/dist/{agent-UAOZYMQM.js → agent-HM4FHCJT.js} +1 -1
- package/dist/{agent-loop-GPPUR2WD.js → agent-loop-VC47FGPR.js} +2 -2
- package/dist/{ai-dispatch-FZDFJ4TN.js → ai-dispatch-GN5ZQPHC.js} +2 -2
- package/dist/analysis-NEZXCJGT.js +5 -0
- package/dist/{announcement-ASKS53LL.js → announcement-BEPIDOMO.js} +1 -1
- package/dist/{api-command-N2OJNJBC.js → api-command-HP3ABNDG.js} +4 -4
- package/dist/{app-QA2HKG6E.js → app-C4TUNEAO.js} +4 -4
- package/dist/{attendance-correct-KBNPGFGR.js → attendance-correct-ZEWRXHUU.js} +2 -2
- package/dist/{attendance-lists-C7TO3GQ2.js → attendance-lists-BXAHFZYY.js} +2 -2
- package/dist/{backlog-AWOTTGPB.js → backlog-UD226SVD.js} +38 -28
- package/dist/{budget-Z6ILL7AU.js → budget-6HOZNG3E.js} +2 -2
- package/dist/capacity-report-command-A6RYG2NV.js +15 -0
- package/dist/{chunk-234WHKGS.js → chunk-2G6ZZPME.js} +2 -2
- package/dist/{chunk-LAAKI3GS.js → chunk-5AQ2JPIS.js} +1 -1
- package/dist/{chunk-RWR7OHVP.js → chunk-AYE4DF6J.js} +1 -1
- package/dist/{chunk-4CR64SNH.js → chunk-BTN4M7Y5.js} +2 -2
- package/dist/{chunk-S5DEP2HA.js → chunk-BXTAAF5F.js} +1 -1
- package/dist/{chunk-2B7A3OY7.js → chunk-CGHGQAEM.js} +14 -52
- package/dist/{chunk-XPPT3MUY.js → chunk-ENVASCZU.js} +2 -2
- package/dist/{chunk-PIB6MGG5.js → chunk-FAHDBWW2.js} +1 -1
- package/dist/{chunk-NQWTPHUO.js → chunk-FBBKRVVS.js} +1 -1
- package/dist/{chunk-RROCQRRY.js → chunk-FTAKYID7.js} +1 -1
- package/dist/{chunk-JYCJ4N6T.js → chunk-G26GIBRL.js} +1 -1
- package/dist/chunk-G4TZFGNN.js +41 -0
- package/dist/{chunk-5LPELULJ.js → chunk-G6RLNOIZ.js} +1 -1
- package/dist/{chunk-NXWXTUU6.js → chunk-RSATLT5H.js} +1 -1
- package/dist/{chunk-VV4GTQ2L.js → chunk-SCU74Z4U.js} +16 -13
- package/dist/chunk-SPZ3GBYC.js +16 -0
- package/dist/{chunk-QEWCTKPV.js → chunk-UODNIEO2.js} +1 -1
- package/dist/chunk-UUP4X3WH.js +97 -0
- package/dist/{chunk-RZ2NZE4U.js → chunk-WG6NCT4L.js} +18 -17
- package/dist/{chunk-FITASHOM.js → chunk-WHCMWXLC.js} +2 -2
- package/dist/{chunk-UIHNYBME.js → chunk-XNOZJ6T2.js} +1 -1
- package/dist/{chunk-6PQO3AYP.js → chunk-Y2J4M2MG.js} +1 -1
- package/dist/chunk-YASL34FY.js +11 -0
- package/dist/chunk-YYURQG4E.js +4 -0
- package/dist/{chunk-FDRXS6ZU.js → chunk-Z2I5BGXV.js} +1 -1
- package/dist/{chunk-YKI7NYBD.js → chunk-ZJW3GBE5.js} +57 -18
- package/dist/{chunk-ITRTFBV3.js → chunk-ZSPWHEBL.js} +52 -49
- package/dist/cli.js +72 -10
- package/dist/{commands-HK7DUMUJ.js → commands-2FOGOL65.js} +97 -149
- package/dist/{commands-WIQVCMQE.js → commands-EK3EYLQH.js} +1 -1
- package/dist/{company-YPDJZ3SE.js → company-MUGKJNY3.js} +2 -2
- package/dist/{completion-7RHQKR5U.js → completion-DGPGHQNL.js} +4 -3
- package/dist/{contract-2Y5VN3TR.js → contract-DJJQBAWX.js} +2 -2
- package/dist/{department-K4EFC6NW.js → department-RMZ72N6B.js} +1 -1
- package/dist/{deposit-NTLHIMJL.js → deposit-45Y3POXT.js} +1 -1
- package/dist/{estimate-C5LUNIWR.js → estimate-HTAF6FZT.js} +3 -3
- package/dist/{evaluation-ZWUHSENB.js → evaluation-J634U7JQ.js} +1 -1
- package/dist/{expense-BXJ7QYMP.js → expense-EVNQ653C.js} +1 -1
- package/dist/fiscal-year-MVOGDAIP.js +17 -0
- package/dist/{inquiry-KHPPTYN6.js → inquiry-XO5R47OO.js} +1 -1
- package/dist/{invoice-VV2NT4A3.js → invoice-WE2SOMYN.js} +3 -3
- package/dist/{job-title-RCSL5Y2Z.js → job-title-3CGRQILF.js} +1 -1
- package/dist/{knowledge-BLU6RHS5.js → knowledge-X3FGXIBL.js} +1 -1
- package/dist/{leave-RJBCHZCQ.js → leave-IFYBLQBF.js} +3 -3
- package/dist/{logout-guard-GQBF3GQH.js → logout-guard-S2PVXK4V.js} +1 -1
- package/dist/{media-OIAOW546.js → media-X32Y2MOY.js} +3 -3
- package/dist/{notification-KPMGELOR.js → notification-MHYSQKYZ.js} +1 -1
- package/dist/{oneshot-OWEBFX5O.js → oneshot-VL45DNR7.js} +1 -1
- package/dist/{outlook-AAS5DXYQ.js → outlook-YG7GFF44.js} +1 -1
- package/dist/{plan-submit-AWMD7XOY.js → plan-submit-CUVVYDTN.js} +2 -1
- package/dist/{position-NY5LRELH.js → position-6UC7X2BJ.js} +1 -1
- package/dist/{project-4MEGZ326.js → project-LG47ZCEZ.js} +1 -1
- package/dist/{prospect-7D2WK56K.js → prospect-FEU3WQYN.js} +2 -2
- package/dist/{purchase-S7W67LJP.js → purchase-44B2NOOB.js} +3 -3
- package/dist/{receivable-GFJTEELC.js → receivable-NQNZ2B6B.js} +1 -1
- package/dist/{redmine-P3EMFFHY.js → redmine-T3JDIH37.js} +1 -1
- package/dist/{registry-GRRRT3I6.js → registry-LBL4AOZW.js} +1 -1
- package/dist/{report-FUIVLC7B.js → report-GJK2YXVO.js} +1 -1
- package/dist/{run-LSWFO4IY.js → run-RLV6W5JA.js} +2 -2
- package/dist/{sales-ai-review-P36TTQRO.js → sales-ai-review-PUJCOMP6.js} +1 -1
- package/dist/{sales-master-3CGHEFKF.js → sales-master-GRR4WKLO.js} +3 -3
- package/dist/{sales-numbering-3M2C2MAI.js → sales-numbering-IUYAABSM.js} +1 -1
- package/dist/{schedule-command-R5KTFAVZ.js → schedule-command-ZX5WNSAC.js} +1 -1
- package/dist/{search-U3QNPR4D.js → search-N5UE5CUL.js} +1 -1
- package/dist/segment-FQHY6DVH.js +6 -0
- package/dist/server-settings-77MPN3UN.js +3 -0
- package/dist/{server-skills-IFTDV3IQ.js → server-skills-KX236POI.js} +1 -1
- package/dist/{setup-MUPUY2AX.js → setup-PF2VH2TW.js} +1 -1
- package/dist/{skill-C4TGG7SH.js → skill-PWCJCIQO.js} +1 -1
- package/dist/{supplier-payment-KG57PNWJ.js → supplier-payment-HTENSEXJ.js} +2 -2
- package/dist/{support-BRVAJ7IH.js → support-DOWAY63P.js} +1 -1
- package/dist/{task-RYBYPM4N.js → task-OMYFPWQZ.js} +3 -3
- package/dist/{teams-GPJ6HMIX.js → teams-AUFHZRDH.js} +1 -1
- package/dist/{user-3DE46776.js → user-C7UKUPGT.js} +2 -2
- package/dist/user-contract-type-DO576EHJ.js +32 -0
- package/dist/{worker-agent-XCJGZHMT.js → worker-agent-OBYRYPLC.js} +1 -1
- package/dist/{workflow-MMEOWZJC.js → workflow-C2BEVHQ2.js} +1 -1
- package/package.json +1 -1
- package/dist/analysis-RKWGO7UY.js +0 -4
- package/dist/chunk-4P7EYEL5.js +0 -4
- package/dist/chunk-AT432SCP.js +0 -15
- package/dist/chunk-QHX5YFMM.js +0 -23
- package/dist/chunk-THOBFX2S.js +0 -10
- package/dist/server-settings-3YD7RR3A.js +0 -3
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
4
|
-
|
|
5
|
-
import"./chunk-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-BXTAAF5F.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-RSATLT5H.js";import{NO_PLAN_SESSION,RECENT_ADVANCE_WINDOW_HOURS,ReleaseOutcomeLog,buildDynamicBlocks,buildRecentCandidateIndex,createItem,enqueueBlockerRecovery,enqueueDevVerifyForMerged,enqueueReleasePartialMergeRerun,enqueueReleasePhase5Recovery,fileSkillNames,findRecentCandidate,formatInflightEntry,formatPlanResultLine,formatRecentAdvance,
|
|
4
|
+
inflightEntries,inflightStaleHours,openPlanSession,parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-UUP4X3WH.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-FAHDBWW2.js";
|
|
5
|
+
import"./chunk-YJZT3UD3.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-T4QZO6RQ.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,stepToItem,zeroTargetDropReasons}from"./chunk-UODNIEO2.js";import"./chunk-DXUFECE7.js";
|
|
6
|
+
import{buildLoopConfig,describeOperations,evaluateOwnership,evaluatePlanGate,exportStateDirEnv,loopStateDir,planGateStatePath,recordPlanned}from"./chunk-CGHGQAEM.js";import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,spawnSyncResolved}from"./chunk-AEJHDFXB.js";import{CapacityReporter,formatHookIds,formatHookWiring,runHook,runPrefetch,runPreflight}from"./chunk-G4TZFGNN.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{AgentLoopApi,describeError,
|
|
7
|
+
filterByStatus,isPermanent,pick,pickString}from"./chunk-SPZ3GBYC.js";import{PRIVATE_PROJECT_REF,isPrivateProjectId,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-GY7KI5E5.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";
|
|
8
|
+
import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import{effectiveApiUrl,resolveProfile}from"./chunk-4VZKNEVN.js";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(
|
|
8
9
|
message)}
|
|
9
10
|
`;this.out.write(line);this.stream?.write(line)}separator(){this.log("=".repeat(60))}close(){this.stream?.end();this.stream=null}};function pad(n){return String(n).padStart(2,"0")}function rotateLogs(dir,retentionDays,now=Date.now()){if(retentionDays<=0)return;const cutoff=now-retentionDays*864e5;let entries;try{entries=fs.readdirSync(dir)}catch{return}for(const name of entries){if(!/^(agent-loop|task-loop|step|plan|schedule-enqueued)-.*\.(log|txt)$/.test(name))continue;const file=path.join(dir,
|
|
10
|
-
name);try{if(fs.statSync(file).mtimeMs<cutoff)fs.rmSync(file,{force:true})}catch{}}}import
|
|
11
|
+
name);try{if(fs.statSync(file).mtimeMs<cutoff)fs.rmSync(file,{force:true})}catch{}}}import fs6 from"fs";import os2 from"os";import path4 from"path";var MAX_OUTCOME_DETAIL_LENGTH=1e3;function parseOutcomeDetail(logText){const matches=[...logText.matchAll(/\b[A-Z][A-Z0-9_]*_RESULT:[^\n]*/g)];const line=matches.at(-1)?.[0];if(line===void 0)return null;const sep=line.indexOf("|");if(sep<0)return null;const detail=line.slice(sep+1).split("|").map(s=>s.trim()).filter(s=>s!=="").join(" | ");return detail===""?null:detail.slice(0,MAX_OUTCOME_DETAIL_LENGTH)}var str=v=>typeof v==="string"&&v!==""?v:null;function toRun(v){if(v===null||typeof v!=="obje\
|
|
11
12
|
ct"||Array.isArray(v))return null;const r=v;return{runnerId:str(r["runner_id"]),completedAt:str(r["completed_at"])??str(r["created_at"]),outcomeCode:str(r["outcome_code"]),outcomeDetail:str(r["outcome_detail"])}}function parseOutcomesResponse(skill,res){const failed={skill,recent:null,summary:null,truncated:false};if(!res.ok)return failed;const json=res.json;if(json===null||typeof json!=="object"||Array.isArray(json))return failed;const top=json;const data=top["data"];const b=data!==null&&typeof data===
|
|
12
13
|
"object"&&!Array.isArray(data)&&"items"in data?data:top;const items=b["items"];if(!Array.isArray(items))return failed;const recent=items.map(toRun).filter(r=>r!==null);const s=b["summary"];let summary=null;if(s!==null&&typeof s==="object"&&!Array.isArray(s)){const o=s;const streak=typeof o["failure_streak"]==="number"?o["failure_streak"]:0;const alert=typeof o["streak_alert"]==="number"?o["streak_alert"]:null;summary={lastSuccessAt:str(o["last_success_at"]),failureStreak:streak,streakIsLowerBound:o["\
|
|
13
14
|
streak_is_lower_bound"]===true,streakReasons:(Array.isArray(o["streak_reasons"])?o["streak_reasons"]:[]).map(toRun).filter(r=>r!==null),noContractSinceSuccess:typeof o["no_contract_since_success"]==="number"?o["no_contract_since_success"]:0,streakAlert:alert,alerting:o["alerting"]===true}}return{skill,recent,summary,truncated:b["truncated"]===true}}async function fetchOutcomeReports(api,skills){return Promise.all(skills.map(async skill=>{try{return parseOutcomesResponse(skill,await api.outcomes(
|
|
@@ -41,7 +42,8 @@ this.log.log(` \u26A0\uFE0F \u30D5\u30C3\u30AF\u914D\u7DDA\u306E\u5831\u544A\u
|
|
|
41
42
|
const platform=runnerPlatform();if(platform!==null)p.platform=platform;if(itemId)p.current_item_id=itemId;if(force)p.force=true;return p}async checkHeartbeatInterval(){const res=await this.api.runners();if(!res.ok)return;const timeout=pick(res.json,"heartbeat_timeout");if(typeof timeout!=="number")return;this.heartbeatTimeoutServer=timeout;if(this.config.heartbeatIntervalSec>=timeout){this.log.log(` \u26A0\uFE0F AGENT_LOOP_HEARTBEAT_INTERVAL=${this.config.heartbeatIntervalSec}\u79D2 \u304C\u30B5\u30FC\u30D0\u306E\u6B7B\u6D3B\u3057\u304D\u3044\u5024 ${timeout}\
|
|
42
43
|
\u79D2 \u4EE5\u4E0A\u3067\u3059`);this.log.log(" \u3053\u306E\u307E\u307E\u3067\u306F\u81EA\u5206\u304C\u300C\u5FDC\u7B54\u306A\u3057\u300D\u3068\u5224\u5B9A\u3055\u308C\u3001\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u3092\u4ED6\u6A5F\u306B\u56DE\u53CE\u3055\u308C\u3001\u8A08\u753B\u30ED\u30C3\u30AF\u306E\u5EF6\u9577\u3082 409 \u3067\u901A\u3089\u306A\u304F\u306A\u308A\u307E\u3059\uFF08\u3057\u304D\u3044\u5024\u306E 1/3 \u4EE5\u4E0B\u3092\u63A8\u5968\uFF09")}}async registerOrThrow(){let lastStatus;
|
|
43
44
|
let lastBody;let lastDetail;const registering=this.capacityRefresh(true);if(registering!==null)await registering;for(let attempt=1;;attempt++){const res=await this.api.registerRunner(this.payload("idle","",this.forcePending));this.forcePending=false;lastStatus=res.status;lastBody=res.json;lastDetail=describeError(res);if(res.ok){this.registered=true;this.log.log(` \u30E9\u30F3\u30CA\u30FC\u767B\u9332: ${this.config.runnerId}\uFF08run_id: ${this.config.runId}\uFF09`);return}const permanent=res.status!==
|
|
44
|
-
null&&res.status>=400&&res.status<500;if(!permanent&&attempt<3){this.log.log(` \u26A0\uFE0F \u30E9\u30F3\u30CA\u30FC\u767B\u9332\u306B\u5931\u6557\uFF08${lastDetail}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C\u3057\u307E\u3059`);this.capacity?.rearm();await sleep(5e3);continue}break}if(lastStatus===409){this.log.log("\u274C \u3053\u306E\u30E9\u30F3\u30CA\u30FCID\u306F\
|
|
45
|
+
null&&res.status>=400&&res.status<500;if(!permanent&&attempt<3){this.log.log(` \u26A0\uFE0F \u30E9\u30F3\u30CA\u30FC\u767B\u9332\u306B\u5931\u6557\uFF08${lastDetail}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C\u3057\u307E\u3059`);this.capacity?.rearm();await sleep(5e3);continue}break}if(lastStatus===409&&pickString(lastBody,"reason")==="kind_mismatch"){this.log.log("\u274C \u3053\u306E\u30E9\u30F3\u30CA\u30FCID\u306F\u67A0\u5831\u544A\u5C02\u7528\u6A5F\uFF08capacity report\uFF09\u3068\u3057\u3066\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\uFF08HTTP 409\u30FBkind_mismatch\uFF09");
|
|
46
|
+
this.log.log(" \u30EB\u30FC\u30D7\u306B\u306F\u5225\u306E runner_id \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\uFF08RUNNER_ID \u304B TWP_OPS_STATE_DIR \u3092\u5206\u3051\u308B\uFF09");this.log.log(" **--force-runner \u3067\u306F\u901A\u308A\u307E\u305B\u3093**\uFF08\u7A2E\u5225\u304C\u9055\u3046\u305F\u3081\uFF09")}else if(lastStatus===409){this.log.log("\u274C \u3053\u306E\u30E9\u30F3\u30CA\u30FCID\u306F\u5225\u30D7\u30ED\u30BB\u30B9\u304C\u7A3C\u50CD\u4E2D\u3068\u3057\u3066\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\uFF08HTTP 409\uFF09");
|
|
45
47
|
this.log.log(" \u524D\u306E\u30D7\u30ED\u30BB\u30B9\u304C\u7570\u5E38\u7D42\u4E86\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u767B\u9332\u3092\u596A\u3063\u3066\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044:");this.log.log(` twp task-loop run --project ${this.config.projectRef} --force-runner`);this.log.log(" \u26A0\uFE0F \u305F\u3060\u3057**\u524D\u306E\u30D7\u30ED\u30BB\u30B9\u304C\u751F\u304D\u3066\u3044\u308B\u5834\u5408\u306F\u4F7F\u308F\u306A\u3044\u3053\u3068**\uFF08\u5B9F\u884C\u4E2D\u30A2\u30A4\u30C6\u30E0\u304C\u4E8C\u91CD\u306B\u8D70\u308A\u307E\u3059\uFF09");
|
|
46
48
|
this.log.log(` \uFF08\u30B5\u30FC\u30D0\u306E\u767B\u9332\u306F\u6B7B\u6D3B\u3057\u304D\u3044\u5024 ${this.heartbeatTimeoutServer??600}\u79D2 \u307E\u3067 live \u6271\u3044\u306E\u305F\u3081\u3001\u5F85\u3063\u3066\u3082\u6570\u5206\u304B\u304B\u308A\u307E\u3059\uFF09`)}else if(lastStatus===403){if(pickString(lastBody,"reason")==="max_runners_exceeded"){this.log.log("\u274C \u7A3C\u50CD\u30E9\u30F3\u30CA\u30FC\u304C\u4E0A\u9650\u306B\u9054\u3057\u3066\u3044\u307E\u3059\uFF08HTTP 403\u30FBmax_runners_exceeded\uFF09");
|
|
47
49
|
this.log.log(" \u53F0\u6570\u8A2D\u5B9A\uFF08\u30B5\u30FC\u30D0\u5074 AGENT_LOOP_MAX_RUNNERS\uFF09\u3092\u898B\u76F4\u3059\u304B\u3001\u4E0D\u8981\u306A\u30E9\u30F3\u30CA\u30FC\u3092\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044");this.log.log(" **--force-runner \u3067\u306F\u901A\u308A\u307E\u305B\u3093**\uFF08\u8A2D\u5B9A\u3092\u76F4\u3059\u307E\u3067\u540C\u3058\u7D50\u679C\u306B\u306A\u308A\u307E\u3059\uFF09")}else{this.log.log(`\u274C \u30E9\u30F3\u30CA\u30FC\u767B\u9332\u304C 403 \u3067\u62D2\u5426\u3055\u308C\u307E\u3057\u305F: ${lastDetail}`);
|
|
@@ -77,77 +79,11 @@ startedAt} \u2192 ${token}\uFF09`);this.startedAt=token}if(reason!=="renewed")th
|
|
|
77
79
|
renewIntervalSec=derived}isLost(){return this.lostReason!==null}lostReasonText(){return this.lostReason??"\u4E0D\u660E"}reportIfLost(){if(this.lostReason===null)return;const why=this.lostReason;this.lostReason=null;this.deps.log.log(` \u26A0\uFE0F \u8A08\u753B\u306E\u5B9F\u884C\u4E2D\u306B\u8A08\u753B\u30ED\u30C3\u30AF\u3092\u5931\u3044\u307E\u3057\u305F\uFF08reason=${why}\uFF09\u3002\u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u540C\u3058\u67A0\u3067\u8A08\u753B\u3057\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`);
|
|
78
80
|
if(why==="runner_not_registered"){this.deps.log.log(" \u539F\u56E0\u306F\u30E9\u30F3\u30CA\u30FC\u767B\u9332\u306E\u5931\u52B9\u3067\u3059\uFF08heartbeat \u5207\u308C\u30FB\u540C\u3058 runner_id \u3092\u5225\u30D7\u30ED\u30BB\u30B9\u304C\u53D6\u5F97\uFF09\u3002\u4EE5\u5F8C\u3053\u306E\u8A08\u753B\u4E2D\u306F\u5EF6\u9577\u3067\u304D\u3066\u3044\u307E\u305B\u3093")}else if(why==="acquired"||why==="reacquired"){this.deps.log.log(` \u4E00\u5EA6\u5931\u3063\u305F\u30ED\u30C3\u30AF\u3092\u53D6\u308A\u76F4\u3057\u3066\u3044\u307E\u3059\u3002\u8A08\u753B\u304C\u671F\u9650\u3088\u308A\u9577\u3044\u304B\u3001\u671F\u9650\u306E\u60F3\u5B9A\uFF08${this.
|
|
79
81
|
deps.config.planLockTtlSec}\u79D2\uFF09\u304C\u30B5\u30FC\u30D0\u8A2D\u5B9A\u3068\u305A\u308C\u3066\u3044\u307E\u3059`)}}};function describeOwner(json){const live=pickString(json,"state.owner_is_live");const liveText=live==="true"?"\u7A3C\u50CD\u4E2D":live==="false"?"\u5FDC\u7B54\u306A\u3057":"\u5224\u5B9A\u4E0D\u80FD";return[`runner=${pickString(json,"state.plan_owner_runner_id")||"\u4E0D\u660E"}`,`run=${pickString(json,"state.plan_owner")||"\u4E0D\u660E"}`,`\u958B\u59CB=${pickString(json,"stat\
|
|
80
|
-
e.plan_started_at")||"\u4E0D\u660E"}`,`\u671F\u9650=${pickString(json,"state.plan_lock_expires_at")||"\u4E0D\u660E"}`,`\u6B7B\u6D3B=${liveText}`].join(" ")}var
|
|
81
|
-
floor((now.getTime()-ts)/6e4)}return null}function inflightEntries(items,now=new Date,staleHours=INFLIGHT_STALE_HOURS){const staleMinutes=staleHours*60;const byKey=new Map;for(const item of items){const key=(item.task_key??"").trim();if(!key)continue;const ageMinutes=ageMinutesOf(item,now);if(ageMinutes!==null&&ageMinutes>staleMinutes)continue;const entry={key,runner:item.runner_id??"-",ageMinutes,label:(item.label??"").slice(0,60)};const prev=byKey.get(key);if(!prev||(entry.ageMinutes??-1)>(prev.
|
|
82
|
-
ageMinutes??-1))byKey.set(key,entry)}return[...byKey.values()].sort((a,b)=>a.key.localeCompare(b.key))}function formatInflightEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.key} runner=${entry.runner} \u7D4C\u904E=${age}`}import fs4 from"fs";import path3 from"path";async function createItem(api,body){const res=await api.create(body);if(!res.ok)return{itemId:null,detail:describeError(res)};for(const p of["item_id","id","item.item_id","item.id","data.item_id","data.id"]){const v=pickString(res.json,p);if(v)return{itemId:v,detail:""}}return{itemId:null,detail:`item_id \u3092\u8AAD\u3081\u307E\u305B\u3093: ${res.raw.slice(0,200)}`}}function reorderSucceeded(targetId,json){if(pick(json,"result")===true)return true;const raw=Array.isArray(json)?json:pick(json,"i\
|
|
83
|
-
tems");if(!Array.isArray(raw)||raw.length===0)return false;const items=raw;const orderOf=it=>typeof it.sort_order==="number"?it.sort_order:Number.POSITIVE_INFINITY;const hit=items.find(it=>(it.item_id??"")===targetId);if(!hit)return false;return orderOf(hit)===Math.min(...items.map(orderOf))}function queueContainsKey(items,key){const re=new RegExp(`${key.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![0-9])`);return items.some(it=>re.test(`${it.label??""}
|
|
84
|
-
${it.prompt??""}
|
|
85
|
-
${it.task_key??""}`))}function localTimestamp(at=new Date){const p2=n=>String(n).padStart(2,"0");const offsetMin=-at.getTimezoneOffset();const sign=offsetMin>=0?"+":"-";const abs=Math.abs(offsetMin);return`${at.getFullYear()}-${p2(at.getMonth()+1)}-${p2(at.getDate())}T${p2(at.getHours())}:${p2(at.getMinutes())}:${p2(at.getSeconds())}${sign}${p2(Math.trunc(abs/60))}${p2(abs%60)}`}var ReleaseOutcomeLog=class{constructor(file){this.file=file}file;record(result,phase,reason,ai){const clean=reason.replace(
|
|
86
|
-
/[\t\n]/g," ").slice(0,200);const line=`${localTimestamp()} ${result} ${phase||"unknown"} ${ai||"unknown"} ${clean}
|
|
87
|
-
`;try{fs4.mkdirSync(path3.dirname(this.file),{recursive:true});fs4.appendFileSync(this.file,line)}catch{}}};function parseReleaseResult(logText){const matches=[...logText.matchAll(/RELEASE_RESULT:[^|\n]*\|[^|\n]*\|[^\n]*/g)];const line=matches.at(-1)?.[0];if(!line)return null;const parts=line.split("|").map(s=>s.trim());return{executed:!/NOT_EXECUTED/.test(parts[0]??""),phase:parts[1]??"",reason:parts[2]??"",line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];
|
|
88
|
-
const last=matches.at(-1);if(last===void 0)return null;const value=(last[2]??"").trim();return value===""?null:`${last[1]??""}: ${value}`}var RECOVER_KEY_RE=/RECOVER:[ \t]*([^\s|、,,]+-\d+)/;function parseRecoverKey(line){const raw=RECOVER_KEY_RE.exec(line)?.[1];if(raw===void 0)return null;if(!raw.includes("%"))return raw;try{const key=decodeURIComponent(raw);return isTaskKey(key)&&key.trim()===key?key:null}catch{return null}}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.
|
|
89
|
-
exec(line);return m?.[1]??null}function parsePhase5Pending(line){const m=/PHASE5_PENDING:\s*(\d+)/.exec(line);return m?.[1]??null}function parseKeysLine(logText,keysLine){const prefix=keysLine.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");const matches=[...logText.matchAll(new RegExp(`${prefix}:[ \\t]*([A-Za-z0-9,_-]*)`,"g"))];const raw=matches.at(-1)?.[1];if(raw===void 0)return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;
|
|
90
|
-
var PARTIAL_MERGE_ESCALATION_MAX=1;var TANI_USER_ID="2f391dda-f0e3-42f8-a9fd-8ffc271be765";var STATUS_HUMAN_DECISION="35e2d271-8a6e-4f3f-8bb6-1588a2d5a894";async function enqueueBlockerRecovery(deps,releaseLine){const{api,config,log}=deps;const key=parseRecoverKey(releaseLine);if(!key)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");
|
|
91
|
-
log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");return}if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);
|
|
92
|
-
return}const today=localDate(config.counterTimezone);const res=await api.consumeCounter(`blocker_recovery.${key}`,today,config.blockerRecoveryMaxPerDay);if(!res.ok){if(res.status!==null&&res.status>=400&&res.status<500){log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002**\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u307E\u305B\u3093**`);log.log(` \u78BA\u8A8D:\
|
|
93
|
-
\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u73FE\u5728 ${config.counterTimezone}\u30FB\u9001\u4FE1\u3057\u305F\u65E5\u4ED8 ${today}\uFF09\uFF0F\u4E0A\u9650\uFF08\u73FE\u5728 ${config.blockerRecoveryMaxPerDay}\uFF09`)}else{log.log(` \u26D4 ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}
|
|
94
|
-
return}const granted=pickString(res.json,"granted");const count=pickString(res.json,"counter.count");if(granted===""){log.log(` \u26D4 ${key} \u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306F\u672C\u65E5 ${count||
|
|
95
|
-
"?"} \u56DE\u6295\u5165\u6E08\u307F\uFF08\u4E0A\u9650 ${config.blockerRecoveryMaxPerDay}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u4EBA\u9593\u5224\u65AD\u3078\u5BC4\u305B\u3066\u304F\u3060\u3055\u3044`);return}const{itemId,detail}=await createItem(api,{label:`[\u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC] ${key} \u306E\u4FEE\u6B63\uFF08\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u89E3\u9664\u306E\u305F\u3081\u6700\u512A\u5148\uFF09 #ai:complex`,prompt:`/twp-ta\
|
|
96
|
-
sk-investigate-and-fix ${key}`,ai_type:"claude",task_key:key});if(!itemId){log.log(` \u26A0\uFE0F ${key} \u306E\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB \u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC ${key}\
|
|
97
|
-
\u306E\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u306B\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(` \u26A0\uFE0F ${key} \u306E\u4FEE\u6B63\u30A2\u30A4\u30C6\u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09`)}}function queueContainsSkill(items,skillCommand){
|
|
98
|
-
return items.some(it=>(it.prompt??"").includes(skillCommand))}async function enqueueReleasePhase5Recovery(deps,releaseLine){const{api,config,log}=deps;const releaseId=parsePhase5Pending(releaseLine);if(!releaseId)return;const recoverySkill=config.operations.releaseRecoverySkill;if(!recoverySkill)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");
|
|
99
|
-
log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u304C\u4E8C\u91CD\u306B\u8D70\u308A\u307E\u3059\uFF09");return}if(queueContainsSkill(queued,recoverySkill)){log.log(" \u23ED \u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7");
|
|
100
|
-
return}const today=localDate(config.counterTimezone);const res=await api.consumeCounter(`release_phase5.${releaseId}`,today,PHASE5_RECOVERY_MAX);if(!res.ok){log.log(` \u26D4 release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u5B9A\u671F\u67A0\u304C\u62FE\u3044\u307E\u3059\uFF09`);return}const granted=pickString(
|
|
101
|
-
res.json,"granted");if(granted===""){log.log(` \u26D4 release ${releaseId} \u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u306F\u4E0A\u9650\uFF08${PHASE5_RECOVERY_MAX}\
|
|
102
|
-
\u56DE/\u65E5\uFF09\u306B\u9054\u3057\u3066\u3044\u307E\u3059 \u2192 \u5B9A\u671F\u67A0\u306B\u59D4\u306D\u307E\u3059`);return}const{itemId,detail}=await createItem(api,{label:`[\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE] release ${releaseId} \u306E\u672C\u756A\u53CD\u6620\u78BA\u8A8D\u30FB\u30B9\u30C6\u30FC\u30BF\u30B9\u66F4\u65B0\u304C\u672A\u5B9F\u65BD #ai:complex`,prompt:recoverySkill,ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);
|
|
103
|
-
return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u306B\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(` \u26A0\uFE0F release ${releaseId} \u306E\u30EA\u30EA\u30FC\u30B9\u56DE\u53CE\u30A2\u30A4\u30C6\u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09`)}}
|
|
104
|
-
async function enqueueReleasePartialMergeRerun(deps,releaseLine){const{api,config,log}=deps;const recoverySkill=config.operations.releaseRecoverySkill;if(!recoverySkill)return;const cause=parsePartialMergeCause(releaseLine);if(!cause)return;log.log(` \u{1F9E9} \u90E8\u5206\u30DE\u30FC\u30B8\u3092\u691C\u77E5\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\uFF09\u3002\u5224\u65AD\u6839\u62E0: ${releaseLine.slice(0,240)}`);if(parseRecoverKey(releaseLine)){log.log(" \u23ED \u540C\u3058\u884C\u306B RECOVER\
|
|
105
|
-
: \u304C\u3042\u308A\u307E\u3059 \u2192 \u5148\u306B\u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u3092\u901A\u3057\u307E\u3059\uFF08\u518D\u5B9F\u884C\u306F\u305D\u306E\u5F8C\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u5224\u5B9A\uFF09");return}if(!config.releaseRerunAutoEnqueue){log.log(" \u23ED \u81EA\u52D5\u518D\u5B9F\u884C\u306F\u7121\u52B9\u3067\u3059\uFF08RELEASE_RERUN_AUTOENQUEUE_ENABLED=false\uFF09\u2192 \u5F93\u6765\u3069\u304A\u308A\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059");await escalatePartialMerge(
|
|
106
|
-
deps,cause,"0",releaseLine,"disabled");return}if(config.safeMode){log.log(" \u23ED \u5B89\u5168\u30E2\u30FC\u30C9\uFF08SAFE=1\uFF09\u306E\u305F\u3081\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u306E\u518D\u5B9F\u884C\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u90E8\u5206\u30DE\u30FC\u30B8\u306F\u6B8B\u3063\u305F\u307E\u307E\u306A\u306E\u3067\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059");await escalatePartialMerge(deps,cause,"0",releaseLine,"safe-mode");return}const queued=await api.queuedSnapshot();
|
|
107
|
-
if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(" \uFF08\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u5C45\u308B\u304B\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u4E0A\u9650\u67A0\u3092\u6D88\u8CBB\u3057\u3066\u91CD\u8907\u30A2\u30A4\u30C6\u30E0\u3092\u4F5C\u308A\u307E\u3059\uFF09");
|
|
108
|
-
return}if(queueContainsSkill(queued,recoverySkill)){log.log(" \u23ED \u30EA\u30EA\u30FC\u30B9\u5B9F\u884C\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 \u518D\u5B9F\u884C\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7\uFF08\u305D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u5DEE\u3092\u57CB\u3081\u307E\u3059\uFF09");return}const today=localDate(config.counterTimezone);const slug=causeCounterSlug(cause);const res=await api.consumeCounter(`releas\
|
|
109
|
-
e_rerun.${slug}`,today,config.releaseRerunMaxPerCause);if(!res.ok){if(res.status!==null&&res.status>=400&&res.status<500){log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002**\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u307E\u305B\u3093**`);log.log(` \u78BA\u8A8D: \u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u73FE\u5728 ${config.counterTimezone}\u30FB\u9001\u4FE1\u3057\u305F\u65E5\u4ED8 ${today}\
|
|
110
|
-
\uFF09\uFF0F\u4E0A\u9650\uFF08\u73FE\u5728 ${config.releaseRerunMaxPerCause}\uFF09`)}else{log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}return}const granted=pickString(res.json,"granted");const count=pickString(res.json,"counte\
|
|
111
|
-
r.count");if(granted===""){log.log(` \u26D4 \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u306E\u6295\u5165\u4E0A\u9650\u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08granted \u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u4ECA\u56DE\u306F\u6295\u5165\u3057\u307E\u305B\u3093\u3002\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return}if(granted!=="true"){log.log(` \u23ED \u539F\u56E0\u30AD\u30FC ${cause} \u306E\u81EA\u52D5\u518D\u5B9F\u884C\u306F\u4E0A\u9650\uFF08${config.
|
|
112
|
-
releaseRerunMaxPerCause}\u56DE\uFF09\u306B\u9054\u3057\u3066\u3044\u307E\u3059 \u2192 \u81EA\u52D5\u6295\u5165\u3092\u6B62\u3081\u3066\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u307E\u3059`);await escalatePartialMerge(deps,cause,count||String(config.releaseRerunMaxPerCause),releaseLine,"limit");return}const attempt=count||"1";const{itemId,detail}=await createItem(api,{label:`[P0] \u672C\u756A\u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\uFF08\u90E8\u5206\u30DE\u30FC\u30B8\u89E3\u6D88\u30FB\u539F\u56E0\u30AD\u30FC ${cause}\
|
|
113
|
-
\u30FB${attempt}/${config.releaseRerunMaxPerCause}\u56DE\u76EE\uFF09 #ai:complex`,prompt:`${recoverySkill} ${rerunArgs(cause,attempt,config.releaseRerunMaxPerCause,releaseLine)}`,ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u306E\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F1\u4EF6\u6D88\u8CBB\u6E08\u307F\uFF09: ${detail}`);await escalatePartialMerge(deps,cause,attempt,
|
|
114
|
-
releaseLine,"create-failed",detail);return}const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u23EB \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u3092\u30AD\u30E5\u30FC\u5148\u982D\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB\u672C\u65E5 ${attempt}/${config.releaseRerunMaxPerCause} \u56DE\u76EE\u30FB\u6B21\u306E\u30C7\u30AD\u30E5\u30FC\u3067\u7740\u624B\uFF09`)}else{log.log(" \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\
|
|
115
|
-
\u30E0\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09")}}function causeCounterSlug(cause){return cause.replace(/[^A-Za-z0-9_-]/g,"_")}function rerunArgs(cause,attempt,max,releaseLine){return`\u90E8\u5206\u30DE\u30FC\u30B8\u89E3\u6D88\u306E\u81EA\u52D5\u518D\u5B9F\u884C\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB\u672C\u65E5${attempt}\
|
|
116
|
-
/${max}\u56DE\u76EE\uFF09\u3002 \u76F4\u524D\u306E\u30EA\u30EA\u30FC\u30B9\u304C\u675F\u306E\u9014\u4E2D\u3067\u5931\u6557\u3057\u3001\u4E00\u90E8\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u3060\u3051\u304C main \u306B\u5165\u3063\u3066\u3044\u307E\u3059\uFF08\u672C\u756A\u304C\u300C\u4E00\u90E8\u3060\u3051\u65B0\u3057\u3044\u300D\u72B6\u614B\uFF09\u3002\u524D\u56DE\u306E\u7D50\u679C\u884C: ${releaseLine.slice(0,400)} \u307E\u305A mcp__twp-aiops__release_get \u306E partial_merge \u3067\u300Cmain \u306B\u5165\u3063\u305F/\u5165\u3063\u3066\u3044\u306A\u3044\u300D\u3092\u78BA\u8A8D\u3057\u3001\u901A\u5E38\u306E Phase 1 \u304B\
|
|
117
|
-
\u3089\u3084\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u500B\u5225\u30DE\u30FC\u30B8\u30FBrevert \u306F\u3057\u306A\u3044\uFF09\u3002\u540C\u3058\u539F\u56E0\u3067\u518D\u3073\u5931\u6557\u3057\u305F\u5834\u5408\u306F\u3001\u305D\u306E\u65E8\u3092 RELEASE_RESULT \u306E\u7406\u7531\u6B04\u306B\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}async function escalatePartialMerge(deps,cause,count,releaseLine,reason,createDetail=""){const{api,config,log}=deps;const today=localDate(config.
|
|
118
|
-
counterTimezone);const slug=causeCounterSlug(cause);const counterKey=`release_rerun_escalation.${slug}`;const delivered=await escalationDeliveredToday(api,counterKey,today);if(delivered===true){log.log(` \u23ED \u539F\u56E0\u30AD\u30FC ${cause} \u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u306F\u672C\u65E5\u6295\u5165\u6E08\u307F\u3067\u3059 \u2192 \u91CD\u306D\u307E\u305B\u3093\uFF08\u4EBA\u9593\u306E\u56DE\u7B54\u5F85\u3061\uFF09`);return}if(delivered===null){log.log(" \u26A0\uFE0F \u5F15\u304D\u6E21\u3057\u6E08\u307F\u304B\
|
|
119
|
-
\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AB\u30A6\u30F3\u30BF\u4E00\u89A7\u304C\u8AAD\u3081\u307E\u305B\u3093\uFF09\u2192 \u6C88\u9ED9\u3088\u308A\u91CD\u8907\u3092\u9078\u3073\u3001\u6295\u5165\u3092\u8A66\u307F\u307E\u3059")}const{itemId,detail}=await createItem(api,{label:`[P0] \u672C\u756A\u306E\u90E8\u5206\u30DE\u30FC\u30B8\u304C\u672A\u89E3\u6D88\u3067\u3059\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\u30FB${ESCALATION_SUBJECT[reason]}\uFF09\u2014 \u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057 #ai:complex`,
|
|
120
|
-
prompt:escalationPrompt(cause,count,config.releaseRerunMaxPerCause,releaseLine,reason,createDetail),ai_type:"claude"});if(!itemId){log.log(` \u26A0\uFE0F \u90E8\u5206\u30DE\u30FC\u30B8\u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08**\u672C\u65E5\u306E\u67A0\u306F\u6D88\u8CBB\u3057\u3066\u3044\u307E\u305B\u3093**\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\u884C\u3057\u307E\u3059\uFF09: ${detail}`);
|
|
121
|
-
return}const marked=await api.consumeCounter(counterKey,today,PARTIAL_MERGE_ESCALATION_MAX);if(!marked.ok||pickString(marked.json,"granted")!=="true"){log.log(` \u26A0\uFE0F \u5F15\u304D\u6E21\u3057\u306F\u6295\u5165\u3057\u307E\u3057\u305F\u304C\u300C\u672C\u65E5\u6295\u5165\u6E08\u307F\u300D\u3092\u8A18\u9332\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(marked)}\uFF09\u2192 \u540C\u3058\u539F\u56E0\u3067\u91CD\u306D\u3066\u6295\u5165\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`)}
|
|
122
|
-
const reorderRes=await api.reorder([itemId]);if(reorderRes.ok&&reorderSucceeded(itemId,reorderRes.json)){log.log(` \u{1F64B} \u90E8\u5206\u30DE\u30FC\u30B8\u3092\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\uFF08\u7406\u7531 ${reason}\uFF09\u3001\u4EBA\u9593\u3078\u306E\u5F15\u304D\u6E21\u3057\u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u5148\u982D\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u539F\u56E0\u30AD\u30FC ${cause}\uFF09`)}else{log.log(` \u{1F64B} \u90E8\u5206\u30DE\u30FC\u30B8\u306E\u5F15\u304D\u6E21\u3057\u30A2\u30A4\u30C6\u30E0\u3092\u6295\u5165\u3057\u307E\u3057\u305F\
|
|
123
|
-
\uFF08\u5148\u982D\u3078\u306E\u4E26\u3073\u66FF\u3048\u306F\u5931\u6557\u30FB\u30AD\u30E5\u30FC\u672B\u5C3E\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF0F\u539F\u56E0\u30AD\u30FC ${cause}\uFF09`)}}async function escalationDeliveredToday(api,key,today){const res=await api.listCounters(today);if(!res.ok)return null;const rows=pick(res.json,"counters")??pick(res.json,"data.counters");if(!Array.isArray(rows))return null;for(const row of rows){if(!row||typeof row!=="object")continue;const r=row;if(r.
|
|
124
|
-
key!==key)continue;if(typeof r.date==="string"&&r.date!==today)continue;const n=typeof r.count==="number"?r.count:Number(r.count);if(!Number.isFinite(n))return null;return n>=PARTIAL_MERGE_ESCALATION_MAX}return false}var ESCALATION_HEADLINE={limit:max=>`\u540C\u4E00\u539F\u56E0\u3067\u306E\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u4E0A\u9650\uFF08${max}\u56DE\uFF09\u306B\u9054\u3057\u305F\u305F\u3081\u3001\u81EA\u52D5\u6295\u5165\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,
|
|
125
|
-
disabled:()=>"\u81EA\u52D5\u518D\u5B9F\u884C\u306F\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059\uFF08RELEASE_RERUN_AUTOENQUEUE_ENABLED=false\uFF09\u3002\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002","safe-mode":()=>"\u5B89\u5168\u30E2\u30FC\u30C9\uFF08SAFE=1\uFF09\u306E\u305F\u3081\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002\u81EA\u52D5\u3067\u306F\u57CB\u3081\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
126
|
-
"create-failed":()=>"\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u306E\u6295\u5165\u305D\u306E\u3082\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672C\u65E5\u306E\u6295\u5165\u67A0\u306F\u6D88\u8CBB\u6E08\u307F\uFF09\u3002\u81EA\u52D5\u3067\u306F\u57CB\u307E\u3089\u306A\u3044\u305F\u3081\u3001\u4EBA\u9593\u3078\u5F15\u304D\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002"};var ESCALATION_SUBJECT={limit:"\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F",
|
|
127
|
-
disabled:"\u81EA\u52D5\u518D\u5B9F\u884C\u304C\u7121\u52B9\u306E\u305F\u3081\u672A\u89E3\u6D88\u3067\u3059","safe-mode":"\u5B89\u5168\u30E2\u30FC\u30C9\u306E\u305F\u3081\u672A\u89E3\u6D88\u3067\u3059","create-failed":"\u518D\u5B9F\u884C\u30A2\u30A4\u30C6\u30E0\u3092\u6295\u5165\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"};function escalationPrompt(cause,count,max,releaseLine,reason,createDetail=""){return["\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u304C\u675F\u306E\u9014\u4E2D\u3067\u5931\u6557\u3057\u3001\u4E00\u90E8\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u3060\u3051\u304C main \u306B\u5165\u3063\u305F\u72B6\u614B\uFF08\u90E8\u5206\u30DE\u30FC\u30B8\uFF09\u304C\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002",
|
|
128
|
-
ESCALATION_HEADLINE[reason](max),"",`\u539F\u56E0\u30AD\u30FC: ${cause}\uFF08\`<\u5931\u6557\u30EA\u30DD\u30B8\u30C8\u30EA>:<\u5931\u6557\u30B9\u30C6\u30C3\u30D7>:<\u30A8\u30E9\u30FC\u7A2E\u5225>\`\u3002\u30EA\u30EA\u30FC\u30B9ID\u306F\u542B\u307F\u307E\u305B\u3093\uFF09`,reason==="limit"?`\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: ${count}\u56DE\uFF08\u4E0A\u9650 ${max}\uFF09`:reason==="create-failed"?`\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: ${count}\u56DE\u3076\u3093\u306E\u67A0\u3092\u6D88\u8CBB\u6E08\u307F\uFF08\u4E0A\u9650 ${max}\
|
|
129
|
-
\uFF09\u3002\u305F\u3060\u3057**\u3053\u306E\u56DE\u306E\u6295\u5165\u306F\u6210\u529F\u3092\u78BA\u8A8D\u3067\u304D\u3066\u304A\u3089\u305A\u3001\u3053\u306E\u67A0\u3076\u3093\u304C\u5B9F\u884C\u3055\u308C\u305F\u304B\u306F\u672A\u78BA\u8A8D**\u3067\u3059`:"\u672C\u65E5\u306E\u81EA\u52D5\u518D\u5B9F\u884C: \u672A\u8A66\u884C\uFF08\u81EA\u52D5\u6295\u5165\u3092\u884C\u308F\u306A\u3044\u8A2D\u5B9A\u306E\u305F\u3081\u3001\u3053\u306E\u56DE\u3067\u306F\u8A66\u3057\u3066\u3044\u307E\u305B\u3093\uFF09",
|
|
130
|
-
...reason==="create-failed"&&createDetail?[`\u6295\u5165\u306B\u5931\u6557\u3057\u305F\u7406\u7531\uFF08\u4F5C\u6210API\u306E\u5FDC\u7B54\uFF09: ${createDetail.slice(0,300)}`]:[],`\u76F4\u524D\u306E\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u884C: ${releaseLine.slice(0,400)}`,"","**\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u3067\u306F\u30EA\u30EA\u30FC\u30B9\u3092\u5B9F\u884C\u3057\u306A\u3044\u3053\u3068\u3002** \u3084\u308B\u306E\u306F\u5F15\u304D\u6E21\u3057\u3060\u3051\u3067\u3059\u3002","","1. `mcp__t\
|
|
131
|
-
wp-aiops__release_list` \u2192 `release_get` \u3067\u76F4\u8FD1\u306E\u5931\u6557\u30EA\u30EA\u30FC\u30B9\u3092\u7279\u5B9A\u3057\u3001"," `partial_merge` \u30D5\u30A3\u30FC\u30EB\u30C9\uFF08detected / merged_repos / unmerged_repos / failed_repo /"," failed_step / error_kind / cause_key\uFF09\u3092\u305D\u306E\u307E\u307E\u8AAD\u3080\u3002\u30ED\u30B0\u6587\u5B57\u5217\u3092 grep \u3057\u306A\u3044",'2. `list_tasks(project_id, keyword="[\u30EA\u30EA\u30FC\u30B9\u90E8\u5206\u30DE\u30FC\u30B8]", summary=true)` \u3067\u540C\u3058\u539F\u56E0\u30AD\u30FC\u306E',
|
|
132
|
-
" \u672A\u5B8C\u4E86\u30BF\u30B9\u30AF\u304C\u65E2\u306B\u3042\u308B\u304B\u78BA\u8A8D\u3059\u308B\uFF08\u3042\u308C\u3070\u518D\u8D77\u7968\u305B\u305A\u305D\u308C\u3092\u4F7F\u3046\u3002`create_task` \u306F\u975E\u51AA\u7B49\uFF09","3. \u7121\u3051\u308C\u3070 `create_task` \u3067\u8D77\u7968\u3059\u308B:",` - subject: \`[\u30EA\u30EA\u30FC\u30B9\u90E8\u5206\u30DE\u30FC\u30B8] ${cause} \u2014 ${ESCALATION_SUBJECT[reason]}\``," - description: main \u306B\u5165\u3063\u305F\u30EA\u30DD\u30B8\u30C8\u30EA\uFF08merge SHA \u4ED8\u304D\uFF09\uFF0F\u5165\u3063\u3066\u3044\u306A\u3044\u30EA\u30DD\u30B8\u30C8\u30EA\uFF0F",
|
|
133
|
-
" \u5931\u6557\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u5931\u6557\u30B9\u30C6\u30C3\u30D7\u30FB\u30A8\u30E9\u30FC\u5168\u6587\uFF0F\u8A72\u5F53 release_id \uFF0F\u81EA\u52D5\u518D\u5B9F\u884C\u306E\u56DE\u6570"," - priority: 1\uFF08\u672C\u756A\u304C\u4E00\u90E8\u3060\u3051\u65B0\u3057\u3044\u72B6\u614B\uFF1D\u30EA\u30EA\u30FC\u30B9\u30D6\u30ED\u30C3\u30AB\u30FC\uFF09",'4. \u305D\u306E\u30BF\u30B9\u30AF\u306B `comment_type: "ask_question"` \u3067**1\u554F\u3060\u3051**\u6295\u7A3F\u3059\u308B\u3002\u80CC\u666F\u30FB\u5404\u9078\u629E\u80A2\u306E\u5F71\u97FF\u30FB',
|
|
134
|
-
" AI\u306E\u63A8\u5968\u3092\u672C\u6587\u306B\u66F8\u304F\u3053\u3068\uFF08\u8AD6\u70B9\u3092\u66F8\u304B\u305A\u9078\u629E\u80A2\u3060\u3051\u4E26\u3079\u305F\u77ED\u6587\u306F\u6295\u7A3F\u3057\u306A\u3044\uFF09\u3002"," option \u306E `key` \u306F10\u6587\u5B57\u4EE5\u5185\u3002`mentioned_user_ids` \u306B\u8C37 \u6A39\u3092\u542B\u3081\u308B",`5. \u540C\u3058\u30BF\u30FC\u30F3\u3067\u30B9\u30C6\u30FC\u30BF\u30B9\u3092 \`\u4EBA\u9593\u5224\u65AD\u5F85\u3061\`\uFF08${STATUS_HUMAN_DECISION}\uFF09\
|
|
135
|
-
\u30FB`,` \u62C5\u5F53\u3092\u8C37 \u6A39\uFF08${TANI_USER_ID}\uFF09\u306B\u3059\u308B`,"","\u6700\u7D42\u51FA\u529B\u306E1\u884C\u76EE\u306B `PARTIAL_MERGE_ESCALATED: <TWP\u30AD\u30FC>` \u3092\u51FA\u3057\u3066\u304F\u3060\u3055\u3044\u3002"].join("\n")}async function enqueueDevVerifyForMerged(deps,logText,followUp){const{api,log}=deps;const{skill:verifySkill,keysLine}=followUp;if(keysLine===null){log.log(` \u2139\uFE0F ${verifySkill} \u306E\u5F8C\u7D9A\u6295\u5165\u306F keys_line \u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u3001\u30AD\u30FC\u5358\u4F4D\u306E\u6295\u5165\u306F\u3057\u307E\u305B\u3093`);
|
|
136
|
-
return}const keys=parseKeysLine(logText,keysLine);if(keys===null){log.log(` \u26A0\uFE0F \u5B8C\u4E86\u3057\u305F\u30B9\u30AD\u30EB\u304C ${keysLine} \u884C\u3092\u51FA\u529B\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u51FA\u529B\u5951\u7D04\u9055\u53CD\uFF09\u2192 ${verifySkill} \u306E\u81EA\u52D5\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059`);return}if(keys.length===0){log.log(` \u2139\uFE0F \u5BFE\u8C61\u30AD\u30FC\u306F\u3042\u308A\u307E\u305B\u3093\uFF08${keysLine}: none\uFF09\u2192\
|
|
137
|
-
${verifySkill} \u306E\u81EA\u52D5\u6295\u5165\u306A\u3057`);return}const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 dev\u691C\u8A3C\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(" \uFF08\u5224\u5B9A\u3067\u304D\u306A\u3044\u72B6\u614B\u3067\u6295\u5165\u3059\u308B\u3068\u3001\u540C\u4E00\u30BF\u30B9\u30AF\u306Edev\u691C\u8A3C\u304C\u4E8C\u91CD\u306B\u8D70\u308A\u307E\u3059\uFF09");
|
|
138
|
-
return}let enqueued=0;const seen=new Set;for(const key of keys){if(seen.has(key))continue;seen.add(key);if(queueContainsKey(queued,key)){log.log(` \u23ED ${key} \u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u30AD\u30E5\u30FC\u306B\u3042\u308A\u307E\u3059 \u2192 dev\u691C\u8A3C\u306E\u6295\u5165\u3092\u30B9\u30AD\u30C3\u30D7`);continue}const{itemId,detail}=await createItem(api,{label:`[P1] ${key} \u306Edev\u691C\u8A3C\uFF08develop\u30DE\u30FC\u30B8\u76F4\u5F8C\u30FB\u6DF7\u5165\u30DE\u30FC\u30B8\u9632\u6B62\u306E\u305F\u3081\u81EA\u52D5\u6295\u5165\uFF09 #ai:verify`,
|
|
139
|
-
prompt:`${verifySkill} ${key}`,ai_type:"claude",task_key:key});if(!itemId){log.log(` \u26A0\uFE0F ${key} \u306Edev\u691C\u8A3C\u30A2\u30A4\u30C6\u30E0\u6295\u5165\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${detail}`);continue}enqueued+=1;log.log(` \u{1F50E} ${key} \u306Edev\u691C\u8A3C\u3092\u30AD\u30E5\u30FC\u3078\u6295\u5165\u3057\u307E\u3057\u305F\uFF08${itemId}\uFF09`)}if(enqueued>0){log.log(` \u2192 develop\u30DE\u30FC\u30B8\u6E08\u307F ${enqueued} \u4EF6\u306Edev\u691C\u8A3C\u3092\u81EA\u52D5\u6295\u5165\u3057\u307E\u3057\u305F\uFF08\u8A08\u753BAI\u306E\u5224\u65AD\u306B\u59D4\u306D\u306A\u3044\uFF09`)}}var RECENT_ADVANCE_WINDOW_HOURS=6;function normalizeOutcomeCode(raw){const m=/\b([A-Z][A-Z0-9_]*_RESULT)\s*:\s*([A-Za-z_][A-Za-z0-9_]*)/.exec(raw??"");if(!m)return null;return`${m[1]}: ${(m[2]??"").toUpperCase()}`}function skillOfLedgerItem(item){const explicit=(item.skill??"").trim();if(explicit)return normalizeSkillName(explicit);return skillOfItem(item)}function advanceKey(taskKey,skill){return`${taskKey}#${normalizeSkillName(skill)}`}function buildRecentCandidateIndex(items,opts={}){const nowMicros=(opts.
|
|
140
|
-
now??new Date).getTime()*1e3;const latest=new Map;for(const item of items){if(item.status!==void 0&&item.status!=="completed")continue;const taskKey=(item.task_key??"").trim();if(taskKey==="")continue;const skill=skillOfLedgerItem(item);if(skill==="")continue;const sortOrder=typeof item.sort_order==="number"?item.sort_order:0;const key=advanceKey(taskKey,skill);const prev=latest.get(key);if(prev&&prev.sortOrder>=sortOrder)continue;latest.set(key,{sortOrder,candidate:{taskKey,skill,itemId:item.item_id,
|
|
141
|
-
outcomeCode:normalizeOutcomeCode(item.outcome_code),ageMinutes:sortOrder>0?Math.floor((nowMicros-sortOrder)/6e7):null}})}const index=new Map;for(const[key,value]of latest)index.set(key,value.candidate);return index}function findRecentCandidate(index,taskKey,skill){if(taskKey.trim()===""||skill.trim()==="")return null;return index.get(advanceKey(taskKey.trim(),skill))??null}async function resolveRecentAdvance(candidate,fetchResult,advancing){if(advancing.size===0)return null;let outcome=candidate.
|
|
142
|
-
outcomeCode;if(outcome===null){const result=await fetchResult(candidate.itemId);outcome=result?normalizeOutcomeCode(parseOutcomeCode(result)):null}if(outcome===null||!advancing.has(outcome))return null;return{taskKey:candidate.taskKey,skill:candidate.skill,outcome,itemId:candidate.itemId,ageMinutes:candidate.ageMinutes}}function formatRecentAdvance(advance){const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\u524D`;return`${advance.outcome}\uFF08${age} / item=${advance.
|
|
143
|
-
itemId}\uFF09`}function windowStartMicros(now,hours=RECENT_ADVANCE_WINDOW_HOURS){return Math.trunc((now.getTime()-hours*36e5)*1e3)}var MARKER_PAIR_RE=/^([^=\s,]+)=([a-z]+)$/;function decodeMarkerKey(raw){let key;try{key=decodeURIComponent(raw)}catch{return null}return isTaskKey(key)&&key.trim()===key?key:null}function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.
|
|
144
|
-
exec(body);const byKey=new Map;for(const token of body.trim().split(/\s+/)){for(const part of token.split(",")){const pair=MARKER_PAIR_RE.exec(part);if(!pair)continue;const key=decodeMarkerKey(pair[1]);if(key!==null)byKey.set(key,pair[2])}}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot,advancing){if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}
|
|
145
|
-
if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=advancing.get(advance.outcome);if(expected===
|
|
146
|
-
void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}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,path9=>this.get(path9),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.
|
|
82
|
+
e.plan_started_at")||"\u4E0D\u660E"}`,`\u671F\u9650=${pickString(json,"state.plan_lock_expires_at")||"\u4E0D\u660E"}`,`\u6B7B\u6D3B=${liveText}`].join(" ")}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.
|
|
147
83
|
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(
|
|
148
84
|
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?.
|
|
149
|
-
pagination?.total;if(typeof total!=="number"){return{total:null,error:"\u5FDC\u7B54\u304B\u3089 pagination.total \u3092\u8AAD\u3081\u306A\u3044"}}return{total,error:null}}async get(
|
|
150
|
-
let json=null;try{json=raw.trim()===""?null:JSON.parse(raw)}catch{json=null}return{ok:res.ok,status:res.status,json,error:null}}catch(err){return{ok:false,status:null,json:null,error:err.message}}}};import
|
|
85
|
+
pagination?.total;if(typeof total!=="number"){return{total:null,error:"\u5FDC\u7B54\u304B\u3089 pagination.total \u3092\u8AAD\u3081\u306A\u3044"}}return{total,error:null}}async get(path8){let token;try{token=await this.session.getAccessToken()}catch(err){return{ok:false,status:null,json:null,error:err.message}}try{const res=await this.fetchImpl(`${this.apiUrl}${path8}`,{headers:{Authorization:`Bearer ${token}`,"Content-Type":"application/json",Accept:"application/json"}});const raw=await res.text();
|
|
86
|
+
let json=null;try{json=raw.trim()===""?null:JSON.parse(raw)}catch{json=null}return{ok:res.ok,status:res.status,json,error:null}}catch(err){return{ok:false,status:null,json:null,error:err.message}}}};import fs4 from"fs";var ScheduleBridge=class{constructor(deps){this.deps=deps}deps;tzWarned=false;zoneWarned=false;lastStatusesSummary="";unmappedWarned=new Set;now(){if(this.deps.now)return this.deps.now();return nowInZone(this.deps.config.scheduleTimezone,m=>{if(this.zoneWarned)return;this.zoneWarned=true;this.deps.log.log(` ${m}`)})}warn(message){this.deps.log.log(` \u26A0\uFE0F \u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB: ${message}`)}async loadConfig(){const res=await this.deps.api.definitions();if(res.
|
|
151
87
|
kind==="error")return{error:res.message};if(res.config.schedules.length===0){const warn=(res.config.warnings??[]).map(w=>w&&typeof w==="object"?String(w["message"]??""):"").filter(m=>m!=="").join("; ");this.deps.log.log(" \u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u306F\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u5B9A\u7FA9\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u6295\u5165\u3055\u308C\u307E\u305B\u3093\uFF09"+(warn?` / ${warn}`:""))}this.
|
|
152
88
|
describeStatuses(res.config);return{config:res.config}}describeStatuses(config){const keys=Object.keys(config.require_zero_statuses??{}).sort();const used=[...new Set((config.schedules??[]).flatMap(s=>{const raw=s.require_zero??[];const list=Array.isArray(raw)?raw:typeof raw==="string"?[raw]:[];return list.filter(k=>typeof k==="string")}))].sort();const missing=used.filter(k=>!keys.includes(k));const summary=`\u4EF6\u6570\u30B2\u30FC\u30C8\u306E\u5BFE\u5FDC\uFF08\u30B5\u30FC\u30D0\u8A2D\u5B9A require_zero_statuses\uFF09: ${keys.
|
|
153
89
|
length>0?keys.join(","):"\u306A\u3057"}`+(missing.length>0?` \uFF0F \u26A0\uFE0F \u5BFE\u5FDC\u306A\u3057: ${missing.join(",")}\uFF08\u3053\u308C\u3092 require_zero \u306B\u6301\u3064\u67A0\u306F\u767A\u706B\u3057\u307E\u305B\u3093\uFF09`:"");if(summary!==this.lastStatusesSummary){this.deps.log.log(` ${summary}`);this.unmappedWarned.clear()}this.lastStatusesSummary=summary}async loadHistory(){const res=await this.deps.api.history();if(res.kind==="error")return{error:res.message};const serverTz=res.
|
|
@@ -159,24 +95,24 @@ message}\uFF09`);return{allowed:true,reason:""}}return gateStatus(skill,this.now
|
|
|
159
95
|
log.log(` \u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u5C65\u6B74\u3092\u66F4\u65B0: ${res.scheduleId} \u2192 ${status}`)}async releaseWindow(scheduleId,windowKey,why){if(await this.record(scheduleId,windowKey,"failed")){this.deps.log.log(` \u3053\u306E\u67A0\u306F failed \u3068\u3057\u3066\u8FD4\u3057\u307E\u3057\u305F\uFF08\u7406\u7531: ${why}\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\u884C\u3055\u308C\u307E\u3059\uFF09`)}else{this.deps.log.log(` \u26A0\uFE0F \u67A0\u3092 failed \u3068\u3057\u3066\u8FD4\u305B\u307E\u305B\
|
|
160
96
|
\u3093\u3067\u3057\u305F\uFF08\u7406\u7531: ${why}\uFF09\u3002\u30EA\u30FC\u30B9\u671F\u9650\u307E\u3067\u518D\u8A66\u884C\u3067\u304D\u307E\u305B\u3093`)}}async promptSection(enqueuedFile){const cfg=await this.loadConfig();if("error"in cfg){this.deps.log.log(` \u26A0\uFE0F \u8A08\u753B\u30D7\u30ED\u30F3\u30D7\u30C8\u7528\u306E\u5B9A\u671F\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${cfg.error}`);this.deps.log.log(" \u8A08\u753BAI\u306B\u300C\u6295\u5165\u6E08\u307F\u306E\u5B9A\u671F\u30BF\u30B9\u30AF\u300D\u3092\u4F1D\u3048\
|
|
161
97
|
\u3089\u308C\u306A\u3044\u305F\u3081\u3001\u91CD\u8907\u6295\u5165\u306E\u6291\u6B62\u304C\u5F31\u307E\u308A\u307E\u3059");return""}const hist=await this.loadHistory();if("error"in hist){this.deps.log.log(` \u26A0\uFE0F \u5B9A\u671F\u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u300C\u6B21\u56DE\u767A\u706B\u4E88\u5B9A\u300D\u3092\u7701\u7565\u3057\u307E\u3059\uFF08\u5C65\u6B74\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093: ${hist.error}\uFF09`)}const lines=readEnqueuedLines(enqueuedFile);return promptSection(
|
|
162
|
-
cfg.config,this.now(),"error"in hist?[]:hist.rows,lines,!("error"in hist))}};function readEnqueuedLines(file){if(!file)return[];let text;try{text=
|
|
163
|
-
const n=Number.parseInt(out,10);if(n>raw){return{total:raw,note:`${key}: \u6570\u3048\u76F4\u3057\u306E\u7D50\u679C ${n} \u304C\u7D20\u306E\u4EF6\u6570 ${raw} \u3092\u8D85\u3048\u308B\u305F\u3081\u7D20\u306E\u4EF6\u6570\u3092\u4F7F\u3044\u307E\u3059`}}return{total:n,note:`${key}: ${raw}\u4EF6\u306E\u3046\u3061\u30B2\u30FC\u30C8\u306B\u52B9\u304F\u3082\u306E ${n}\u4EF6\uFF08${hook.id}\uFF09`}}import
|
|
98
|
+
cfg.config,this.now(),"error"in hist?[]:hist.rows,lines,!("error"in hist))}};function readEnqueuedLines(file){if(!file)return[];let text;try{text=fs4.readFileSync(file,"utf8")}catch{return[]}return text.split("\n").filter(l=>l.trim()!=="").map(l=>l.replace(/\n$/,""))}async function refineCount(key,raw,hooks,cwd,run=(hook,dir)=>runHook(hook,dir)){const hook=hooks.get(key);if(!hook||raw===null||raw===0)return{total:raw,note:null};const r=await run(hook,cwd);const out=r.stdout.trim();if(!r.ok||!/^\d+$/.test(out)){return{total:raw,note:`${key}: \u6570\u3048\u76F4\u3057\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u7D20\u306E\u4EF6\u6570 ${raw} \u3092\u4F7F\u3044\u307E\u3059\uFF08${r.ok?"\u51FA\u529B\u304C\u6574\u65701\u884C\u3067\u306F\u306A\u3044":r.reason}\uFF09`}}
|
|
99
|
+
const n=Number.parseInt(out,10);if(n>raw){return{total:raw,note:`${key}: \u6570\u3048\u76F4\u3057\u306E\u7D50\u679C ${n} \u304C\u7D20\u306E\u4EF6\u6570 ${raw} \u3092\u8D85\u3048\u308B\u305F\u3081\u7D20\u306E\u4EF6\u6570\u3092\u4F7F\u3044\u307E\u3059`}}return{total:n,note:`${key}: ${raw}\u4EF6\u306E\u3046\u3061\u30B2\u30FC\u30C8\u306B\u52B9\u304F\u3082\u306E ${n}\u4EF6\uFF08${hook.id}\uFF09`}}import fs5 from"fs";import path3 from"path";var MAX_RESULT_BYTES=1e5;function truncateResult(text,maxBytes=MAX_RESULT_BYTES){const encoded=Buffer.from(text,"utf8");if(encoded.length<=maxBytes)return text;const tail=encoded.subarray(encoded.length-maxBytes).toString("utf8");return`... (truncated, showing last ${Math.trunc(maxBytes/1e3)}KB) ...
|
|
164
100
|
${tail}`}function buildPayload(input){const payload={status:input.status,run_id:input.runId,result:truncateResult(input.logText)};if(input.aiType!==null)payload.ai_type=input.aiType;if(input.errorMessage)payload.error_message=input.errorMessage.slice(0,10240);applyMetrics(payload,input.metrics);return payload}var MAX_OUTCOME_CODE_LENGTH=200;var MAX_SKILL_LENGTH=100;function applyMetrics(payload,metrics){if(metrics===void 0)return;const num=value=>typeof value==="number"&&Number.isFinite(value)&&
|
|
165
101
|
value>=0?value:void 0;const str2=(value,max)=>{const trimmed=(value??"").trim();return trimmed===""?void 0:trimmed.slice(0,max)};const durationMs=num(metrics.durationMs);if(durationMs!==void 0)payload.duration_ms=Math.trunc(durationMs);const turns=num(metrics.turns);if(turns!==void 0)payload.turns=Math.trunc(turns);const tokensIn=num(metrics.tokensIn);if(tokensIn!==void 0)payload.tokens_in=Math.trunc(tokensIn);const tokensOut=num(metrics.tokensOut);if(tokensOut!==void 0)payload.tokens_out=Math.trunc(
|
|
166
102
|
tokensOut);const costUsd=num(metrics.costUsd);if(costUsd!==void 0)payload.cost_usd=costUsd;const skill=str2(metrics.skill,MAX_SKILL_LENGTH);if(skill!==void 0)payload.skill=skill;const effort=str2(metrics.effort,32);if(effort!==void 0)payload.effort=effort;const exitReason=str2(metrics.exitReason,32);if(exitReason!==void 0)payload.exit_reason=exitReason;const outcomeCode=str2(metrics.outcomeCode,MAX_OUTCOME_CODE_LENGTH);if(outcomeCode!==void 0)payload.outcome_code=outcomeCode;const outcomeDetail=outcomeCode===
|
|
167
103
|
void 0?void 0:str2(metrics.outcomeDetail,MAX_OUTCOME_DETAIL_LENGTH);if(outcomeDetail!==void 0)payload.outcome_detail=outcomeDetail}var NO_TURN_OUTCOME_CODE="no_turns_no_contract";function isNoTurnExecution(metrics,logText){const turns=metrics?.turns;if(typeof turns!=="number"||!Number.isFinite(turns)||turns!==0)return false;return parseOutcomeCode(logText)===null}var Writeback=class{constructor(api,config,log){this.api=api;this.config=config;this.log=log}api;config;log;async uploadFullLog(itemId,runId,logText){
|
|
168
104
|
if(isPrivateProjectId(this.config.projectId))return null;const fallback=reason=>{this.log.log(` \u26A0\uFE0F \u30B9\u30C6\u30C3\u30D7\u30ED\u30B0\u5168\u6587\u3092S3\u3078\u7F6E\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${reason}\uFF09: item=${itemId}\u3002result\uFF08\u672B\u5C3E100KB\uFF09\u3078\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059`);return null};const issued=await this.api.logUploadUrl(itemId,runId);if(!issued.ok)return fallback(`URL\u767A\u884C: ${describeError(
|
|
169
105
|
issued)}`);const url=pickString(issued.json,"upload_url")||pickString(issued.json,"data.upload_url");const key=pickString(issued.json,"log_s3_key")||pickString(issued.json,"data.log_s3_key");const contentType=pickString(issued.json,"content_type")||pickString(issued.json,"data.content_type")||"text/plain";if(url===""||key==="")return fallback("URL\u767A\u884C: \u5FDC\u7B54\u306B upload_url / log_s3_key \u304C\u3042\u308A\u307E\u305B\u3093");const bytes=Buffer.byteLength(logText,"utf8");const put=await this.
|
|
170
|
-
api.putPresigned(url,logText,contentType);if(!put.ok){return fallback(put.status===null?`PUT: transport_error=${put.transportError??"\u4E0D\u660E"}`:`PUT: http=${put.status}`)}this.log.log(` \u30B9\u30C6\u30C3\u30D7\u30ED\u30B0\u5168\u6587\u3092S3\u3078\u4FDD\u5B58\u3057\u307E\u3057\u305F\uFF08${bytes} bytes\uFF09: ${key}`);return key}pendingDir(){return
|
|
106
|
+
api.putPresigned(url,logText,contentType);if(!put.ok){return fallback(put.status===null?`PUT: transport_error=${put.transportError??"\u4E0D\u660E"}`:`PUT: http=${put.status}`)}this.log.log(` \u30B9\u30C6\u30C3\u30D7\u30ED\u30B0\u5168\u6587\u3092S3\u3078\u4FDD\u5B58\u3057\u307E\u3057\u305F\uFF08${bytes} bytes\uFF09: ${key}`);return key}pendingDir(){return path3.join(this.config.stateDir,"pending-writeback")}async write(itemId,payload){const{run_id:runId,...rest}=payload;const res=await this.api.
|
|
171
107
|
update(itemId,rest,runId);if(res.ok)return"ok";if(res.status===409){this.log.log(` \u26A0\uFE0F \u5B9F\u884C\u7D50\u679C\u3092\u66F8\u304D\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\uFF08409\u30FB\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF09: item=${itemId}`);this.log.log(" \u81EA\u5206\u306E claim \u306F\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\uFF08heartbeat \u304C\u9014\u7D76\u3048\u3066\u56DE\u53CE\u3055\u308C\u305F\u53EF\u80FD\u6027\uFF09\u3002**\u7D50\u679C\u306F\u7834\u68C4\u3057\u307E\u3059**");
|
|
172
108
|
this.log.log(" \u540C\u3058\u4F5C\u696D\u304C\u4ED6\u6A5F\u3067\u8D70\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u3001\u30E9\u30F3\u30CA\u30FC\u306E\u6B7B\u6D3B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08twp task-loop status\uFF09");return"lost"}this.log.log(` \u26A0\uFE0F \u5B9F\u884C\u7D50\u679C\u306E\u66F8\u304D\u623B\u3057\u306B\u5931\u6557\uFF08${describeError(res)}\uFF09: item=${itemId}\u3002`);if(this.stash(itemId,payload)){this.log.log(`\
|
|
173
109
|
\u7D50\u679C\u306F ${this.pendingDir()}/${itemId}.json \u306B\u9000\u907F\u3057\u307E\u3057\u305F\u3002**\u6B21\u30B5\u30A4\u30AF\u30EB\u5192\u982D\u3067\u518D\u9001\u3057\u307E\u3059**`);this.log.log(" \u518D\u9001\u3067\u304D\u306A\u3044\u307E\u307E\u306A\u3089\u3001\u30B5\u30FC\u30D0\u304C\u300Clive \u3060\u304C\u5225\u30A2\u30A4\u30C6\u30E0\u3078\u79FB\u3063\u305F\u300D\u3068\u5224\u5B9A\u3057\u3066\u56DE\u53CE\u3057\u307E\u3059")}else{this.log.log(" \u26D4 \u9000\u907F\u306B\u3082\u5931\u6557\u3057\u305F\u305F\u3081\u3001\u3053\u306E\u7D50\u679C\u306F\u5931\u308F\u308C\u307E\u3057\u305F\uFF08\u30B5\u30FC\u30D0\
|
|
174
|
-
\u306E\u56DE\u53CE\u3067 pending \u306B\u623B\u308A\u518D\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09")}this.log.log(" \u5B8C\u4E86\u6271\u3044\u306E\u5F8C\u51E6\u7406\uFF08\u5B9A\u671F\u67A0\u306E\u7D42\u7AEF\u30FB\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u306E\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");return"failed"}stash(itemId,payload){if(!/^[A-Za-z0-9_-]+$/.test(itemId))return false;const dir=this.pendingDir();try{
|
|
175
|
-
if(process.platform!=="win32")
|
|
176
|
-
const recorded=[];for(const name of files){const itemId=name.replace(/\.json$/,"");const file=
|
|
177
|
-
\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(
|
|
178
|
-
api.update(itemId,rest,runId||this.config.runId);if(res.ok){
|
|
179
|
-
\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){
|
|
110
|
+
\u306E\u56DE\u53CE\u3067 pending \u306B\u623B\u308A\u518D\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09")}this.log.log(" \u5B8C\u4E86\u6271\u3044\u306E\u5F8C\u51E6\u7406\uFF08\u5B9A\u671F\u67A0\u306E\u7D42\u7AEF\u30FB\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u306E\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");return"failed"}stash(itemId,payload){if(!/^[A-Za-z0-9_-]+$/.test(itemId))return false;const dir=this.pendingDir();try{fs5.mkdirSync(dir,{recursive:true,mode:448});
|
|
111
|
+
if(process.platform!=="win32")fs5.chmodSync(dir,448);fs5.writeFileSync(path3.join(dir,`${itemId}.json`),JSON.stringify(payload),{mode:384});return true}catch{return false}}async retryPending(now=Date.now()){const dir=this.pendingDir();let files;try{files=fs5.readdirSync(dir).filter(f=>f.endsWith(".json"))}catch{return[]}if(files.length===0)return[];this.log.log(` \u672A\u9001\u4FE1\u306E\u5B9F\u884C\u7D50\u679C\u304C ${files.length} \u4EF6\u3042\u308A\u307E\u3059\uFF08\u524D\u30B5\u30A4\u30AF\u30EB\u307E\u3067\u306B\u66F8\u304D\u623B\u305B\u306A\u304B\u3063\u305F\u3082\u306E\uFF09\u2192 \u518D\u9001\u3057\u307E\u3059`);
|
|
112
|
+
const recorded=[];for(const name of files){const itemId=name.replace(/\.json$/,"");const file=path3.join(dir,name);if(!/^[A-Za-z0-9_-]+$/.test(itemId)){this.log.log(` \u26A0\uFE0F \u9000\u907F\u30D5\u30A1\u30A4\u30EB\u540D\u304C item_id \u306E\u5F62\u5F0F\u3067\u306F\u306A\u3044\u305F\u3081\u9001\u4FE1\u3057\u307E\u305B\u3093: ${name}`);continue}try{const ageDays=(now-fs5.statSync(file).mtimeMs)/864e5;if(ageDays>this.config.writebackMaxAgeDays){fs5.rmSync(file,{force:true});this.log.log(` \u26D4 \u9000\
|
|
113
|
+
\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(fs5.readFileSync(file,"utf8"))}catch{fs5.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}`);continue}const{run_id:runId,...rest}=payload;const res=await this.
|
|
114
|
+
api.update(itemId,rest,runId||this.config.runId);if(res.ok){fs5.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){fs5.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}\
|
|
115
|
+
\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){fs5.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\
|
|
180
116
|
\u884C\u3057\u307E\u3059`)}}return recorded}};function exitReasonFor(outcome){if(outcome==="ok")return"ok";if(outcome==="timeout")return"timeout";if(outcome==="rate-limited")return"rate_limited";if(outcome==="aborted")return"interrupted";if(outcome==="max-turns")return"max_turns";return"error"}function withFailureHint(base,output){const hint=failureHint(output);return hint===""?base:`${base} | ${hint}`}var STOP_WAIT_MAX_SEC=3600;var AI_RECOVERY_HINT="\u78BA\u8A8D: claude-auto-switch status \uFF0F \u5404AI CLI\u306E\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\uFF08twp task-loop setup \u3067\u691C\u51FA\u7D50\u679C\u304C\u51FA\u307E\u3059\uFF09";
|
|
181
117
|
var ABORT_DRAIN_TIMEOUT_MS=15e3;function lastContractLine(logText,line){const prefix=line!==null&&/^[A-Z][A-Z0-9_]*$/.test(line)?line:"[A-Z][A-Z0-9_]*_RESULT";return[...logText.matchAll(new RegExp(`^(?:${prefix}):[^\\n]*`,"gm"))].at(-1)?.[0]??""}var TaskLoop=class{constructor(deps){this.deps=deps;this.writeback=new Writeback(deps.api,deps.config,deps.log);this.schedule=new ScheduleBridge({config:deps.config,log:deps.log,api:new ScheduleApi(deps.api),fetchCount:async(key,statusId)=>{const{total,error}=await deps.
|
|
182
118
|
projectApi.countByStatus(deps.config.projectId,statusId);if(error){deps.log.log(` \u26A0\uFE0F require_zero\u300C${key}\u300D\u306E\u4EF6\u6570\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${error}\uFF09\u3002\u3053\u306E\u67A0\u306F\u767A\u706B\u3057\u307E\u305B\u3093\uFF08fail-closed\uFF09`)}const refined=await refineCount(key,total,deps.config.operations.countHooks,deps.config.workspace);if(refined.note)deps.log.log(` ${refined.note}`);return refined.total}});this.
|
|
@@ -193,7 +129,7 @@ resolve()},ABORT_DRAIN_TIMEOUT_MS);timer.unref?.()})]);if(timer!==null)clearTime
|
|
|
193
129
|
if(!config.planEnabled){log.log("\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u306F\u7121\u52B9\u3067\u3059\uFF08plan_enabled=false\uFF09\u3002\u30AD\u30E5\u30FC\u304C\u7A7A\u3067\u3082\u8A08\u753BAI\u3092\u8D77\u52D5\u305B\u305A\u3001\u7A4D\u307E\u308C\u305F\u4ED5\u4E8B\u306E\u5B9F\u884C\u3060\u3051\u3092\u884C\u3044\u307E\u3059\u3002")}let cycle=0;let noProgressStreak=0;let unavailableStreak=0;let undeterminedStreak=0;let exitCode=0;while(cycle<config.maxCycles){if(this.aborting){log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u3066\u3044\u308B\
|
|
194
130
|
\u305F\u3081\u3001\u65B0\u3057\u3044\u30B5\u30A4\u30AF\u30EB\u3092\u958B\u59CB\u3057\u307E\u305B\u3093\u3002");break}if(this.draining){log.log(`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081\u3001\u65B0\u3057\u3044\u30B5\u30A4\u30AF\u30EB\u3092\u958B\u59CB\u3057\u307E\u305B\u3093\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 ${this.drainExitCode}\uFF09\u3002`);exitCode=this.drainExitCode;break}cycle+=1;const cycleStart=Date.now();log.separator();log.log(`========== Cy\
|
|
195
131
|
cle ${cycle}${config.daemon?"":`/${config.maxCycles}`} \u958B\u59CB ==========`);log.separator();await runner.beat("idle");log.log(formatHookWiring(config.prefetch,config.preflight));if(config.preflight.length>0){log.log(`\u74B0\u5883\u306E\u524D\u63D0\u6761\u4EF6\u3092\u78BA\u8A8D\u4E2D\uFF08\u30D5\u30C3\u30AF ${config.preflight.length}\u4EF6\uFF09...`)}this.cyclePreflightSection=await runPreflight(config.preflight,config.workspace,m=>log.log(m));await this.settings.apply();await this.skills.refresh();
|
|
196
|
-
try{await this.engine.healthCheck?.({cwd:config.workspace,logFilePrefix:
|
|
132
|
+
try{await this.engine.healthCheck?.({cwd:config.workspace,logFilePrefix:path4.join(config.logDir,`health-${this.timestamp}-${cycle}`)})}catch(err){log.log(` \u26A0\uFE0F AI\u30D8\u30EB\u30B9\u30C1\u30A7\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${err.message}\uFF09\u3002\u9396\u306F\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059`)}for(const line of normalizeGitIdentity(config.workspace,config.gitIdentity).logs)log.log(line);let planSkippedNoLock=false;let planSkippedNoChange=false;
|
|
197
133
|
const resent=await this.writeback.retryPending();for(const itemId of resent)await this.schedule.recordByItem(itemId,"completed");const reclaimRes=await this.deps.api.reclaim();if(!reclaimRes.ok){log.log(` \u26A0\uFE0F \u6B7B\u3093\u3060\u30E9\u30F3\u30CA\u30FC\u306E\u30A2\u30A4\u30C6\u30E0\u56DE\u53CEAPI\u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${describeError(reclaimRes)}\uFF09\u3002\u53D6\u308A\u6B8B\u3057\u304C\u6B8B\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059`)}await this.reclaimStaleProcessing();
|
|
198
134
|
const trust=this.trustGate.evaluate();for(const line of trust.logs)log.log(line);if(trust.note!==null){this.cyclePreflightSection=this.cyclePreflightSection===""?trust.note:`${this.cyclePreflightSection}
|
|
199
135
|
|
|
@@ -233,55 +169,64 @@ const{itemId,detail}=await createItem(this.deps.api,{label,prompt,...primary==="
|
|
|
233
169
|
led \u3068\u3057\u3066\u8FD4\u3057\u307E\u305B\u3093**")}else{await this.schedule.releaseWindow(row.scheduleId,row.windowKey,"\u30A8\u30F3\u30AD\u30E5\u30FCAPI\u304C\u5FDC\u7B54\u3057\u306A\u3044")}continue}let recorded=false;for(let attempt=1;attempt<=3&&!recorded;attempt++){recorded=await this.schedule.record(row.scheduleId,row.windowKey,"enqueued",{itemId});if(!recorded&&attempt<3)await this.sleep(3e3)}if(!recorded){log.log(` \u26D4 \u5B9A\u671F\u67A0\u3078\u306E item_id \u8A18\u9332\u306B3\u56DE\u5931\u6557\u3057\u307E\u3057\u305F\uFF08[${row.
|
|
234
170
|
scheduleId}] ${row.windowKey} \u2192 ${itemId}\uFF09`);log.log(" **\u30EA\u30FC\u30B9\u671F\u9650\u5F8C\u306B\u540C\u3058\u67A0\u304C\u518D\u6295\u5165\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059**\u3002\u5B9A\u671F\u67A0\u304C\u672C\u756A\u30EA\u30EA\u30FC\u30B9\u306A\u3089\u4E8C\u91CD\u5B9F\u884C\u306B\u306A\u308A\u307E\u3059")}if(exclusiveSkill!==null)exclusiveEnqueued.add(exclusiveSkill);enqueuedLines.push(`- [${row.priority}] ${row.label} \u2192 ${prompt}`);log.log(
|
|
235
171
|
` \u5B9A\u671F\u30A8\u30F3\u30AD\u30E5\u30FC: [${row.priority}] ${row.label} \u2192 ${prompt}`);count+=1}if(count>0){log.log(midcycle?`\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\uFF08\u4E2D\u9593\u5224\u5B9A\uFF09: ${count}\u4EF6\u3092\u30AD\u30E5\u30FC\u306B\u6295\u5165\u3057\u307E\u3057\u305F`:`\u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB: ${count}\u4EF6\u3092\u30AD\u30E5\u30FC\u306B\u6295\u5165\u3057\u307E\u3057\u305F`);this.midcycleEnqueued+=count}else if(!midcycle){log.log("\u5B9A\u671F\u30B9\u30B1\u30B8\
|
|
236
|
-
\u30E5\u30FC\u30EB: \u4ECA\u30B5\u30A4\u30AF\u30EB\u3067\u767A\u706B\u3057\u305F\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u3042\u308A\u307E\u305B\u3093")}if(!midcycle){const file=
|
|
172
|
+
\u30E5\u30FC\u30EB: \u4ECA\u30B5\u30A4\u30AF\u30EB\u3067\u767A\u706B\u3057\u305F\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u3042\u308A\u307E\u305B\u3093")}if(!midcycle){const file=path4.join(this.deps.config.logDir,`schedule-enqueued-${this.timestamp}.txt`);try{fs6.mkdirSync(path4.dirname(file),{recursive:true});fs6.writeFileSync(file,enqueuedLines.join("\n"))}catch{}}}async maybeEnqueueDueMidcycle(){const res=await this.deps.api.reclaim();if(!res.ok){this.deps.log.log(` \u26A0\uFE0F \u6B7B\u3093\u3060\u30E9\u30F3\u30CA\u30FC\u306E\u30A2\u30A4\u30C6\u30E0\u56DE\u53CEAPI\u304C\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${describeError(
|
|
237
173
|
res)}\uFF09`)}if(this.midcycleEnqueued>=this.deps.config.scheduleMidcycleMax)return;await this.enqueueDueScheduled(true)}async planGateSaysSkip(){const{config,log}=this.deps;this.planGateFingerprint=null;const gate=config.operations.planGate;if(gate===null)return false;const decision=await evaluatePlanGate(gate,{cwd:config.workspace,statePath:planGateStatePath(config.stateDir,projectFileKey(config.projectId)),nowMs:Date.now()});log.log(` plan_gate: ${decision.reason}`);this.planGateFingerprint=
|
|
238
174
|
decision.fingerprint;return decision.skip}recordPlanGateFingerprint(){const{config,log}=this.deps;const fingerprint=this.planGateFingerprint;this.planGateFingerprint=null;if(fingerprint===null)return;const statePath=planGateStatePath(config.stateDir,projectFileKey(config.projectId));if(!recordPlanned(statePath,fingerprint,Date.now())){log.log(` \u26A0\uFE0F plan_gate: \u8A08\u753B\u6642\u306E\u6307\u7D0B\u3092 ${statePath} \u306B\u8A18\u9332\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u6B21\u30B5\u30A4\u30AF\u30EB\u3082\u8A08\u753B\u3057\u307E\u3059\uFF09`)}}async runPlanAndEnqueue(cycle){
|
|
239
|
-
const{config,log}=this.deps;this.lastPlanWasEmpty=false;const planSkill=config.operations.planSkill;if(planSkill===null)return"failed";log.separator();log.log("Phase 1: \u8A08\u753B\u3092\u7ACB\u6848\u3057\u3066\u30AD\u30E5\u30FC\u306B\u683C\u7D0D...");log.separator();const planLogFile=
|
|
175
|
+
const{config,log}=this.deps;this.lastPlanWasEmpty=false;const planSkill=config.operations.planSkill;if(planSkill===null)return"failed";log.separator();log.log("Phase 1: \u8A08\u753B\u3092\u7ACB\u6848\u3057\u3066\u30AD\u30E5\u30FC\u306B\u683C\u7D0D...");log.separator();const planLogFile=path4.join(config.logDir,`plan-${this.timestamp}-${cycle}.log`);const enqueuedFile=path4.join(config.logDir,`schedule-enqueued-${this.timestamp}.txt`);const scheduleSection=await this.schedule.promptSection(enqueuedFile);
|
|
240
176
|
if(config.prefetch.length>0)log.log(`\u8A08\u753B\u7528\u30C7\u30FC\u30BF\u3092\u4E8B\u524D\u53D6\u5F97\u4E2D\uFF08\u30D5\u30C3\u30AF ${config.prefetch.length}\u4EF6\uFF09...`);const prefetchSection=await runPrefetch(config.prefetch,config.workspace,m=>log.log(m));const excludeKeys=parsePlanExcludeKeys(prefetchSection);if(excludeKeys.size>0){log.log(` \u8A08\u753B\u5019\u88DC\u304B\u3089\u5916\u3059\u30BF\u30B9\u30AF\uFF08\u672A\u56DE\u7B54\u306E\u8CEA\u554F\u3042\u308A\uFF09: ${[...excludeKeys].
|
|
241
177
|
sort().join(", ")}`)}const taskStatusSnapshot=parseTaskStatusSnapshot(prefetchSection);if(taskStatusSnapshot===null){log.log(" \u26A0\uFE0F prefetch \u306B OPS_TASK_STATUS \u30DE\u30FC\u30AB\u30FC\u304C\u3042\u308A\u307E\u305B\u3093");log.log(" \u300C\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\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 if(!taskStatusSnapshot.
|
|
242
178
|
complete){log.log(" \u26A0\uFE0F \u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u4E00\u90E8\u53D6\u5F97\u3067\u304D\u3066\u3044\u307E\u305B\u3093\uFF08complete=0\uFF09\u2192 \u518D\u6295\u5165\u6291\u6B62\u306F\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9\u3067\u3059")}const outcomeReports=await fetchOutcomeReports(this.deps.api,config.outcomeSkills??[]);for(const w of outcomeStreakWarnings(outcomeReports))log.log(` \u26A0\uFE0F ${w}`);const outcomeSection=renderOutcomeSection(
|
|
243
|
-
outcomeReports);let planSession;try{planSession=openPlanSession(
|
|
244
|
-
\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306F\u5FDC\u7B54\u306E\u6587\u7AE0\u304B\u3089\u8A08\u753B\u3092\u53D6\u308A\u51FA\u3057\u307E\u3059`);planSession=NO_PLAN_SESSION}let result;let submitted;try{result=await this.engine.run({prompt:buildPlanPrompt(config,planSkill,scheduleSection,prefetchSection,outcomeSection),promptPrefix:this.cyclePreflightSection,logFile:planLogFile,timeoutSec:config.planTimeoutSec,cwd:config.workspace,skill:normalizeSkillName(
|
|
245
|
-
keys(planSession.env).length>0?{extraEnv:planSession.env}:{},validate:output=>planSession.submission()!==null||extractPlanJson(output)!==null});submitted=planSession.submission()}finally{planSession.close()}writeLogFile(planLogFile,result.output);if(result.outcome==="aborted"){log.log(" \u23F9 \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u8A08\u753B\u3092\u6253\u3061\u5207\u308A\u307E\u3057\u305F");return"
|
|
246
|
-
\u23ED AI \u3092\u8D77\u52D5\u3067\u304D\u306A\u3044\u305F\u3081\u8A08\u753B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);return result.outcome}log.log(` \u26D4 \u8A08\u753B\u306E\u5B9F\u884C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);return"failed"}if(this.planLock.isLost()){log.log(` \u26D4 \u8A08\u753B\u4E2D\u306B\u8A08\u753B\u30ED\u30C3\u30AF\u3092\u5931\u3044\u307E\u3057\u305F\uFF08reason=${this.
|
|
247
|
-
\uFF09`);log.log(" **\u30A8\u30F3\u30AD\u30E5\u30FC\u3092\u4E2D\u6B62\u3057\u307E\u3059**\u3002\u8A08\u753B\u7D50\u679C\u306F\u7834\u68C4\u3057\u3001\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u53D6\u308A\u76F4\u3057\u307E\u3059");return"ok"}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
179
|
+
outcomeReports);const blocks=await this.snapshotDynamicBlocks(taskStatusSnapshot);let planSession;try{planSession=openPlanSession(path4.join(config.stateDir,"plan-submit"),[...fileSkillNames([path4.join(config.workspace,".claude","commands"),...process.env.CLAUDE_CONFIG_DIR?[path4.join(process.env.CLAUDE_CONFIG_DIR,"commands")]:[],path4.join(os2.homedir(),".claude","commands")]),...this.skills.names()],blocks)}catch(err){log.log(` \u26A0\uFE0F \u8A08\u753B\u306E\u63D0\u51FA\u53E3\u3092\u6E96\u5099\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.
|
|
180
|
+
message}\uFF09\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306F\u5FDC\u7B54\u306E\u6587\u7AE0\u304B\u3089\u8A08\u753B\u3092\u53D6\u308A\u51FA\u3057\u307E\u3059`);planSession=NO_PLAN_SESSION}let result;let submitted;let rejectedSubmissions=[];try{result=await this.engine.run({prompt:buildPlanPrompt(config,planSkill,scheduleSection,prefetchSection,outcomeSection),promptPrefix:this.cyclePreflightSection,logFile:planLogFile,timeoutSec:config.planTimeoutSec,cwd:config.workspace,skill:normalizeSkillName(
|
|
181
|
+
planSkill.replace(/^\//,"")),...Object.keys(planSession.env).length>0?{extraEnv:planSession.env}:{},validate:output=>planSession.submission()!==null||extractPlanJson(output)!==null});submitted=planSession.submission();rejectedSubmissions=planSession.rejections()}finally{planSession.close()}writeLogFile(planLogFile,result.output);if(result.outcome==="aborted"){log.log(" \u23F9 \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u8A08\u753B\u3092\u6253\u3061\u5207\u308A\u307E\u3057\u305F");return"\
|
|
182
|
+
aborted"}if(result.outcome!=="ok"){if(isAiUnavailable(result.outcome)){log.log(` \u23ED AI \u3092\u8D77\u52D5\u3067\u304D\u306A\u3044\u305F\u3081\u8A08\u753B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);return result.outcome}log.log(` \u26D4 \u8A08\u753B\u306E\u5B9F\u884C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);return"failed"}if(this.planLock.isLost()){log.log(` \u26D4 \u8A08\u753B\u4E2D\u306B\u8A08\u753B\u30ED\u30C3\u30AF\u3092\u5931\u3044\u307E\u3057\u305F\uFF08reason=${this.
|
|
183
|
+
planLock.lostReasonText()}\uFF09`);log.log(" **\u30A8\u30F3\u30AD\u30E5\u30FC\u3092\u4E2D\u6B62\u3057\u307E\u3059**\u3002\u8A08\u753B\u7D50\u679C\u306F\u7834\u68C4\u3057\u3001\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u53D6\u308A\u76F4\u3057\u307E\u3059");return"ok"}const unchecked=unavailableChecks(blocks);const recordResult=summary=>{const line=formatPlanResultLine(rejectedSubmissions.length>0?{...summary,rejected_submissions:rejectedSubmissions}:summary);log.log(line);try{fs6.appendFileSync(planLogFile,
|
|
184
|
+
`
|
|
185
|
+
${line}
|
|
186
|
+
`)}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});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{log.log("\u8A08\u753B\u306E\u63D0\u51FA\
|
|
187
|
+
\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});this.lastPlanWasEmpty=true;return"ok"}const verifyBacklog=parseOpsCount(
|
|
188
|
+
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}`)}const zeroTargetDrops=zeroTargetDropReasons(
|
|
189
|
+
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\u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");
|
|
251
190
|
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>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:");
|
|
252
191
|
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()=>{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\
|
|
253
|
-
\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=
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
192
|
+
\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(pending);return pendingKeys};let exclusiveQueued=null;let exclusiveFetched=false;const exclusiveInflight=async()=>{if(exclusiveFetched)return exclusiveQueued;exclusiveFetched=true;const pending=await pendingOnce();
|
|
193
|
+
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");return null}if(pending===null||processing===null){log.
|
|
194
|
+
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(config.aiTimeoutSec)});const exclusive=entries.filter(
|
|
195
|
+
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;let resultFetchBudget=5;const recentAdvanceFor=async(taskKey,skill)=>{
|
|
196
|
+
if(config.operations.advancingOutcomes.size===0)return null;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\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{
|
|
258
197
|
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;const candidate=findRecentCandidate(recentCandidates,taskKey,skill);if(candidate===null)return null;return resolveRecentAdvance(candidate,async itemId=>{if(resultFetchBudget<=0)return null;resultFetchBudget-=1;const res=await this.deps.api.
|
|
259
|
-
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}return res.json?.item?.result??null},config.operations.advancingOutcomes)};const exclusiveEnqueued=new Set;const enqueuedTaskKeys=new Set;let enqueued=0;
|
|
260
|
-
step,config.ai);if(!item)continue
|
|
261
|
-
|
|
262
|
-
skill
|
|
263
|
-
skill} \u2014 ${
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if(res.status===409){log.log(
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
198
|
+
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}return res.json?.item?.result??null},config.operations.advancingOutcomes)};const exclusiveEnqueued=new Set;const enqueuedTaskKeys=new Set;let enqueued=0;const dropped=[];let lockLostMidway=false;for(const[
|
|
199
|
+
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`)}
|
|
200
|
+
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(
|
|
201
|
+
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.
|
|
202
|
+
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,
|
|
203
|
+
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(
|
|
204
|
+
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.
|
|
205
|
+
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.
|
|
206
|
+
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}\
|
|
207
|
+
| ${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"});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.
|
|
208
|
+
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\u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406"})}break}const exclusiveSkill=config.ai.isExclusiveSkill(step.skill)?normalizeSkillName(step.skill):null;if(exclusiveSkill!==
|
|
209
|
+
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,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?.
|
|
210
|
+
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.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,
|
|
211
|
+
item);if(itemId){enqueued+=1;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\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`);
|
|
212
|
+
recordResult({source,empty:false,planned:plan.steps.length,enqueued,dropped,unchecked,...lockLostMidway?{aborted:true}:{}});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,
|
|
213
|
+
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\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){
|
|
214
|
+
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`);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;
|
|
215
|
+
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.
|
|
216
|
+
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\
|
|
217
|
+
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.
|
|
218
|
+
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`:
|
|
219
|
+
"\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.
|
|
220
|
+
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.
|
|
221
|
+
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+=
|
|
222
|
+
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`);
|
|
223
|
+
continue}log.log(`[${stepNum}] /stop \u2192 \u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002`);stop=true;break}const skillName=/\/twp-([a-z][a-z0-9-]*)/.exec(prompt)?.[1]??"";const promptPlaceholder=placeholderTaskKey(prompt.replace(/^\/twp-[a-z0-9-]*\s*/,""));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`;
|
|
224
|
+
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(
|
|
225
|
+
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");
|
|
226
|
+
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**");
|
|
227
|
+
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\
|
|
228
|
+
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,
|
|
229
|
+
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}
|
|
285
230
|
${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");
|
|
286
231
|
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:truncateResult(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"},
|
|
287
232
|
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\
|
|
@@ -307,7 +252,7 @@ this.postDeps,contract);return}const followUpOnCut=this.deps.config.operations.p
|
|
|
307
252
|
"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\
|
|
308
253
|
\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");
|
|
309
254
|
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");
|
|
310
|
-
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{
|
|
255
|
+
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",""),
|
|
311
256
|
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(
|
|
312
257
|
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",
|
|
313
258
|
["- \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",
|
|
@@ -320,37 +265,40 @@ join("\n"),"**\u5927\u304D\u306A\u672A\u5B8C\u6210\u3088\u308A\u3001\u5C0F\u3055
|
|
|
320
265
|
\u305F\u3060\u3057\u3001\u4EBA\u9593\u3084\u5225\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u65E2\u306B\u30EA\u30EA\u30FC\u30B9\u6E08\u307F\u306E\u30BF\u30B9\u30AF\u306B\u3064\u3044\u3066\u3001\u4E8B\u5B9F\u3092\u30B9\u30C6\u30FC\u30BF\u30B9\u3078\u53CD\u6620\u3059\u308B\u3053\u3068\u306F\u5236\u9650\u5BFE\u8C61\u5916\u3067\u3059\u3002`;var NON_INTERACTIVE_NOTE=`\u3010\u91CD\u8981: \u975E\u5BFE\u8A71\u30E2\u30FC\u30C9\uFF08\u81EA\u52D5\u5B9F\u884C\uFF09\u3067\u5B9F\u884C\u4E2D\u3011
|
|
321
266
|
\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u5B9F\u884C\u3067\u3059\u3002\u4EBA\u9593\u3078\u306E\u5BFE\u8A71\u7684\u306A\u8CEA\u554F\u306F\u3067\u304D\u307E\u305B\u3093\u3002
|
|
322
267
|
- \u4ED5\u69D8\u30FB\u8981\u4EF6\u30FB\u65B9\u91DD\u306B\u3064\u3044\u3066\u4EBA\u9593\u306E\u5224\u65AD\u304C\u5FC5\u8981\u306A\u5834\u5408 \u2192 \u30BF\u30B9\u30AF\u306B\u30B3\u30E1\u30F3\u30C8\u3067\u8CEA\u554F\u3092\u6295\u7A3F\u3057\u3001\u4EBA\u9593\u5224\u65AD\u5F85\u3061\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3078\u5909\u66F4\u3057\u3066\u304B\u3089\u51E6\u7406\u3092\u7D42\u4E86\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
323
|
-
- \u904B\u7528\u4E0A\u306E\u5224\u65AD\uFF08\u30EA\u30C8\u30E9\u30A4\u3001\u30B9\u30AD\u30C3\u30D7\u7B49\uFF09\u2192 \u5B89\u5168\u306A\u65B9\u3092\u81EA\u52D5\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;import
|
|
324
|
-
join(dir,"package.json");try{const parsed=JSON.parse(read(candidate));const name=parsed.name;const version=parsed.version;if(name===PACKAGE_NAME&&typeof version==="string"&&version!==""){const safeVersion=stripTerminalControls(version).replace(/\s+/g," ").trim().slice(0,MAX_VERSION_CHARS);if(safeVersion==="")return null;let installedAtMs=null;try{installedAtMs=mtime(candidate)}catch{}return{packageJsonPath:candidate,version:safeVersion,installedAtMs}}}catch{}const parent=
|
|
268
|
+
- \u904B\u7528\u4E0A\u306E\u5224\u65AD\uFF08\u30EA\u30C8\u30E9\u30A4\u3001\u30B9\u30AD\u30C3\u30D7\u7B49\uFF09\u2192 \u5B89\u5168\u306A\u65B9\u3092\u81EA\u52D5\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;import fs7 from"fs";import path5 from"path";import{fileURLToPath}from"url";var EXIT_VERSION_DRIFT=75;var DEFAULT_MIN_UPTIME_MS=10*6e4;var DRIFT_POLL_MS=5*6e4;var DEFAULT_INSTALL_MAX_AGE_DAYS=3;var MAX_VERSION_CHARS=64;var MAX_PACKAGE_LOOKUP_DEPTH=6;var PACKAGE_NAME="@tocca-systems/twp-cli";function findInstalledPackage(deps={}){const read=deps.readFileSync??(p=>fs7.readFileSync(p,"utf8"));const mtime=deps.statMtimeMs??(p=>fs7.statSync(p).mtimeMs);let dir=deps.startDir??path5.dirname(fileURLToPath(import.meta.url));for(let i=0;i<MAX_PACKAGE_LOOKUP_DEPTH;i++){const candidate=path5.
|
|
269
|
+
join(dir,"package.json");try{const parsed=JSON.parse(read(candidate));const name=parsed.name;const version=parsed.version;if(name===PACKAGE_NAME&&typeof version==="string"&&version!==""){const safeVersion=stripTerminalControls(version).replace(/\s+/g," ").trim().slice(0,MAX_VERSION_CHARS);if(safeVersion==="")return null;let installedAtMs=null;try{installedAtMs=mtime(candidate)}catch{}return{packageJsonPath:candidate,version:safeVersion,installedAtMs}}}catch{}const parent=path5.dirname(dir);if(parent===
|
|
325
270
|
dir)break;dir=parent}return null}function isNewerVersion(installed,running){if(!isReleaseVersion(installed)||!isReleaseVersion(running))return false;const a=parseVersionCore(installed);const b=parseVersionCore(running);if(a===null||b===null)return false;return compareVersionCores(a,b)>0}function isReleaseVersion(version){if(version.includes("-")||version.includes("+"))return false;return parseVersionCore(version)!==null}function decideOnDrift(input){const{runningVersion,installedVersion,previousAttempt}=input;
|
|
326
271
|
if(installedVersion===null)return{action:"none"};if(!isNewerVersion(installedVersion,runningVersion))return{action:"none"};const drift=`${runningVersion} \u2192 ${installedVersion}`;if(input.disabled){return{action:"warn",key:`disabled:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u81EA\u52D5\u518D\u8D77\u52D5\u306F\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059`}}if(!input.supervised){return{action:"w\
|
|
327
272
|
arn",key:`unsupervised:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u7D42\u4E86\u3057\u3066\u3082\u518D\u8D77\u52D5\u3059\u308B\u76E3\u7763\u8005\u304C\u5C45\u306A\u3044\u305F\u3081\u7D42\u4E86\u3057\u307E\u305B\u3093\uFF08systemd \u914D\u4E0B\u306A\u3089\u81EA\u52D5\u30FB\u4ED6\u306E\u76E3\u7763\u4E0B\u3067\u306F TWP_LOOP_AUTO_RESTART=1 \u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`}}const minUptimeMs=input.
|
|
328
273
|
minUptimeMs??DEFAULT_MIN_UPTIME_MS;if(input.uptimeMs<minUptimeMs){return{action:"warn",key:`too-young:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u8D77\u52D5\u304B\u3089 ${Math.trunc(input.uptimeMs/1e3)}\u79D2 \u3057\u304B\u7D4C\u3063\u3066\u3044\u307E\u305B\u3093\uFF08${Math.trunc(minUptimeMs/6e4)}\u5206 \u672A\u6E80\u306F\u518D\u8D77\u52D5\u3057\u307E\u305B\u3093\u3002\u901F\u3044\u518D\u8D77\u52D5\u30EB\u30FC\u30D7\u3092\u907F\u3051\u308B\u305F\u3081\uFF09`}}
|
|
329
274
|
if(previousAttempt!==null&&previousAttempt.to===installedVersion){return{action:"warn",key:`repeat:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u304C\u518D\u8D77\u52D5\u5F8C\u3082\u89E3\u6D88\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u524D\u56DE ${previousAttempt.at} \u306B ${previousAttempt.to} \u3092\u76EE\u6A19\u306B\u518D\u8D77\u52D5\u6E08\u307F\uFF09\u3002\u81EA\u52D5\u518D\u8D77\u52D5\u3092\u7E70\u308A\u8FD4\u3055\u305A\u505C\u6B62\u3057\u307E\u3059\u3002\u5C0E\u5165\u5148\u3068\u8D77\u52D5\u7D4C\u8DEF\u304C\u540C\u3058\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044`}}
|
|
330
|
-
return{action:"restart",from:runningVersion,to:installedVersion}}function resolveAutoRestart(env){const raw=(env["TWP_LOOP_AUTO_RESTART"]??"").trim().toLowerCase();if(raw==="0"||raw==="false")return{supervised:false,disabled:true};if(raw==="1"||raw==="true")return{supervised:true,disabled:false};return{supervised:(env["INVOCATION_ID"]??"")!=="",disabled:false}}function restartAttemptPath(stateDir,projectKey){return
|
|
331
|
-
function readRestartAttempt(stateDir,projectKey,deps={}){const read=deps.readFileSync??(p=>
|
|
332
|
-
return{from,to,at:typeof at==="string"?at:""}}catch{return null}}function writeRestartAttempt(stateDir,projectKey,attempt,deps={}){const write=deps.writeFileSync??((p,d)=>
|
|
333
|
-
`);return true}catch{return false}}function clearRestartAttempt(stateDir,projectKey,deps={}){const rm=deps.rmSync??(p=>
|
|
275
|
+
return{action:"restart",from:runningVersion,to:installedVersion}}function resolveAutoRestart(env){const raw=(env["TWP_LOOP_AUTO_RESTART"]??"").trim().toLowerCase();if(raw==="0"||raw==="false")return{supervised:false,disabled:true};if(raw==="1"||raw==="true")return{supervised:true,disabled:false};return{supervised:(env["INVOCATION_ID"]??"")!=="",disabled:false}}function restartAttemptPath(stateDir,projectKey){return path5.join(stateDir,`task-loop-${projectKey}.restart.json`)}var MAX_RESTART_ATTEMPT_BYTES=4096;
|
|
276
|
+
function readRestartAttempt(stateDir,projectKey,deps={}){const read=deps.readFileSync??(p=>fs7.readFileSync(p,"utf8"));const size=deps.statSize??(p=>fs7.statSync(p).size);const target=restartAttemptPath(stateDir,projectKey);try{if(size(target)>MAX_RESTART_ATTEMPT_BYTES)return null;const raw=read(target);if(raw.length>MAX_RESTART_ATTEMPT_BYTES)return null;const parsed=JSON.parse(raw);const from=parsed.from;const to=parsed.to;const at=parsed.at;if(typeof from!=="string"||typeof to!=="string")return null;
|
|
277
|
+
return{from,to,at:typeof at==="string"?at:""}}catch{return null}}function writeRestartAttempt(stateDir,projectKey,attempt,deps={}){const write=deps.writeFileSync??((p,d)=>fs7.writeFileSync(p,d,{flag:"wx",mode:384}));clearRestartAttempt(stateDir,projectKey,deps);try{write(restartAttemptPath(stateDir,projectKey),`${JSON.stringify(attempt)}
|
|
278
|
+
`);return true}catch{return false}}function clearRestartAttempt(stateDir,projectKey,deps={}){const rm=deps.rmSync??(p=>fs7.rmSync(p,{recursive:true,force:true}));try{rm(restartAttemptPath(stateDir,projectKey))}catch{}}function installAgeDays(installedAtMs,nowMs){if(installedAtMs===null||!Number.isFinite(installedAtMs))return null;const days=(nowMs-installedAtMs)/864e5;return days<0?0:days}function watchVersionDrift(opts,handlers){const now=opts.now??Date.now;const find=opts.findInstalled??(()=>findInstalledPackage());
|
|
334
279
|
const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)return;const installed=find();const decision=decideOnDrift({runningVersion:opts.runningVersion,installedVersion:installed?.version??null,supervised:opts.supervised,disabled:opts.disabled,uptimeMs:now()-startedAtMs,...opts.minUptimeMs===void 0?{}:{minUptimeMs:opts.minUptimeMs},previousAttempt:readRestartAttempt(opts.stateDir,opts.projectKey,opts.store)});if(decision.action==="none")return;if(decision.action==="warn"){if(warned===
|
|
335
280
|
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`)}
|
|
336
|
-
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
|
|
337
|
-
`);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=>
|
|
338
|
-
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=>
|
|
339
|
-
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:
|
|
340
|
-
claudeLauncher.bin,...extraHosts.length>0?{preflightHosts:[...DEFAULT_PREFLIGHT_HOSTS,...extraHosts]}:{}})}function lockDir(config){return
|
|
341
|
-
return runPlanSubmit({file:opts.charterInput,empty:opts.planEmpty===true,check:opts.planCheck===true},{env:process.env,readStdin:()=>
|
|
281
|
+
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()})}
|
|
282
|
+
`);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)||
|
|
283
|
+
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-GN5ZQPHC.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-GN5ZQPHC.js");const extraHosts=config.
|
|
284
|
+
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.
|
|
285
|
+
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.
|
|
286
|
+
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-CUVVYDTN.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)})}
|
|
287
|
+
const profile=resolveProfile(opts.profile);let creds;try{creds=new AuthSession(profile.name,profile.apiUrl).loadOrThrow()}catch(err){process.stderr.write(`${err.message}
|
|
342
288
|
`);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.
|
|
343
289
|
message}
|
|
344
|
-
`);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-
|
|
290
|
+
`);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-PF2VH2TW.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(" / ")}
|
|
345
291
|
`);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.
|
|
346
292
|
write("charter \u306B\u306F push \u304B pull \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}const{runCharterCommand}=await import("./charter-command-LIX2JXRJ.js");return runCharterCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.
|
|
347
293
|
charterOp,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 \u304B pull \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");
|
|
348
294
|
return 2}const{runSkillCommand}=await import("./skill-command-NXHTJXYY.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.
|
|
349
|
-
interval}:{},forceRunner:opts.forceRunner,...opts.engine!==void 0?{engine:opts.engine}:{},version:opts.version});const api=new AgentLoopApi({apiUrl,projectId,session});if(opts.action==="
|
|
350
|
-
`)
|
|
295
|
+
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}
|
|
296
|
+
`);const{runCapacityReport}=await import("./capacity-report-command-A6RYG2NV.js");return runCapacityReport({api,projectId,runnerId:config.runnerId,stateDir:config.stateDir,cwd:config.workspace,probe:config.capacityProbe,runnerIdPersisted:runnerIdPersisted(config.stateDir),version:opts.version,platform:runnerPlatform(),stdout:s=>process.stdout.write(s),stderr:s=>process.stderr.write(s)})}if(opts.action==="status"||opts.action==="schedule"){for(const warning of config.warnings)process.stderr.write(`\u26A0\uFE0F ${warning}\
|
|
297
|
+
|
|
298
|
+
`)}if(opts.action==="status")return showStatus(api,config);if(opts.action==="schedule"){const{runScheduleCommand}=await import("./schedule-command-ZX5WNSAC.js");return runScheduleCommand({api,projectApi,config},{now:opts.scheduleNow,counts:opts.scheduleCounts,gate:opts.scheduleGate,verbose:opts.verbose===true})}if(config.engine===""){process.stderr.write(`${new EngineNotConfiguredError().message}
|
|
351
299
|
`);return 2}try{assertKnownEngine(config.engine)}catch(err){if(err instanceof UnknownEngineError){process.stderr.write(`${err.message}
|
|
352
|
-
`);return 2}throw err}
|
|
353
|
-
|
|
300
|
+
`);return 2}throw err}fs9.mkdirSync(config.logDir,{recursive:true,mode:448});rotateLogs(config.logDir,config.logRetentionDays);const logFile=path7.join(config.logDir,`agent-loop-${compactTimestamp()}.log`);const log=new LoopLogger(config.runnerId,logFile);for(const warning of config.warnings)log.log(`\u26A0\uFE0F ${warning}`);const lock=new InstanceLock(lockDir(config));const acquired=lock.acquire();if(!acquired.acquired){log.log(`\u274C ${acquired.reason}`);log.log(" \u610F\u56F3\u7684\u306B2\u30D7\u30ED\u30BB\u30B9\u52D5\u304B\u3059\u691C\u8A3C\u3067\u306F TWP_OPS\
|
|
301
|
+
_STATE_DIR \u3068 RUNNER_ID \u3092\u5206\u3051\u3066\u304F\u3060\u3055\u3044");log.close();return 1}if(acquired.note)log.log(` \u2139\uFE0F ${acquired.note}`);const ownerError=writeLockOwner(lockDir(config),buildLockOwner({pid:process.pid,profile:profile.name,twpHome:twpHomeDir(),projectRef:config.projectRef,projectId:config.projectId}));if(ownerError!==null){log.log(` \u26A0\uFE0F \u30ED\u30C3\u30AF\u306B\u6240\u6709\u8005\u306E\u8A18\u9332\u3092\u66F8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${ownerError}\
|
|
354
302
|
\uFF09\u3002twp logout \u306F\u5224\u5B9A\u4E0D\u80FD\u3068\u3057\u3066\u62D2\u5426\u3057\u307E\u3059`)}for(const kind of["stop","drain"]){const existing=readMarker(lockDir(config),kind);if(existing===null||existing.pid!==process.pid)clearMarker(lockDir(config),kind)}exportStateDirEnv(config);const runner=new RunnerSession(api,config,log);log.separator();log.log("twp task-loop \u958B\u59CB");log.log(` PROJECT: ${config.projectRef}\uFF08${config.projectId}\uFF09`);log.log(` API: ${api.baseUrl}`);
|
|
355
303
|
log.log(` RUNNER_ID: ${config.runnerId}`);log.log(` STATE_DIR: ${config.stateDir}`);log.log(` RUN_ID: ${config.runId}`);log.log(` ENGINE: ${config.engine}${config.engine==="noop"?"\uFF08\u26A0\uFE0F AI \u306F\u8D77\u52D5\u3057\u307E\u305B\u3093\uFF09":""}`);log.log(` AI_CONFIG_HASH: ${config.configHash}`);if(!config.charterEnabled){log.log(" CHARTER: \u524D\u7F6E\u3057\u307E\u305B\u3093\uFF08charter_enabled=false\uFF09")}else{const wrap=config.charterPrefix===null&&config.charterSuffix===null?
|
|
356
304
|
"":"\u30FB\u56F2\u307F\u6587\u306F\u4E0A\u66F8\u304D";log.log(` CHARTER: ${config.charterFile??"(\u306A\u3057)"}${wrap}`)}if(config.prefetch.length>0){log.log(` PREFETCH: ${config.prefetch.map(h=>h.id).join(", ")}`)}if(config.preflight.length>0){log.log(` PREFLIGHT: ${config.preflight.map(h=>h.id).join(", ")}`)}log.log(` MAX_CYCLES: ${config.daemon?"\u30C7\u30FC\u30E2\u30F3\uFF08\u7121\u5236\u9650\uFF09":config.maxCycles}`);const interval=config.intervalSource==="cli"?`${config.intervalSec}s\
|
|
@@ -363,7 +311,7 @@ log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u4FE1\u3057\u307E\u305
|
|
|
363
311
|
"\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"}\
|
|
364
312
|
\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.
|
|
365
313
|
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`;
|
|
366
|
-
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-
|
|
314
|
+
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-77MPN3UN.js");const settings=new LoopSettingsApplier2({api,config,log:m=>log.log(m)});await settings.apply();const{ServerSkillCatalog:ServerSkillCatalog2}=await import("./server-skills-KX236POI.js");const skills=new ServerSkillCatalog2({api,config,log:m=>log.log(m)});await skills.
|
|
367
315
|
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.
|
|
368
316
|
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){const out={write:text=>process.stdout.write(stripTerminalControls(text))};out.write(`\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8: ${config.
|
|
369
317
|
projectRef}\uFF08${config.projectId}\uFF09
|
|
@@ -376,12 +324,12 @@ projectRef}\uFF08${config.projectId}\uFF09
|
|
|
376
324
|
`);continue}const items=pick(res.json,"items");const more=pick(res.json,"has_more")===true||pick(res.json,"pagination.has_more")===true;const counted=Array.isArray(items)?filterByStatus(items,status).length:null;out.write(`${status}: ${counted??"?"}\u4EF6${more?"\u4EE5\u4E0A":""}
|
|
377
325
|
`)}const state=await api.request("GET","/state");if(state.ok){const planning=pick(state.json,"state.planning")===true;out.write(`\u8A08\u753B\u30ED\u30C3\u30AF: ${planning?`\u4FDD\u6301\u4E2D\uFF08${pick(state.json,"state.plan_owner_runner_id")??"?"} / \u671F\u9650 ${pick(state.json,"state.plan_lock_expires_at")??"?"}\uFF09`:"\u7A7A\u304D"}
|
|
378
326
|
`)}const lock=lockDir(config);out.write(`
|
|
379
|
-
\u30ED\u30FC\u30AB\u30EB\u30ED\u30C3\u30AF: ${
|
|
327
|
+
\u30ED\u30FC\u30AB\u30EB\u30ED\u30C3\u30AF: ${fs9.existsSync(lock)?`\u4FDD\u6301\u4E2D\uFF08${lock}\uFF09`:"\u7121\u3057"}
|
|
380
328
|
`);return 0}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.isLoopProcess??defaultIsLoopProcess;const isAlive=deps.isAlive??defaultIsAlive;const waitMs=deps.waitMs??STOP_WAIT_MS;const pollMs=deps.pollMs??STOP_POLL_MS;const now=deps.now??Date.now;const nap=deps.sleep??(ms=>new Promise(r=>setTimeout(
|
|
381
|
-
r,ms)));const request=deps.requestMarkerFn??requestMarker;const out=m=>void process.stdout.write(m);const err=m=>void process.stderr.write(m);if(opts.force&&opts.drain){err("\u26A0\uFE0F --force \u3068 --drain \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u8981\u6C42\u304C\u6B63\u53CD\u5BFE\u3067\u3059\uFF09\u3002\u3069\u3061\u3089\u3082\u5B9F\u884C\u3057\u307E\u305B\u3093\n");return 2}const stateDir=deps.stateDir??loopStateDir();let dirs;try{dirs=
|
|
329
|
+
r,ms)));const request=deps.requestMarkerFn??requestMarker;const out=m=>void process.stdout.write(m);const err=m=>void process.stderr.write(m);if(opts.force&&opts.drain){err("\u26A0\uFE0F --force \u3068 --drain \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u8981\u6C42\u304C\u6B63\u53CD\u5BFE\u3067\u3059\uFF09\u3002\u3069\u3061\u3089\u3082\u5B9F\u884C\u3057\u307E\u305B\u3093\n");return 2}const stateDir=deps.stateDir??loopStateDir();let dirs;try{dirs=fs9.readdirSync(stateDir).
|
|
382
330
|
filter(d=>/^task-loop-.*\.lock\.d$/.test(d))}catch{dirs=[]}if(opts.project){if(/^[0-9a-f-]{36}$/i.test(opts.project)||ULID_RE.test(opts.project)){dirs=dirs.filter(d=>d===`task-loop-${opts.project}.lock.d`)}else if(isPrivateProjectRef(opts.project)){dirs=dirs.filter(d=>d.startsWith("task-loop-private-"))}else{err(`\u26A0\uFE0F --project \u306F ID\uFF08UUID / ULID\uFF09\u6307\u5B9A\u306E\u3068\u304D\u3060\u3051\u7D5E\u308A\u8FBC\u3081\u307E\u3059\uFF08${safe(opts.project)} \u306F\u30AD\u30FC\u5F62\u5F0F\u306B\u898B\u3048\u307E\u3059\uFF09\u3002\u3053\u306E\u30DE\u30B7\u30F3\u306E task\
|
|
383
331
|
-loop ${dirs.length}\u4EF6\u3059\u3079\u3066\u3092\u5BFE\u8C61\u306B\u3057\u307E\u3059
|
|
384
|
-
`)}}if(dirs.length===0){out("\u3053\u306E\u30DE\u30B7\u30F3\u3067\u7A3C\u50CD\u4E2D\u306E task-loop \u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\n");return 0}const startedAt=now();const targets=[];for(const dir of dirs){const lockDirPath=
|
|
332
|
+
`)}}if(dirs.length===0){out("\u3053\u306E\u30DE\u30B7\u30F3\u3067\u7A3C\u50CD\u4E2D\u306E task-loop \u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\n");return 0}const startedAt=now();const targets=[];for(const dir of dirs){const lockDirPath=path7.join(stateDir,dir);let pid;try{pid=Number.parseInt(fs9.readFileSync(path7.join(lockDirPath,"pid"),"utf8").trim(),10)}catch{continue}if(!Number.isInteger(pid)||pid<=0)continue;if(!isLoopProcess(pid)){out(`\u6B8B\u9AB8\u306E\u30ED\u30C3\u30AF\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\uFF08pid=${pid}\
|
|
385
333
|
\u306F task-loop \u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002\u505C\u6B62\u8981\u6C42\u306F\u9001\u308A\u307E\u305B\u3093: ${safe(dir)}
|
|
386
334
|
`);continue}targets.push({dir,lockDir:lockDirPath,pid,requested:false})}if(targets.length===0){out("\u7A3C\u50CD\u4E2D\u306E\u30D7\u30ED\u30BB\u30B9\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u6B8B\u9AB8\u306E\u30ED\u30C3\u30AF\u306F\u6B21\u56DE\u8D77\u52D5\u6642\u306B\u5F15\u304D\u53D6\u3089\u308C\u307E\u3059\uFF09\u3002\n");return 0}if(opts.drain)return drainLoops(targets,{out,err,request});for(const t of targets){const result=request(t.lockDir,"stop",t.pid);t.requested=
|
|
387
335
|
result.ok;if(!result.ok){err(`\u26A0\uFE0F pid=${t.pid} \u3078\u505C\u6B62\u8981\u6C42\u3092\u66F8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${result.reason}\uFF09: ${safe(t.dir)}
|