@tocca-systems/twp-cli 0.70.0 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.public.md +20 -0
  2. package/README.md +55 -5
  3. package/dist/{agent-SFX3ZVOB.js → agent-C37HJDJY.js} +1 -1
  4. package/dist/{agent-loop-6JO4PJRG.js → agent-loop-XFYCEK5S.js} +32 -17
  5. package/dist/{ai-dispatch-H7OOHHKO.js → ai-dispatch-GONY4JAY.js} +2 -2
  6. package/dist/{analysis-HMOECNWG.js → analysis-THRX37XW.js} +2 -2
  7. package/dist/{announcement-Q642UMYK.js → announcement-4R7XFO5W.js} +1 -1
  8. package/dist/{api-command-OJWUGQKF.js → api-command-YMEYR2LG.js} +3 -3
  9. package/dist/{app-DT4HVGYU.js → app-37IMKCQZ.js} +4 -4
  10. package/dist/{attendance-correct-DWVFYL2Y.js → attendance-correct-Z5BGCSCL.js} +1 -1
  11. package/dist/{attendance-lists-772Y3ZWA.js → attendance-lists-357A3O5Y.js} +1 -1
  12. package/dist/{backlog-FG3Y5JTE.js → backlog-KF63TCEG.js} +1 -1
  13. package/dist/{budget-5RPOQZN7.js → budget-W7JXDJ4J.js} +1 -1
  14. package/dist/{capacity-report-command-PBE73I43.js → capacity-report-command-QSV3A6EX.js} +1 -1
  15. package/dist/charter-command-A4MFFBGE.js +3 -0
  16. package/dist/{chunk-QJAZLPA3.js → chunk-2CIQOXPK.js} +1 -1
  17. package/dist/chunk-35MQ27I6.js +4 -0
  18. package/dist/{chunk-NVMJXFBT.js → chunk-45OL54MY.js} +1 -1
  19. package/dist/chunk-5KAWCLYN.js +16 -0
  20. package/dist/chunk-5VZ54H2J.js +11 -0
  21. package/dist/{chunk-WBUYPDJH.js → chunk-A3FJEUDB.js} +1 -1
  22. package/dist/{chunk-GLKZ4ZZY.js → chunk-ARB4QFWO.js} +1 -1
  23. package/dist/{chunk-WMEGP2BT.js → chunk-BBOWZVCC.js} +1 -1
  24. package/dist/{chunk-W2AIT5FJ.js → chunk-BYUV3D5Z.js} +2 -2
  25. package/dist/chunk-CCHPF23L.js +31 -0
  26. package/dist/{chunk-7EJOKJLV.js → chunk-DAXVAUV4.js} +1 -1
  27. package/dist/{chunk-JIGA6KKU.js → chunk-DFHOCPA5.js} +9 -8
  28. package/dist/{chunk-EDBJQCNC.js → chunk-DPIJF3EN.js} +1 -1
  29. package/dist/{chunk-APPYZQNC.js → chunk-IVKWLJCY.js} +1 -1
  30. package/dist/{chunk-DAOC7VRM.js → chunk-K4JE26L6.js} +1 -1
  31. package/dist/{charter-command-LIX2JXRJ.js → chunk-LH4AZKLT.js} +1 -1
  32. package/dist/{chunk-XGYOJHZC.js → chunk-MP6YIILX.js} +1 -1
  33. package/dist/{chunk-HNG6MF26.js → chunk-MVZFZAT4.js} +69 -65
  34. package/dist/{chunk-RRHAX7RK.js → chunk-MYBIPHZ7.js} +1 -1
  35. package/dist/{chunk-X6L5LUC4.js → chunk-NBOA4T7F.js} +1 -1
  36. package/dist/{chunk-6PAZUW73.js → chunk-QS5VWTI3.js} +1 -1
  37. package/dist/{chunk-HBEOI456.js → chunk-QVID3GT4.js} +1 -1
  38. package/dist/chunk-T3C2BAVA.js +49 -0
  39. package/dist/chunk-TTST7UDR.js +20 -0
  40. package/dist/{chunk-XCPZ4R65.js → chunk-UGDB4QTS.js} +1 -1
  41. package/dist/{chunk-CCBNU5Y3.js → chunk-UXEYWMPO.js} +9 -8
  42. package/dist/{chunk-F4PGPJOI.js → chunk-VEA72AKG.js} +1 -1
  43. package/dist/{chunk-G4TZFGNN.js → chunk-VYDPW2YO.js} +2 -19
  44. package/dist/{chunk-P6M2MCZJ.js → chunk-WYYHMKF7.js} +2 -2
  45. package/dist/{chunk-OMWCSE4P.js → chunk-XF4DN44V.js} +2 -2
  46. package/dist/{chunk-LJVAOWZI.js → chunk-XMPHGOW4.js} +4 -32
  47. package/dist/{chunk-P2DSHLHD.js → chunk-Z6T5M3NJ.js} +2 -2
  48. package/dist/cli.js +35 -9
  49. package/dist/{commands-4C6TJ4WG.js → commands-GMUQCBFQ.js} +1 -1
  50. package/dist/{commands-MTH5LEV7.js → commands-MYGPEYBE.js} +111 -102
  51. package/dist/{company-4DHVAW25.js → company-W2OBOOKJ.js} +2 -2
  52. package/dist/{completion-JDD3SNUO.js → completion-EMY4WDII.js} +3 -3
  53. package/dist/{contract-PT7VW4IE.js → contract-LTQVLI7A.js} +2 -2
  54. package/dist/{department-C6WIZPBS.js → department-GZBKUFON.js} +1 -1
  55. package/dist/{deposit-OEYFPEZG.js → deposit-HCMV2MBU.js} +1 -1
  56. package/dist/domain-knowledge-32TTPFVY.js +79 -0
  57. package/dist/{estimate-4BUJQ3TP.js → estimate-ILUXZJG3.js} +3 -3
  58. package/dist/{evaluation-GLXQ54F6.js → evaluation-PE7QHATW.js} +1 -1
  59. package/dist/{expense-QE3WIJTN.js → expense-K2JPBP2M.js} +1 -1
  60. package/dist/{fiscal-year-YJWFQN4P.js → fiscal-year-XY4KA67D.js} +1 -1
  61. package/dist/{inquiry-ORB3ROAJ.js → inquiry-FEQWFU7Z.js} +1 -1
  62. package/dist/{invoice-XLX5KS2T.js → invoice-WOQZUL66.js} +2 -2
  63. package/dist/{job-title-UDF6I3BP.js → job-title-CDAMB4Q2.js} +1 -1
  64. package/dist/{knowledge-GB6IFUMG.js → knowledge-VM6P4XDQ.js} +78 -48
  65. package/dist/{leave-3BJMXI7Q.js → leave-TEXQJURZ.js} +2 -2
  66. package/dist/{license-OMIZUUTW.js → license-ZSZM5OSK.js} +1 -1
  67. package/dist/{logout-guard-2Y7HPIKN.js → logout-guard-3B767ADS.js} +2 -2
  68. package/dist/{media-HJDG3QWD.js → media-TAS7FF5K.js} +3 -3
  69. package/dist/{notification-2IESSY5E.js → notification-T46TUUMO.js} +1 -1
  70. package/dist/{oneshot-4XO5HIJR.js → oneshot-XRN744YK.js} +1 -1
  71. package/dist/plan-submit-YBTGYQD7.js +4 -0
  72. package/dist/{position-CR6P4WC5.js → position-BKZQH6A3.js} +1 -1
  73. package/dist/{project-JJEMEO2W.js → project-KL4DH2XE.js} +1 -1
  74. package/dist/{prospect-QG6X7ALK.js → prospect-BEB5AXPM.js} +2 -2
  75. package/dist/{purchase-Z6ENEOZM.js → purchase-P37K6MVO.js} +3 -3
  76. package/dist/{receivable-ZBDXXMHX.js → receivable-5N3KL3L4.js} +1 -1
  77. package/dist/{redmine-EIFHMLNE.js → redmine-K7A7AEUA.js} +1 -1
  78. package/dist/{registry-DWIGRC5S.js → registry-GGKX3MCP.js} +1 -1
  79. package/dist/{report-TTXGXSR3.js → report-PZ4GMMK2.js} +1 -1
  80. package/dist/{revision-command-TYBPPUAF.js → revision-command-KT7NMRES.js} +1 -1
  81. package/dist/{run-36UF6SY5.js → run-65IJLMKQ.js} +2 -2
  82. package/dist/{sales-ai-review-6TDJFHDL.js → sales-ai-review-NBNSHUUP.js} +1 -1
  83. package/dist/{sales-master-H5HMVBJV.js → sales-master-23PVQUTQ.js} +2 -2
  84. package/dist/{sales-numbering-Q5KRM63Y.js → sales-numbering-FQ7YPQME.js} +1 -1
  85. package/dist/{schedule-command-2HCOGYJW.js → schedule-command-RVKP6QQS.js} +1 -1
  86. package/dist/search-NYY22NHK.js +29 -0
  87. package/dist/{segment-YOUY4PZC.js → segment-2C3MYZCV.js} +1 -1
  88. package/dist/server-settings-ELHHMBBK.js +4 -0
  89. package/dist/{server-skills-4XYTHPN3.js → server-skills-EEPBSOPO.js} +1 -1
  90. package/dist/{setup-HHPKB6N4.js → setup-74LO2SXN.js} +2 -2
  91. package/dist/{skill-RH5MBRXZ.js → skill-RKCTUJHW.js} +1 -1
  92. package/dist/skill-check-2ILLHGDQ.js +29 -0
  93. package/dist/skill-command-4VMZ2H6A.js +3 -0
  94. package/dist/{skill-manage-command-S2RLIHTA.js → skill-manage-command-HPJQOTQK.js} +1 -1
  95. package/dist/{supplier-payment-EJTFKAKY.js → supplier-payment-G2BGSGLA.js} +2 -2
  96. package/dist/{support-FR3KY63E.js → support-E3PBMVG4.js} +1 -1
  97. package/dist/{task-O7K6725Y.js → task-N6OVWNAT.js} +2 -2
  98. package/dist/{user-PRGHG3HM.js → user-VODWJQZI.js} +2 -2
  99. package/dist/{user-contract-type-K7CLKCEE.js → user-contract-type-7AVII6SV.js} +1 -1
  100. package/dist/{worker-agent-WDYZTQ5C.js → worker-agent-KRMY2RKK.js} +1 -1
  101. package/dist/{workflow-S25JXGWN.js → workflow-GWEN7NSQ.js} +1 -1
  102. package/package.json +1 -1
  103. package/dist/chunk-D5EYI7S3.js +0 -48
  104. package/dist/chunk-KDH3KWPO.js +0 -4
  105. package/dist/chunk-S7IEZSPJ.js +0 -11
  106. package/dist/chunk-SPZ3GBYC.js +0 -16
  107. package/dist/plan-submit-T5KHXNGH.js +0 -4
  108. package/dist/search-GRAWP2LX.js +0 -26
  109. package/dist/server-settings-LJBDUOTV.js +0 -4
  110. package/dist/skill-command-4V2GT73D.js +0 -3
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-W2AIT5FJ.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-X6L5LUC4.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-P6M2MCZJ.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-EDBJQCNC.js";
5
- import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import"./chunk-RRHAX7RK.js";import"./chunk-A4LFG7MW.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,stepToItem,zeroTargetDropReasons}from"./chunk-6PAZUW73.js";import"./chunk-DXUFECE7.js";
6
- import{AgentLoopApi,describeError,filterByStatus,isPermanent,pick,pickString}from"./chunk-SPZ3GBYC.js";import{buildLoopConfig,describeOperations,evaluateOwnership,evaluatePlanGate,exportStateDirEnv,loopStateDir,planGateStatePath,recordPlanned}from"./chunk-LJVAOWZI.js";import{CapacityReporter,formatHookIds,formatHookWiring,runHook,runPrefetch,runPreflight}from"./chunk-G4TZFGNN.js";import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,spawnSyncResolved}from"./chunk-FABDZBDZ.js";
7
- import{setSkillPrefix,skillCommand,skillFromPrompt,stripSkillCommand}from"./chunk-6CS5L24D.js";import{killProcessTree}from"./chunk-N2UVRM3Z.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";
8
- import{httpFetch}from"./chunk-J7QYPKVK.js";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(
3
+ import{ScheduleApi,collectDue,gateStatus,nowInZone,parseCounts,promptSection}from"./chunk-BYUV3D5Z.js";import{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{LoopSettingsApplier,renderStepBudget}from"./chunk-NBOA4T7F.js";import{NO_PLAN_SESSION,RECENT_ADVANCE_WINDOW_HOURS,ReleaseOutcomeLog,buildDynamicBlocks,buildRecentCandidateIndex,createItem,enqueueBlockerRecovery,enqueueDevVerifyForMerged,enqueueReleasePartialMergeRerun,enqueueReleasePhase5Recovery,
4
+ fileSkillNames,findRecentCandidate,formatInflightEntry,formatPlanResultLine,formatRecentAdvance,inflightEntries,inflightStaleHours,openPlanSession,parseOutcomeCode,parseReleaseResult,parseTaskStatusSnapshot,pendingTaskKeys,resolveRecentAdvance,shouldSuppressForStatus,staleFloorHours,unavailableChecks,windowStartMicros}from"./chunk-WYYHMKF7.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";
5
+ import{ServerSkillCatalog,formatSkillOrigins}from"./chunk-DPIJF3EN.js";import"./chunk-MYBIPHZ7.js";import"./chunk-A4LFG7MW.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-5SONMN6K.js";import"./chunk-VRBI2NPI.js";import{duplicateTaskKeyDropReason,excludedKeyInArgs,extractPlanJson,parseOpsCount,parsePlanExcludeKeys,placeholderTaskKey,releaseDeployDropReason,stepToItem,zeroTargetDropReasons}from"./chunk-QS5VWTI3.js";import"./chunk-DXUFECE7.js";import{
6
+ buildLoopConfig,evaluateOwnership,exportStateDirEnv,localConfigPath,loopStateDir}from"./chunk-CCHPF23L.js";import{describeOperations,evaluatePlanGate,planGateStatePath,recordPlanned}from"./chunk-XMPHGOW4.js";import{CapacityReporter}from"./chunk-VYDPW2YO.js";import{formatHookIds,formatHookWiring,runHook,runPrefetch,runPreflight}from"./chunk-TTST7UDR.js";import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,spawnSyncResolved}from"./chunk-FABDZBDZ.js";
7
+ import{setSkillPrefix,skillCommand,skillFromPrompt,stripSkillCommand}from"./chunk-6CS5L24D.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{AgentLoopApi,describeError,filterByStatus,isPermanent,pick,pickString}from"./chunk-5KAWCLYN.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";
8
+ import"./chunk-VFPY2A23.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{AuthSession}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import{effectiveApiUrl,resolveProfile}from"./chunk-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(
9
9
  message)}
10
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,
11
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\
@@ -70,8 +70,8 @@ return"skip"}if(!waited){waited=true;firstFinished=pickString(res.json,"state.pl
70
70
  planLockWaitMaxSec}\u79D2\uFF09\u306B\u9054\u3057\u307E\u3057\u305F \u2192 **\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306E\u8A08\u753B\u3092\u8AE6\u3081\u3066\u30C7\u30AD\u30E5\u30FC\u3078\u9032\u307F\u307E\u3059**\uFF08${describeOwner(res.json)}\uFF09`);return"skip"}if(await this.deps.hasPendingItems()){log.log(" \u25B6\uFE0F \u5F85\u6A5F\u4E2D\u306B\u30AD\u30E5\u30FC\u3078\u30A2\u30A4\u30C6\u30E0\u304C\u7A4D\u307E\u308C\u307E\u3057\u305F \u2192 \u8A08\u753B\u3092\u3084\u3081\u3066\u30C7\u30AD\u30E5\u30FC\u3078\u9032\u307F\u307E\u3059");
71
71
  return"not-needed"}const expires=pickString(res.json,"state.plan_lock_expires_at");const live=pickString(res.json,"state.owner_is_live");const expired=expires!==""&&Date.parse(expires)<this.now();if(stealAttempts<config.planLockStealAttempts&&(live==="false"||expired)){stealAttempts+=1;log.log(` \u26A1 \u6240\u6709\u8005\u304C\u5FDC\u7B54\u306A\u3057\u3001\u307E\u305F\u306F\u671F\u9650\u5207\u308C\u3067\u3059 \u2192 \u596A\u53D6\u3092\u8A66\u307F\u307E\u3059\uFF08${stealAttempts}/${config.planLockStealAttempts}\
72
72
  \u56DE\u76EE\uFF09`);continue}await this.sleep(config.planLockPollIntervalSec*1e3)}}async alreadyPlannedByOther(){if(this.ownLastFinish==="")return false;const res=await this.deps.api.request("GET","/state");if(!res.ok)return false;const lastResult=pickString(res.json,"state.last_plan_result");const finished=pickString(res.json,"state.plan_finished_at");if(lastResult!=="completed"||!finished||finished===this.ownLastFinish)return false;this.deps.log.log(` \u2139\uFE0F \u81EA\u5206\u304C\u7E54\u308A\u8FBC\u307F\u6E08\u307F\u306E\u5B8C\u4E86\uFF08${this.
73
- ownLastFinish}\uFF09\u3088\u308A\u65B0\u3057\u3044\u8A08\u753B\u5B8C\u4E86\u304C\u3042\u308A\u307E\u3059\uFF08finished_at=${finished}\uFF09`);this.deps.log.log(" \u2192 \u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u8A08\u753B\u6E08\u307F\u3002\u30ED\u30C3\u30AF\u3092\u53D6\u3089\u305A\u306B\u30C7\u30AD\u30E5\u30FC\u3078\u9032\u307F\u307E\u3059");this.ownLastFinish=finished;return true}async release(result){if(!this.held)return;await this.stopRenewWorker();this.held=false;const res=await this.deps.
74
- api.planFinish(this.deps.config.runnerId,this.deps.config.runId,this.startedAt,result);if(res.ok){const finish=pickString(res.json,"state.plan_finished_at");if(finish)this.ownLastFinish=finish;this.deps.log.log(` \u{1F513} \u8A08\u753B\u30ED\u30C3\u30AF\u3092\u89E3\u653E\u3057\u307E\u3057\u305F\uFF08result=${result}\u30FBreason=${pickString(res.json,"reason")}\uFF09`)}else if(res.status===409){this.deps.log.log(` \u26A0\uFE0F \u8A08\u753B\u30ED\u30C3\u30AF\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\uFF08\u307E\u305F\u306F\u5225\u306E\u7372\u5F97\uFF09\u3078\u79FB\u3063\u3066\u3044\u307E\u3057\u305F\u3002result=${result}\
73
+ ownLastFinish}\uFF09\u3088\u308A\u65B0\u3057\u3044\u8A08\u753B\u5B8C\u4E86\u304C\u3042\u308A\u307E\u3059\uFF08finished_at=${finished}\uFF09`);this.deps.log.log(" \u2192 \u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u8A08\u753B\u6E08\u307F\u3002\u30ED\u30C3\u30AF\u3092\u53D6\u3089\u305A\u306B\u30C7\u30AD\u30E5\u30FC\u3078\u9032\u307F\u307E\u3059");this.ownLastFinish=finished;return true}async release(result,record){if(!this.held)return;await this.stopRenewWorker();this.held=false;const res=await this.
74
+ deps.api.planFinish(this.deps.config.runnerId,this.deps.config.runId,this.startedAt,result,record);if(res.ok){const finish=pickString(res.json,"state.plan_finished_at");if(finish)this.ownLastFinish=finish;this.deps.log.log(` \u{1F513} \u8A08\u753B\u30ED\u30C3\u30AF\u3092\u89E3\u653E\u3057\u307E\u3057\u305F\uFF08result=${result}\u30FBreason=${pickString(res.json,"reason")}\uFF09`)}else if(res.status===409){this.deps.log.log(` \u26A0\uFE0F \u8A08\u753B\u30ED\u30C3\u30AF\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\uFF08\u307E\u305F\u306F\u5225\u306E\u7372\u5F97\uFF09\u3078\u79FB\u3063\u3066\u3044\u307E\u3057\u305F\u3002result=${result}\
75
75
  \u306F\u8A18\u9332\u3055\u308C\u307E\u305B\u3093`)}else{this.deps.log.log(` \u26A0\uFE0F \u8A08\u753B\u30ED\u30C3\u30AF\u306E\u89E3\u653E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002\u671F\u9650\uFF08${this.deps.config.planLockTtlSec}\u79D2\uFF09\u7D4C\u904E\u5F8C\u306B\u4ED6\u6A5F\u304C\u596A\u53D6\u3057\u3066\u56DE\u5FA9\u3057\u307E\u3059`)}this.startedAt=""}startRenewWorker(){if(!this.held||this.renewStopped===false)return;this.renewStopped=false;this.scheduleRenew()}scheduleRenew(){
76
76
  if(this.renewStopped)return;this.renewTimer=setTimeout(()=>{this.renewTimer=null;this.renewInFlight=this.renewOnce().catch(()=>void 0).finally(()=>{this.renewInFlight=null;this.scheduleRenew()})},this.renewIntervalSec*1e3);this.renewTimer.unref?.()}async stopRenewWorker(){this.renewStopped=true;if(this.renewTimer){clearTimeout(this.renewTimer);this.renewTimer=null}if(this.renewInFlight)await this.renewInFlight}async renewOnce(){const{api,config}=this.deps;const res=await api.planStart(config.runnerId,
77
77
  config.runId);if(!res.ok){if(res.status===409){this.lostReason="runner_not_registered";this.renewStopped=true}return}const reason=pickString(res.json,"reason");if(pickString(res.json,"acquired")==="true"){this.tuneRenewInterval(pickString(res.json,"state.plan_lock_expires_at"));const token=pickString(res.json,"state.plan_started_at");if(token&&token!==this.startedAt){this.deps.log.log(` \u2139\uFE0F \u8A08\u753B\u4E2D\u306B\u30ED\u30C3\u30AF\u3092\u53D6\u308A\u76F4\u3057\u3066\u3044\u307E\u3057\u305F\uFF08\u30C8\u30FC\u30AF\u30F3\u66F4\u65B0: ${this.
@@ -79,11 +79,33 @@ startedAt} \u2192 ${token}\uFF09`);this.startedAt=token}if(reason!=="renewed")th
79
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`);
80
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.
81
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\
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.
82
+ e.plan_started_at")||"\u4E0D\u660E"}`,`\u671F\u9650=${pickString(json,"state.plan_lock_expires_at")||"\u4E0D\u660E"}`,`\u6B7B\u6D3B=${liveText}`].join(" ")}import fs4 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) ...
83
+ ${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)&&
84
+ 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(
85
+ 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===
86
+ 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){
87
+ 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(
88
+ 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.
89
+ 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.
90
+ 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**");
91
+ 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(`\
92
+ \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\
93
+ \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{fs4.mkdirSync(dir,{recursive:true,mode:448});
94
+ if(process.platform!=="win32")fs4.chmodSync(dir,448);fs4.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=fs4.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`);
95
+ 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-fs4.statSync(file).mtimeMs)/864e5;if(ageDays>this.config.writebackMaxAgeDays){fs4.rmSync(file,{force:true});this.log.log(` \u26D4 \u9000\
96
+ \u907F\u304B\u3089 ${this.config.writebackMaxAgeDays} \u65E5\u3092\u8D85\u3048\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);continue}}catch{continue}let payload;try{payload=JSON.parse(fs4.readFileSync(file,"utf8"))}catch{fs4.rmSync(file,{force:true});this.log.log(` \u26A0\uFE0F \u9000\u907F\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u3081\u306A\u304B\u3063\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);continue}const{run_id:runId,...rest}=payload;const res=await this.
97
+ api.update(itemId,rest,runId||this.config.runId);if(res.ok){fs4.rmSync(file,{force:true});this.log.log(` \u2705 \u5B9F\u884C\u7D50\u679C\u3092\u518D\u9001\u3057\u307E\u3057\u305F: item=${itemId}\uFF08status=${payload.status}\uFF09`);if(payload.status==="completed")recorded.push(itemId)}else if(res.status===409){fs4.rmSync(file,{force:true});this.log.log(` \u26A0\uFE0F \u518D\u9001\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08409\u30FB\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC/\u5225\u306E run \u304C\u4FDD\u6301\uFF09: item=${itemId}\
98
+ \u2192 \u7D50\u679C\u306F\u7834\u68C4\u3057\u307E\u3059`)}else if(res.status!==null&&res.status>=400&&res.status<500&&res.status!==408&&res.status!==429){fs4.rmSync(file,{force:true});this.log.log(` \u26D4 \u30B5\u30FC\u30D0\u306B\u6052\u4E45\u7684\u306B\u62D2\u5426\u3055\u308C\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3059\uFF08http=${res.status}\uFF09: item=${itemId}`)}else{this.log.log(` \u26A0\uFE0F \u518D\u9001\u306B\u5931\u6557\uFF08${describeError(res)}\uFF09: item=${itemId}\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\
99
+ \u884C\u3057\u307E\u3059`)}}return recorded}};var PLAN_SUPPRESS_REASONS={"step \u306E\u5F62\u304C\u4E0D\u6B63":"invalid_step","\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0":"placeholder_key","release-deploy \u306E\u7A7A\u632F\u308A\u9632\u6B62":"release_deploy_guard","\u5BFE\u8C610\u4EF6":"zero_target","\u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D":"inflight","\u65E2\u306B\u30AD\u30E5\u30FC\u5F85\u3061":"already_pending","\u540C\u4E00\u8A08\u753B\u5185\u306E\u91CD\u8907\u30AD\u30FC":"duplicate_in_\
100
+ plan","\u4EBA\u306B\u30DC\u30FC\u30EB\u304C\u3042\u308B":"human_ball","\u524D\u56DE\u304C\u72B6\u614B\u3092\u9032\u3081\u305F":"recently_advanced","\u6642\u9593\u5E2F\u30B2\u30FC\u30C8":"schedule_gate","\u8A08\u753B\u30ED\u30C3\u30AF\u55AA\u5931\u3067\u672A\u51E6\u7406":"lock_lost","\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C":"exclusive_skill"};var ENQUEUE_ERROR_PREFIX="\u6295\u5165\u30A8\u30E9\u30FC: ";var MAX_STEPS=100;var MAX_SCHEDULED=100;var MAX_CONTRACT_LINES=20;
101
+ var MAX_CONTRACT_LINE_CHARS=1e3;var MAX_LABEL_CHARS=300;var MAX_DETAIL_CHARS=500;var MAX_TASK_KEY_CHARS=64;function clip(value,max){const s=(value??"").trim();return s===""?null:s.slice(0,max)}function dropToStep(drop){const base={task_key:clip(drop.task_key,MAX_TASK_KEY_CHARS),label:clip(drop.skill,MAX_LABEL_CHARS),item_id:null};if(drop.reason.startsWith(ENQUEUE_ERROR_PREFIX)){return{...base,outcome:"error",reason:"enqueue_error",detail:clip(drop.reason.slice(ENQUEUE_ERROR_PREFIX.length),MAX_DETAIL_CHARS)}}
102
+ const code=PLAN_SUPPRESS_REASONS[drop.reason];return{...base,outcome:"suppressed",reason:code??"other",detail:code===void 0?clip(drop.reason,MAX_DETAIL_CHARS):null}}function extractContractLines(output){const lines=[...output.matchAll(/^.*\b[A-Z][A-Z0-9_]*_RESULT:.*$/gm)].map(m=>m[0].trim().slice(0,MAX_CONTRACT_LINE_CHARS)).filter(l=>l!=="");return lines.slice(-MAX_CONTRACT_LINES)}function standaloneRecord(result,scheduled){return{result,ai_type:null,ai_model:null,cost_usd:null,tokens_in:null,tokens_out:null,
103
+ turns:null,duration_ms:null,final_report:null,contract_lines:[],steps:[],scheduled:scheduled.slice(0,MAX_SCHEDULED)}}function planRecord(input){const{engine,summary}=input;const metrics=engine?.metrics;const steps=[...input.enqueuedSteps.map(s=>({outcome:"enqueued",task_key:clip(s.task_key,MAX_TASK_KEY_CHARS),label:clip(s.label,MAX_LABEL_CHARS),item_id:s.item_id,reason:null,detail:null})),...(summary?.dropped??[]).map(dropToStep)];const output=engine?.output??"";return{result:input.result,ai_type:engine?.
104
+ serverAiType??null,ai_model:null,cost_usd:metrics?.costUsd??null,tokens_in:metrics?.tokensIn??null,tokens_out:metrics?.tokensOut??null,turns:metrics?.turns??null,duration_ms:input.durationMs===null?null:Math.max(0,Math.trunc(input.durationMs)),final_report:output.trim()===""?null:truncateResult(output),contract_lines:extractContractLines(output),steps:steps.slice(0,MAX_STEPS),scheduled:input.scheduled.slice(0,MAX_SCHEDULED)}}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.
83
105
  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(
84
106
  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?.
85
107
  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.
108
+ 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 fs5 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.
87
109
  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.
88
110
  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.
89
111
  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.
@@ -95,29 +117,12 @@ message}\uFF09`);return{allowed:true,reason:""}}return gateStatus(skill,this.now
95
117
  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\
96
118
  \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\
97
119
  \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(
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) ...
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)&&
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(
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===
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){
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(
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.
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.
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**");
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(`\
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\
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\
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";
120
+ cfg.config,this.now(),"error"in hist?[]:hist.rows,lines,!("error"in hist))}};function readEnqueuedLines(file){if(!file)return[];let text;try{text=fs5.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`}}
121
+ 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`}}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";
117
122
  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.
118
123
  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.
119
124
  engine=deps.engine;this.releaseLog=new ReleaseOutcomeLog(deps.config.releaseOutcomeLogPath);this.postDeps={api:deps.api,config:deps.config,log:deps.log,releaseLog:this.releaseLog};this.planLock=new PlanLock({api:deps.api,config:deps.config,log:deps.log,runner:deps.runner,hasPendingItems:async()=>await this.hasPendingItems()&&!this.nothingClaimableBacklog,reregister:async()=>{deps.runner.registered=false;await deps.runner.registerOrThrow()},...deps.sleepFn?{sleepFn:deps.sleepFn}:{}});this.trustGate=
120
- deps.trustGate??new TrustGate({enabled:()=>deps.config.ai.usesAi("claude"),check:()=>checkWorkspaceTrust(deps.config.workspace,{launcherBin:deps.config.claudeLauncher.bin})});this.timestamp=new Date().toISOString().replace(/[-:]/g,"").replace(/\..*$/,"");this.settings=deps.settings??new LoopSettingsApplier({api:deps.api,config:deps.config,log:m=>deps.log.log(m)});this.skills=deps.skills??new ServerSkillCatalog({api:deps.api,config:deps.config,log:m=>deps.log.log(m)})}deps;planGateFingerprint=null;lastPlanWasEmpty=false;writeback;schedule;planLock;engine;releaseLog;postDeps;timestamp;deferredIds=new Set;midcycleEnqueued=0;aborting=false;draining=false;nothingClaimableBacklog=false;drainExitCode=0;drainWaiters=new Set;itemInFlight=null;ownershipLostItemId=null;abortDrained=null;cyclePreflightSection="";trustGate;settings;skills;sleep(ms){
125
+ deps.trustGate??new TrustGate({enabled:()=>deps.config.ai.usesAi("claude"),check:()=>checkWorkspaceTrust(deps.config.workspace,{launcherBin:deps.config.claudeLauncher.bin})});this.timestamp=new Date().toISOString().replace(/[-:]/g,"").replace(/\..*$/,"");this.settings=deps.settings??new LoopSettingsApplier({api:deps.api,config:deps.config,log:m=>deps.log.log(m)});this.skills=deps.skills??new ServerSkillCatalog({api:deps.api,config:deps.config,log:m=>deps.log.log(m)})}deps;planGateFingerprint=null;lastPlanWasEmpty=false;writeback;schedule;planLock;planRunScheduled=[];planRunRecord=null;engine;releaseLog;postDeps;timestamp;deferredIds=new Set;midcycleEnqueued=0;aborting=false;draining=false;nothingClaimableBacklog=false;drainExitCode=0;drainWaiters=new Set;itemInFlight=null;ownershipLostItemId=null;abortDrained=null;cyclePreflightSection="";trustGate;settings;skills;sleep(ms){
121
126
  return(this.deps.sleepFn??sleep)(ms)}sleepUnlessDraining(ms){if(this.draining)return Promise.resolve();return new Promise(resolve=>{let timer=null;let settled=false;const wake=()=>{if(settled)return;settled=true;if(timer!==null)clearTimeout(timer);this.drainWaiters.delete(wake);resolve()};this.drainWaiters.add(wake);const injected=this.deps.sleepFn;if(injected)void injected(ms).then(wake);else timer=setTimeout(wake,ms)})}requestDrain(reason,exitCode=0){if(this.draining)return;this.draining=true;
122
127
  this.drainExitCode=exitCode;const running=this.itemInFlight;const why=reason.trim()===""?"\u7406\u7531\u4E0D\u660E":reason;this.deps.log.log(running===null?`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\uFF09\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u3092\u53D6\u3089\u305A\u306B\u7D42\u4E86\u3057\u307E\u3059\u3002`:`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\
123
128
  \uFF09\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\uFF08${running}\uFF09\u3092\u5B8C\u8D70\u3055\u305B\u3066\u304B\u3089\u7D42\u4E86\u3057\u307E\u3059\u3002`);const waiters=[...this.drainWaiters];this.drainWaiters.clear();for(const w of waiters)w()}cooldownNote(outcome){if(outcome!=="rate-limited")return"";const remaining=this.deps.config.ai.minCooldownRemainingSec();return remaining===null?"":`\uFF08\u6700\u77ED\u306E\u89E3\u9664\u307E\u3067\u7D04${remaining}\u79D2\uFF09`}startOwnershipWatch(itemId){
@@ -134,21 +139,21 @@ const resent=await this.writeback.retryPending();for(const itemId of resent)awai
134
139
  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}
135
140
 
136
141
  ${trust.note}`}if(trust.wait){await runner.beat("waiting");if(cycle<config.maxCycles)await this.sleepUnlessDraining(config.intervalSec*1e3);continue}const pendingListed=await this.hasPendingItems();const hadPending=pendingListed&&!this.nothingClaimableBacklog;if(pendingListed&&!hadPending){log.log("pending \u306F\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u306A\u3044\u3082\u306E\uFF08\u524D\u63D0\u672A\u5145\u8DB3\u30FB\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\uFF09\u3060\u3051\u3067\u3059\uFF08\u524D\u56DE\u306E claim \u306E\u5224\u5B9A\uFF09\u3002\u30AD\u30E5\u30FC\u304C\u7A7A\u306E\u3068\u304D\u3068\u540C\u3058\u304F\u8A08\u753B\u3057\u307E\u3059\u3002")}
137
- this.midcycleEnqueued=0;this.deferredIds=new Set;await this.enqueueDueScheduled(false);const planSkippedDisabled=!hadPending&&(!config.planEnabled||config.operations.planSkill===null);if(hadPending){log.log("\u30AD\u30E5\u30FC\u306Bpending\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u3059\u3002\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u5B9F\u884C\u306B\u9032\u307F\u307E\u3059\u3002")}else if(planSkippedDisabled){log.log(`\u30AD\u30E5\u30FC\u306F\u7A7A\u3067\u3059\u304C\u3001\u3053\u306E\u6A5F\u4F53\u306F\u8A08\u753B\u3092\u7ACB\u3066\u306A\u3044\u8A2D\u5B9A\u3067\u3059\uFF08${config.
142
+ this.midcycleEnqueued=0;this.deferredIds=new Set;this.planRunScheduled=[];await this.enqueueDueScheduled(false);const planSkippedDisabled=!hadPending&&(!config.planEnabled||config.operations.planSkill===null);if(hadPending){log.log("\u30AD\u30E5\u30FC\u306Bpending\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u3059\u3002\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u5B9F\u884C\u306B\u9032\u307F\u307E\u3059\u3002")}else if(planSkippedDisabled){log.log(`\u30AD\u30E5\u30FC\u306F\u7A7A\u3067\u3059\u304C\u3001\u3053\u306E\u6A5F\u4F53\u306F\u8A08\u753B\u3092\u7ACB\u3066\u306A\u3044\u8A2D\u5B9A\u3067\u3059\uFF08${config.
138
143
  planEnabled?"operations.plan_skill \u672A\u8A2D\u5B9A":"plan_enabled=false"}\uFF09\u3002AI \u3092\u8D77\u52D5\u305B\u305A\u30AD\u30E5\u30FC\u306E\u5B9F\u884C\u3078\u9032\u307F\u307E\u3059\u3002`)}else{log.log("\u30AD\u30E5\u30FC\u304C\u7A7A\u3067\u3059\u3002\u8A08\u753B\u3092\u7ACB\u6848\u3057\u3066\u30A8\u30F3\u30AD\u30E5\u30FC\u3057\u307E\u3059\u3002")}if(planSkippedDisabled){}else if(!hadPending&&this.draining){log.log("\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081\u3001\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u5B9F\u884C\u3057\u307E\u305B\u3093\u3002")}else if(!hadPending&&
139
- await this.planGateSaysSkip()){planSkippedNoChange=true;log.log("\u8A08\u753B\u306E AI \u3092\u8D77\u52D5\u305B\u305A\u30AD\u30E5\u30FC\u306E\u5B9F\u884C\u3078\u9032\u307F\u307E\u3059\uFF08\u5165\u529B\u306B\u5909\u5316\u306A\u3057\uFF09\u3002")}else if(!hadPending){const acquired=await this.planLock.acquire();if(acquired!=="acquired"){planSkippedNoLock=true;log.log("\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u30AD\u30E5\u30FC\u306E\u5B9F\u884C\u3078\u9032\u307F\u307E\u3059\u3002")}else{
140
- await runner.beat("plan");this.planLock.startRenewWorker();let planResult="failed";try{planResult=await this.runPlanAndEnqueue(cycle)}finally{await this.planLock.release(planResult==="ok"?"completed":"failed");this.planLock.reportIfLost()}if(planResult==="ok"&&this.lastPlanWasEmpty)this.recordPlanGateFingerprint();if(planResult==="aborted"){log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");
141
- break}if(planResult!=="ok"&&isAiUnavailable(planResult)){undeterminedStreak=0;if(needsHumanToRestoreAi(planResult)){noProgressStreak+=1;unavailableStreak+=1;log.log(`\u26D4 ${aiUnavailableLabel(planResult)}\u305F\u3081\u8A08\u753B\u3067\u304D\u307E\u305B\u3093 (\u9023\u7D9A: ${unavailableStreak})`);log.log(` ${AI_RECOVERY_HINT}`);if(unavailableStreak>=3){exitCode=1;log.log("\u26D4 AI \u30921\u3064\u3082\u8D77\u52D5\u3067\u304D\u306A\u3044\u72B6\u614B\u304C\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C91\uFF09");
142
- log.log(" **\u518D\u30ED\u30B0\u30A4\u30F3\uFF0F\u30C8\u30FC\u30AF\u30F3\u6295\u5165\u307E\u3067\u518D\u8D77\u52D5\u3057\u3066\u3082\u540C\u3058\u7D50\u679C\u306B\u306A\u308A\u307E\u3059**");break}}else{unavailableStreak=0;log.log(`\u26A0\uFE0F ${aiUnavailableLabel(planResult)}\u3067\u8A08\u753B\u3067\u304D\u307E\u305B\u3093${this.cooldownNote(planResult)}\uFF08\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}
143
- if(cycle<config.maxCycles){await runner.beat("waiting");await this.sleepUnlessDraining(config.intervalSec*1e3)}continue}if(planResult!=="ok"){log.log("\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u304C\u5931\u6557\u3057\u307E\u3057\u305F");if(config.daemon){log.log(`\u30C7\u30FC\u30E2\u30F3\u30E2\u30FC\u30C9\u306E\u305F\u3081 ${config.intervalSec}\u79D2\u5F8C\u306B\u30EA\u30C8\u30E9\u30A4...`);await runner.beat("waiting");await this.sleepUnlessDraining(config.intervalSec*1e3);continue}break}}}const outcome=await this.
144
- runDequeueLoop(cycle);if(outcome.stop){log.log(this.aborting?"\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002":this.draining?`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u5B8C\u8D70\u6E08\u307F\u30FB\u7D42\u4E86\u30B3\u30FC\u30C9 ${this.drainExitCode}\uFF09\u3002`:"/stop \u30B3\u30DE\u30F3\u30C9\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");
145
- if(this.draining)exitCode=this.drainExitCode;break}unavailableStreak=outcome.unexecuted>0&&outcome.needsHuman?unavailableStreak+1:0;if(outcome.progress){noProgressStreak=0;undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u9032\u6357\u3042\u308A`)}else if(outcome.unexecuted>0&&outcome.needsHuman){undeterminedStreak=0;noProgressStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: AI \u30921\u3064\u3082\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${outcome.unexecuted}\
146
- \u4EF6\u3092\u30AD\u30E5\u30FC\u3078\u8FD4\u5374\u30FB\u9023\u7D9A: ${noProgressStreak}\uFF09`);log.log(` ${AI_RECOVERY_HINT}`)}else if(outcome.unexecuted>0){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: AI \u5074\u306E\u90FD\u5408\u3067 ${outcome.unexecuted}\u4EF6\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F${this.cooldownNote("rate-limited")}\uFF08\u30AD\u30E5\u30FC\u3078\u8FD4\u5374\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.
147
- deferred>0){log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3067\u5F85\u6A5F\u4E2D\uFF08${outcome.deferred}\u4EF6\u3092\u5F8C\u56DE\u3057\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.emptyQueue&&planSkippedDisabled){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u8A08\u753B\u3092\u7ACB\u3066\u306A\u3044\u8A2D\u5B9A\u3067\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.
148
- emptyQueue&&planSkippedNoChange){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3044\u305F\u3081\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3001\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.emptyQueue&&planSkippedNoLock){undeterminedStreak=0;if(this.planLock.permanentFail&&this.planLock.failStreak>=config.planLockPermanentMax){
149
- noProgressStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u8A08\u753B\u30ED\u30C3\u30AF\u306E\u53D6\u5F97\u304C\u6052\u4E45\u30A8\u30E9\u30FC\uFF084xx\uFF09\u3067 ${this.planLock.failStreak}\u30B5\u30A4\u30AF\u30EB\u9023\u7D9A\u3057\u3066\u3044\u307E\u3059`);log.log(` **\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u306A\u3044\u305F\u3081\u3001\u9032\u6357\u306A\u3057\u3068\u3057\u3066\u6570\u3048\u307E\u3059** (\u9023\u7D9A: ${noProgressStreak})`)}else{log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}\
150
- : \u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3001\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}}else if(outcome.undetermined){undeterminedStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u30AD\u30E5\u30FC\u306E\u72B6\u614B\u3092\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${undeterminedStreak}\u30B5\u30A4\u30AF\u30EB\u9023\u7D9A\u30FB\u9032\u6357\u306A\u3057\u306B\u306F\u6570\u3048\u306A\u3044\uFF09`);
151
- if(undeterminedStreak>=config.queueUndeterminedMax){log.log(`\u26D4 claim API\u306E\u969C\u5BB3\u304C ${undeterminedStreak} \u30B5\u30A4\u30AF\u30EB\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C91\uFF09`);log.log(" \u78BA\u8A8D: API\u306E\u758E\u901A\uFF0F\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\uFF0F--project \u306E\u6307\u5B9A\u3002\u5FA9\u65E7\u5F8C\u306B\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044");
144
+ await this.planGateSaysSkip()){planSkippedNoChange=true;log.log("\u8A08\u753B\u306E AI \u3092\u8D77\u52D5\u305B\u305A\u30AD\u30E5\u30FC\u306E\u5B9F\u884C\u3078\u9032\u307F\u307E\u3059\uFF08\u5165\u529B\u306B\u5909\u5316\u306A\u3057\uFF09\u3002");await this.recordStandalonePlanRun("gated")}else if(!hadPending){const acquired=await this.planLock.acquire();if(acquired!=="acquired"){planSkippedNoLock=true;log.log("\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u30AD\u30E5\u30FC\u306E\u5B9F\u884C\u3078\u9032\u307F\u307E\u3059\u3002");
145
+ await this.recordStandalonePlanRun(acquired==="not-needed"?"skipped":"locked")}else{await runner.beat("plan");this.planLock.startRenewWorker();let planResult="failed";this.planRunRecord=null;try{planResult=await this.runPlanAndEnqueue(cycle)}finally{const record=this.planRunRecord??planRecord({result:"error",engine:null,durationMs:null,summary:null,enqueuedSteps:[],scheduled:this.planRunScheduled});await this.planLock.release(planResult==="ok"?"completed":"failed",{...record});this.planLock.reportIfLost()}
146
+ if(planResult==="ok"&&this.lastPlanWasEmpty)this.recordPlanGateFingerprint();if(planResult==="aborted"){log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u3092\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");break}if(planResult!=="ok"&&isAiUnavailable(planResult)){undeterminedStreak=0;if(needsHumanToRestoreAi(planResult)){noProgressStreak+=1;unavailableStreak+=1;log.log(`\u26D4 ${aiUnavailableLabel(
147
+ planResult)}\u305F\u3081\u8A08\u753B\u3067\u304D\u307E\u305B\u3093 (\u9023\u7D9A: ${unavailableStreak})`);log.log(` ${AI_RECOVERY_HINT}`);if(unavailableStreak>=3){exitCode=1;log.log("\u26D4 AI \u30921\u3064\u3082\u8D77\u52D5\u3067\u304D\u306A\u3044\u72B6\u614B\u304C\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C91\uFF09");log.log(" **\u518D\u30ED\u30B0\u30A4\u30F3\uFF0F\u30C8\u30FC\u30AF\u30F3\u6295\u5165\u307E\u3067\u518D\u8D77\u52D5\u3057\u3066\u3082\u540C\u3058\u7D50\u679C\u306B\u306A\u308A\u307E\u3059**");
148
+ break}}else{unavailableStreak=0;log.log(`\u26A0\uFE0F ${aiUnavailableLabel(planResult)}\u3067\u8A08\u753B\u3067\u304D\u307E\u305B\u3093${this.cooldownNote(planResult)}\uFF08\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}if(cycle<config.maxCycles){await runner.beat("waiting");await this.sleepUnlessDraining(config.intervalSec*1e3)}continue}if(planResult!=="ok"){log.log("\u8A08\u753B\u30D5\u30A7\u30FC\u30BA\u304C\u5931\u6557\u3057\u307E\u3057\u305F");
149
+ if(config.daemon){log.log(`\u30C7\u30FC\u30E2\u30F3\u30E2\u30FC\u30C9\u306E\u305F\u3081 ${config.intervalSec}\u79D2\u5F8C\u306B\u30EA\u30C8\u30E9\u30A4...`);await runner.beat("waiting");await this.sleepUnlessDraining(config.intervalSec*1e3);continue}break}}}const outcome=await this.runDequeueLoop(cycle);if(outcome.stop){log.log(this.aborting?"\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002":this.draining?`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u5B9F\u884C\u4E2D\u306E\u30A2\
150
+ \u30A4\u30C6\u30E0\u306F\u5B8C\u8D70\u6E08\u307F\u30FB\u7D42\u4E86\u30B3\u30FC\u30C9 ${this.drainExitCode}\uFF09\u3002`:"/stop \u30B3\u30DE\u30F3\u30C9\u306B\u3088\u308A\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");if(this.draining)exitCode=this.drainExitCode;break}unavailableStreak=outcome.unexecuted>0&&outcome.needsHuman?unavailableStreak+1:0;if(outcome.progress){noProgressStreak=0;undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u9032\u6357\u3042\u308A`)}else if(outcome.
151
+ unexecuted>0&&outcome.needsHuman){undeterminedStreak=0;noProgressStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: AI \u30921\u3064\u3082\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${outcome.unexecuted}\u4EF6\u3092\u30AD\u30E5\u30FC\u3078\u8FD4\u5374\u30FB\u9023\u7D9A: ${noProgressStreak}\uFF09`);log.log(` ${AI_RECOVERY_HINT}`)}else if(outcome.unexecuted>0){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: AI \u5074\u306E\u90FD\u5408\u3067 ${outcome.unexecuted}\
152
+ \u4EF6\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F${this.cooldownNote("rate-limited")}\uFF08\u30AD\u30E5\u30FC\u3078\u8FD4\u5374\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.deferred>0){log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3067\u5F85\u6A5F\u4E2D\uFF08${outcome.deferred}\u4EF6\u3092\u5F8C\u56DE\u3057\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.
153
+ emptyQueue&&planSkippedDisabled){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u8A08\u753B\u3092\u7ACB\u3066\u306A\u3044\u8A2D\u5B9A\u3067\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.emptyQueue&&planSkippedNoChange){undeterminedStreak=0;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u5165\u529B\u306B\u5909\u5316\u304C\u306A\u3044\u305F\u3081\u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3001\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u30FB\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\uFF09`)}else if(outcome.
154
+ emptyQueue&&planSkippedNoLock){undeterminedStreak=0;if(this.planLock.permanentFail&&this.planLock.failStreak>=config.planLockPermanentMax){noProgressStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u8A08\u753B\u30ED\u30C3\u30AF\u306E\u53D6\u5F97\u304C\u6052\u4E45\u30A8\u30E9\u30FC\uFF084xx\uFF09\u3067 ${this.planLock.failStreak}\u30B5\u30A4\u30AF\u30EB\u9023\u7D9A\u3057\u3066\u3044\u307E\u3059`);log.log(` **\u518D\u8A66\u884C\u3067\u306F\u89E3\u6D88\u3057\u306A\u3044\u305F\u3081\u3001\u9032\u6357\u306A\u3057\u3068\u3057\u3066\u6570\u3048\u307E\u3059** (\u9023\u7D9A: ${noProgressStreak}\
155
+ )`)}else{log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u8A08\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3001\u30AD\u30E5\u30FC\u3082\u7A7A\u3067\u3057\u305F\uFF08\u9023\u7D9A\u30AB\u30A6\u30F3\u30C8\u306F\u52A0\u7B97\u3057\u306A\u3044\u30FB\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u5224\u5B9A\uFF09`)}}else if(outcome.undetermined){undeterminedStreak+=1;log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u30AD\u30E5\u30FC\u306E\u72B6\u614B\u3092\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${undeterminedStreak}\
156
+ \u30B5\u30A4\u30AF\u30EB\u9023\u7D9A\u30FB\u9032\u6357\u306A\u3057\u306B\u306F\u6570\u3048\u306A\u3044\uFF09`);if(undeterminedStreak>=config.queueUndeterminedMax){log.log(`\u26D4 claim API\u306E\u969C\u5BB3\u304C ${undeterminedStreak} \u30B5\u30A4\u30AF\u30EB\u7D9A\u3044\u3066\u3044\u307E\u3059\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C91\uFF09`);log.log(" \u78BA\u8A8D: API\u306E\u758E\u901A\uFF0F\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\uFF0F--project \u306E\u6307\u5B9A\u3002\u5FA9\u65E7\u5F8C\u306B\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044");
152
157
  exitCode=1;break}}else{undeterminedStreak=0;noProgressStreak+=1;log.log(outcome.emptyQueue?`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u30AD\u30E5\u30FC\u304C\u7A7A\u3067\u3057\u305F (\u9023\u7D9A: ${noProgressStreak})`:`\u30B5\u30A4\u30AF\u30EB ${cycle}: \u9032\u6357\u306A\u3057 (\u9023\u7D9A: ${noProgressStreak})`)}log.log(`\u30B5\u30A4\u30AF\u30EB ${cycle} \u5B8C\u4E86 (duration: ${Math.trunc((Date.now()-cycleStart)/1e3)}s)`);if(noProgressStreak>=3){log.log("3\u30B5\u30A4\u30AF\u30EB\u9023\u7D9A\u3067\u9032\u6357\u306A\u3057\u3002\u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");
153
158
  if(unavailableStreak>=3){exitCode=1;log.log("\u26D4 \u539F\u56E0\u306F\u300CAI \u30921\u3064\u3082\u8D77\u52D5\u3067\u304D\u306A\u3044\u300D\u3053\u3068\u3067\u3059\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u7B49\uFF09\u3002");log.log(` ${AI_RECOVERY_HINT}`);log.log(" **\u8CC7\u683C\u60C5\u5831\u3092\u76F4\u3059\u307E\u3067\u518D\u8D77\u52D5\u3057\u3066\u3082\u540C\u3058\u7D50\u679C\u306B\u306A\u308A\u307E\u3059**")}if(this.planLock.permanentFail){log.log("\u26D4 \u539F\u56E0\u306F\u8A08\u753B\u30ED\u30C3\u30AFAPI\u306E\u6052\u4E45\u30A8\u30E9\u30FC\uFF084xx\uFF09\u3067\u3059\u3002**\u8A2D\u5B9A\u3092\u76F4\u3059\u307E\u3067\u518D\u8D77\u52D5\u3057\u3066\
154
159
  \u3082\u540C\u3058\u7D50\u679C\u306B\u306A\u308A\u307E\u3059**");exitCode=1}break}if(cycle<config.maxCycles){log.log(`\u6B21\u30B5\u30A4\u30AF\u30EB\u307E\u3067 ${config.intervalSec}\u79D2 \u5F85\u6A5F...`);await runner.beat("waiting");await this.sleepUnlessDraining(config.intervalSec*1e3)}}log.separator();this.abortDrained?.();log.log("twp task-loop \u7D42\u4E86");log.log(` \u7DCF\u30B5\u30A4\u30AF\u30EB\u6570: ${cycle}`);log.log(` \u30ED\u30B0: ${config.logDir}`);log.separator();return exitCode}async hasPendingItems(){
@@ -167,33 +172,35 @@ has(exclusiveSkill)){log.log(` \u5B9A\u671F\u30B9\u30AD\u30C3\u30D7: ${row.skil
167
172
  if(claim==="error"){log.log(` \u26A0\uFE0F \u5B9A\u671F\u67A0\u306E\u7372\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u67A0\u306F\u672A\u6D88\u5316\u3068\u3057\u3066\u6B21\u30B5\u30A4\u30AF\u30EB\u3078\u9001\u308A\u307E\u3059 | [${row.scheduleId}] ${row.windowKey}`);continue}const category=ai.categoryForSkill(row.skill);const label=`[\u5B9A\u671F][${row.priority}] ${row.label} #ai:${category}`.slice(0,200);const primary=ai.selectPrimary(category,row.skill,row.priority,label);
168
173
  const{itemId,detail}=await createItem(this.deps.api,{label,prompt,...primary===""?{}:{ai_type:primary},...row.requiredPlatforms.length>0?{required_platforms:row.requiredPlatforms}:{}});if(!itemId){log.log(` \u26D4 \u5B9A\u671F\u30BF\u30B9\u30AF\u306E\u30A8\u30F3\u30AD\u30E5\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08[${row.scheduleId}] ${row.windowKey}\uFF09: ${detail}`);if(detail.startsWith("item_id \u3092\u8AAD\u3081\u307E\u305B\u3093")){log.log(" \u30A2\u30A4\u30C6\u30E0\u306F\u4F5C\u6210\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002**\u3053\u306E\u67A0\u306F fai\
169
174
  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.
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(
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\
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(
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=
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){
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);
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].
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.
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(
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
- `
175
+ 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);if(!midcycle)this.planRunScheduled.push({schedule_id:row.scheduleId,item_id:itemId});
176
+ enqueuedLines.push(`- [${row.priority}] ${row.label} \u2192 ${prompt}`);log.log(` \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`);
177
+ this.midcycleEnqueued+=count}else if(!midcycle){log.log("\u5B9A\u671F\u30B9\u30B1\u30B8\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.
178
+ 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(res)}\uFF09`)}if(this.midcycleEnqueued>=this.deps.config.scheduleMidcycleMax)return;await this.enqueueDueScheduled(true)}async recordStandalonePlanRun(result){const{api,config,log}=this.deps;const res=await api.planRun(config.runnerId,config.runId,{...standaloneRecord(result,this.planRunScheduled)});
179
+ if(res.ok)return;if(res.status===404){log.log(` \u2139\uFE0F \u8A08\u753B\u306E\u5B9F\u884C\u8A18\u9332\uFF08result=${result}\uFF09\u3092\u9001\u308C\u307E\u305B\u3093\u3067\u3057\u305F: \u30B5\u30FC\u30D0\u304C plan/runs \u306B\u672A\u5BFE\u5FDC\u3067\u3059\uFF08404\uFF09`);return}log.log(` \u26A0\uFE0F \u8A08\u753B\u306E\u5B9F\u884C\u8A18\u9332\uFF08result=${result}\uFF09\u3092\u9001\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002\u30EB\u30FC\u30D7\u306F\u7D9A\u3051\u307E\u3059`)}async planGateSaysSkip(){
180
+ 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=decision.fingerprint;return decision.skip}recordPlanGateFingerprint(){const{config,log}=this.deps;const fingerprint=this.planGateFingerprint;this.
181
+ 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){const{config,log}=this.deps;this.lastPlanWasEmpty=
182
+ false;const planStartedMs=Date.now();let engineResult=null;const enqueuedSteps=[];const setRecord=(result2,summary2)=>{this.planRunRecord=planRecord({result:result2,engine:engineResult,durationMs:Date.now()-planStartedMs,summary:summary2,enqueuedSteps,scheduled:this.planRunScheduled})};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();
183
+ 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);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(
184
+ 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].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\
185
+ \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.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")}
186
+ const outcomeReports=await fetchOutcomeReports(this.deps.api,config.outcomeSkills??[]);for(const w of outcomeStreakWarnings(outcomeReports))log.log(` \u26A0\uFE0F ${w}`);const outcomeSection=renderOutcomeSection(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(
187
+ 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.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=[];
188
+ 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(planSkill.replace(/^\//,"")),...Object.keys(planSession.env).length>0?{extraEnv:planSession.env}:{},validate:output=>planSession.submission()!==null||extractPlanJson(output)!==null});submitted=planSession.submission();rejectedSubmissions=planSession.
189
+ rejections()}finally{planSession.close()}writeLogFile(planLogFile,result.output);engineResult=result;setRecord(result.outcome==="ok"?"error":"ai_failed",null);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"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.
190
+ 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.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");
191
+ setRecord("error",null);return"ok"}const unchecked=unavailableChecks(blocks);const recordResult=summary2=>{const line=formatPlanResultLine(rejectedSubmissions.length>0?{...summary2,rejected_submissions:rejectedSubmissions}:summary2);log.log(line);try{fs6.appendFileSync(planLogFile,`
185
192
  ${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");
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:");
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\
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{
193
+ `)}catch{}};if(submitted?.empty===true){log.log("\u8A08\u753BAI\u306F\u7A7A\u306E\u8A08\u753B\uFF080\u4EF6\uFF09\u3092\u63D0\u51FA\u3057\u307E\u3057\u305F");recordResult({source:"submit",empty:true,planned:0,enqueued:0,dropped:[],unchecked});setRecord("empty",null);this.lastPlanWasEmpty=true;return"ok"}if(submitted!==null){log.log(`\u63D0\u51FA\u3055\u308C\u305F\u8A08\u753B\u3092\u4F7F\u3044\u307E\u3059\uFF08plan submit\u30FB${submitted.plan.steps.length}\u4EF6\u30FB${submitted.submitted_at}\uFF09`)}else{
194
+ log.log("\u8A08\u753B\u306E\u63D0\u51FA\u304C\u7121\u3044\u305F\u3081\u3001\u5FDC\u7B54\u306E\u6587\u7AE0\u304B\u3089\u8A08\u753B\u3092\u53D6\u308A\u51FA\u3057\u307E\u3059")}const plan=submitted?.plan??extractPlanJson(result.output);const source=submitted!==null?"submit":plan?"text":"none";if(!plan||plan.steps.length===0){log.log("\u8A08\u753B\u306Bsteps\u304C\u3042\u308A\u307E\u305B\u3093");recordResult({source,empty:true,planned:0,enqueued:0,dropped:[],unchecked});setRecord(plan?"empty":"json_\
195
+ not_found",null);this.lastPlanWasEmpty=true;return"ok"}const verifyBacklog=parseOpsCount(prefetchSection,"verify");const devVerifyPlanned=plan.steps.filter(s=>(s.skill??"").trim()==="dev-verify").length;const releaseDeployDrop=releaseDeployDropReason(verifyBacklog,devVerifyPlanned);if(releaseDeployDrop!==null&&plan.steps.some(s=>normalizeSkillName(s.skill??"")==="release-deploy")){log.log(` release-deploy \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u7A7A\u632F\u308A\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${releaseDeployDrop}`)}
196
+ const zeroTargetDrops=zeroTargetDropReasons(prefetchSection,config.operations.zeroTargetGates);for(const[skill,reason]of zeroTargetDrops){if(plan.steps.some(s=>normalizeSkillName(s.skill??"")===skill)){log.log(` ${skill} \u306F\u8A08\u753B\u304B\u3089\u9664\u5916\u3057\u307E\u3059\uFF08\u5BFE\u8C61\u8AAD\u307F\u66FF\u3048\u9632\u6B62\u30AC\u30FC\u30C9\uFF09: ${reason}`)}}const processing=await this.deps.api.processingSnapshot();const inflightKeys=new Set;if(processing===null){log.log(" \u26A0\uFE0F \u51E6\u7406\u4E2D\
197
+ \u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u540C\u4E00\u30BF\u30B9\u30AF\u306E\u4E8C\u91CD\u7740\u624B\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09")}else{const entries=inflightEntries(processing,new Date,inflightStaleHours(config.aiTimeoutSec));for(const entry of entries)inflightKeys.add(entry.key);if(entries.length>
198
+ 0){log.log(" \u4ED6\u30E9\u30F3\u30CA\u30FC\u304C\u51E6\u7406\u4E2D\u306E task_key\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of entries)log.log(` - ${formatInflightEntry(entry)}`)}}let pendingCache=null;let pendingFetched=false;const pendingOnce=async()=>{if(!pendingFetched){pendingFetched=true;pendingCache=await this.deps.api.pendingSnapshot()}return pendingCache};let pendingKeys=null;let pendingKeysResolved=false;const queuedPendingKeys=async()=>{
199
+ if(pendingKeysResolved)return pendingKeys;pendingKeysResolved=true;const pending=await pendingOnce();if(pending===null){log.log(" \u26A0\uFE0F pending \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u30AD\u30E5\u30FC\u5F85\u3061\u30AD\u30FC\u306E\u7A4D\u307F\u76F4\u3057\u6291\u6B62\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");return null}pendingKeys=pendingTaskKeys(
200
+ pending);return pendingKeys};let exclusiveQueued=null;let exclusiveFetched=false;const exclusiveInflight=async()=>{if(exclusiveFetched)return exclusiveQueued;exclusiveFetched=true;const pending=await pendingOnce();if(pending===null&&processing===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u30A2\u30A4\u30C6\u30E0\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");log.log(" \u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F**\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u7121\u52B9**\u3067\u3059\uFF08\u6295\u5165\u306F\u6B62\u3081\u307E\u305B\u3093\uFF09");
201
+ return null}if(pending===null||processing===null){log.log(` \u26A0\uFE0F ${pending===null?"pending":"processing"} \u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u305D\u306E\u3076\u3093\u5916\u90E8\u6295\u7A3F\u30B9\u30AD\u30EB\u306E\u540C\u6642\u5B9F\u884C\u30AC\u30FC\u30C9\u306F\u7DE9\u307F\u307E\u3059`)}const entries=exclusiveInflightEntries([{status:"processing",items:processing??[]},{status:"pending",items:pending??[]}],{staleHours:inflightStaleHours(
202
+ config.aiTimeoutSec)});const exclusive=entries.filter(e=>config.ai.isExclusiveSkill(e.skill));if(exclusive.length>0){log.log(" \u65E2\u306B\u30AD\u30E5\u30FC/\u5B9F\u884C\u4E2D\u306E\u6392\u4ED6\u30B9\u30AD\u30EB\uFF08\u3053\u306E\u8A08\u753B\u304B\u3089\u306F\u9664\u5916\u3057\u307E\u3059\uFF09:");for(const entry of exclusive)log.log(` - ${formatExclusiveEntry(entry)}`)}exclusiveQueued=new Set(exclusive.map(e=>e.skill));return exclusiveQueued};let recentCandidates=null;let recentFetched=false;
203
+ let resultFetchBudget=5;const recentAdvanceFor=async(taskKey,skill)=>{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{
197
204
  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.
198
205
  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
206
  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`)}
@@ -208,25 +215,26 @@ log(` \u30A8\u30F3\u30AD\u30E5\u30FC\u6291\u6B62\uFF08\u524D\u56DE\u304C\u72B6\
208
215
  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
216
  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
217
  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=skillFromPrompt(prompt)??"";const promptPlaceholder=placeholderTaskKey(stripSkillCommand(prompt));if(promptPlaceholder!==null){const reason=`\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306E\u307E\u307E\u3067\u3059\uFF08'${promptPlaceholder}'\uFF09\u3002\u8A08\u753B\u6642\u306E\u96DB\u5F62\u304C\u7F6E\u63DB\u3055\u308C\u3066\u3044\u307E\u305B\u3093`;
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}
218
+ item);if(itemId){enqueued+=1;enqueuedSteps.push({skill:step.skill,task_key:item.task_key||null,label:item.label,item_id:itemId});if(exclusiveSkill!==null)exclusiveEnqueued.add(exclusiveSkill);if(item.task_key)enqueuedTaskKeys.add(item.task_key)}else{dropped.push({skill:step.skill,task_key:item.task_key||null,reason:`\u6295\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\
219
+ : ${enqueued} \u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F`);const summary={source,empty:false,planned:plan.steps.length,enqueued,dropped,unchecked,...lockLostMidway?{aborted:true}:{}};recordResult(summary);setRecord("enqueued",summary);return"ok"}async snapshotDynamicBlocks(taskStatus){const{config,log,api}=this.deps;try{const advancing=config.operations.advancingOutcomes;const[processing,pending,recent]=await Promise.all([api.processingSnapshot(),api.
220
+ pendingSnapshot(),advancing.size>0?api.completedSince(windowStartMicros(new Date)):Promise.resolve(null)]);const blocks=await buildDynamicBlocks({processing,pending,recent,taskStatus,advancing,staleHours:inflightStaleHours(config.aiTimeoutSec)});const missing=unavailableChecks(blocks);if(missing.length>0){log.log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306B\u306F\u52B9\u304B\u306A\u3044\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`)}
221
+ return blocks}catch(err){log.log(` \u26A0\uFE0F \u63D0\u51FA\u6642\u306E\u691C\u67FB\u306B\u4F7F\u3046\u5B9F\u6E2C\u3092\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\uFF09\u3002\u30A8\u30F3\u30AD\u30E5\u30FC\u6642\u306E\u691C\u67FB\u306F\u52B9\u304D\u307E\u3059`);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.
222
+ separator();let completed=0;let failed=0;let unexecuted=0;let unexecutedNeedsHuman=false;let stepNum=0;let contendedRetry=0;let undetermined=false;let stop=false;this.nothingClaimableBacklog=false;dequeue:for(;;){if(this.draining){log.log("\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081\u3001\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u306F\u53D6\u5F97\u3057\u307E\u305B\u3093\u3002Phase 2 \u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");stop=true;break}const claimed=await this.
223
+ claimOne();if(claimed.kind==="undetermined"){undetermined=true;break}if(claimed.kind==="contended"){contendedRetry+=1;if(contendedRetry>=config.contendedMax){log.log(` \u26A0\uFE0F contended \u304C ${contendedRetry} \u56DE\u7D9A\u304D\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u3067\u306E\u53D6\u5F97\u3092\u8AE6\u3081\u307E\u3059\uFF08\u4ED6\u6A5F\u304C\u51E6\u7406\u3092\u7D9A\u3051\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u9AD8\u3044\uFF09`);undetermined=true;break}log.log(`\
224
+ \u2139\uFE0F \u4ED6\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u5148\u306B\u53D6\u5F97\u3057\u307E\u3057\u305F\uFF08contended\u30FB${contendedRetry}\u56DE\u76EE\uFF09\u30023\u79D2\u5F8C\u306B\u518D\u8A66\u884C\u3057\u307E\u3059`);await this.sleep(3e3);continue}contendedRetry=0;this.nothingClaimableBacklog=claimed.kind==="filtered"&&claimed.by.length>0&&claimed.by.every(b=>b==="prerequisite"||b==="platform");if(claimed.kind==="empty"){log.log("\u30AD\u30E5\u30FC\u306Bpending\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002Phase 2 \u5B8C\u4E86\u3002");
225
+ break}if(claimed.kind==="filtered"){const reasons=claimed.by.includes("platform")?claimed.by.includes("prerequisite")?"\u524D\u63D0\u672A\u5145\u8DB3\u30FB\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u5225\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u5C02\u7528\u306E\u307F":"\u524D\u63D0\u672A\u5145\u8DB3\u306E\u307F";log.log(this.nothingClaimableBacklog?`\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${reasons}\
226
+ \uFF09\u3002Phase 2 \u5B8C\u4E86\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u306F\u8A08\u753B\u3057\u307E\u3059\u3002`:"\u3053\u306E\u6A5F\u4F53\u304C\u53D6\u308C\u308B pending \u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7406\u7531\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u6B21\u30B5\u30A4\u30AF\u30EB\u3082\u8A08\u753B\u3057\u307E\u305B\u3093\uFF09\u3002Phase 2 \u5B8C\u4E86\u3002");break}const item=claimed.item;const itemId=item.item_id??"";const prompt=(item.
227
+ prompt??"").trim();const label=item.label??"";if(!itemId||!prompt){log.log(`\u30C7\u30AD\u30E5\u30FC\u7D50\u679C\u306E\u30D1\u30FC\u30B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${JSON.stringify(item).slice(0,200)}`);break}stepNum+=1;log.separator();log.log(`[${stepNum}] ${label}`);log.log(` item_id: ${itemId}`);await runner.beat("dequeue",itemId);log.log(` prompt: ${prompt}`);log.separator();const stopMatch=/^\/stop(?:\s+(\d+))?$/.exec(prompt);if(stopMatch){const res=await api.update(itemId,
228
+ {status:"completed"},config.runId);if(res.status===409){log.log(" \u26A0\uFE0F /stop \u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093")}else if(!res.ok){log.log(` \u26D4 /stop \u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09`);log.log(" \u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u56DE\u53CE\u5F8C\u306B\
229
+ pending \u3078\u623B\u308B\u305F\u3081\u3001**\u6B21\u56DE\u8D77\u52D5\u6642\u3082\u5373\u505C\u6B62\u3057\u307E\u3059**");log.log(` \u5FA9\u65E7: UI \u304BAPI\u3067 item=${itemId} \u3092 completed / failed \u306B\u3057\u3066\u304F\u3060\u3055\u3044`)}completed+=1;const waitSec=stopMatch[1];if(waitSec){const requested=Number.parseInt(waitSec,10);const capped=Math.min(requested,STOP_WAIT_MAX_SEC);if(capped!==requested){log.log(` \u26A0\uFE0F /stop \u306E\u5F85\u6A5F ${requested}\u79D2 \u306F\u4E0A\u9650 ${STOP_WAIT_MAX_SEC}\
230
+ \u79D2 \u306B\u4E38\u3081\u307E\u3059`)}log.log(`[${stepNum}] /stop ${capped} \u2192 ${capped}\u79D2\u9593\u5F85\u6A5F\u3057\u307E\u3059...`);await this.sleepUnlessDraining(capped*1e3);log.log(`[${stepNum}] \u5F85\u6A5F\u5B8C\u4E86\u3002\u6B21\u306E\u30A2\u30A4\u30C6\u30E0\u306B\u9032\u307F\u307E\u3059\u3002`);continue}log.log(`[${stepNum}] /stop \u2192 \u30EB\u30FC\u30D7\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002`);stop=true;break}const skillName=skillFromPrompt(prompt)??"";const promptPlaceholder=placeholderTaskKey(
231
+ stripSkillCommand(prompt));if(promptPlaceholder!==null){const reason=`\u30BF\u30B9\u30AF\u30AD\u30FC\u304C\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306E\u307E\u307E\u3067\u3059\uFF08'${promptPlaceholder}'\uFF09\u3002\u8A08\u753B\u6642\u306E\u96DB\u5F62\u304C\u7F6E\u63DB\u3055\u308C\u3066\u3044\u307E\u305B\u3093`;log.log(` \u26D4 \u5B9F\u884C\u3057\u307E\u305B\u3093: ${reason}`);const res=await api.update(itemId,{status:"failed",error_message:reason},config.runId);if(res.status===409){log.log(
232
+ ` \u26A0\uFE0F \u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09\u3002\u3053\u3061\u3089\u3067\u306F\u8A18\u9332\u3057\u307E\u305B\u3093: item=${itemId}`)}else if(!res.ok){log.log(` \u26A0\uFE0F failed \u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09: item=${itemId}`)}else{log.log(`[${stepNum}] ${label} \u2192 \u5931\u6557 [ai=-] (0s)`);await this.schedule.recordByItem(itemId,"failed")}failed+=
233
+ 1;continue}if(skillName){const gate=await this.schedule.gateAllows(skillName);if(!gate.allowed){stepNum-=1;if(this.deferredIds.has(itemId)){log.log(" \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3067\u5F85\u6A5F\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u518D\u3073\u30C7\u30AD\u30E5\u30FC\u3055\u308C\u307E\u3057\u305F\u3002\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306EPhase 2\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002");break}const res=await api.update(itemId,{status:"pending"},config.runId);if(res.status===
234
+ 409){log.log(` \u26A0\uFE0F \u5F8C\u56DE\u3057\u306B\u3057\u3088\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`);log.log(" \u81EA\u5206\u306E claim \u306F\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\u3002**\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u5B9F\u884C\u305B\u305A\u653E\u68C4\u3057\u307E\u3059**");continue}if(res.ok){this.deferredIds.add(itemId);log.log(
235
+ ` \u23F8 \u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u306B\u3088\u308A\u5F8C\u56DE\u3057: ${skillName} \u2014 ${gate.reason}`);continue}log.log(" \u26A0\uFE0F pending\u3078\u623B\u305B\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6642\u9593\u5E2F\u30B2\u30FC\u30C8\u3092\u7121\u8996\u3057\u3066\u3053\u306E\u307E\u307E\u5B9F\u884C\u3057\u307E\u3059");stepNum+=1}}const stepLog=path4.join(config.logDir,`step-${this.timestamp}-${cycle}-${stepNum}.log`);const startedAt=Date.now();const taggedCategory=/#ai:([a-z]+)/.
236
+ exec(label)?.[1];this.itemInFlight=itemId;const resolvedSkills=await this.skills.resolve(prompt);const skillOrigins=formatSkillOrigins(resolvedSkills.origins);if(skillOrigins!=="")log.log(` \u30B9\u30AD\u30EB: ${skillOrigins}`);const ownershipWatch=this.startOwnershipWatch(itemId);let result;try{result=await this.engine.run({serverSkills:resolvedSkills.bodies,prompt:buildStepPrompt(config,prompt),promptPrefix:this.cyclePreflightSection,logFile:stepLog,aiType:item.ai_type??void 0,aiModel:item.ai_model??
237
+ 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}
230
238
  ${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");
231
239
  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"},
232
240
  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\
@@ -280,27 +288,28 @@ const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)re
280
288
  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`)}
281
289
  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
290
  `);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-H7OOHHKO.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-H7OOHHKO.js");const extraHosts=config.
291
+ 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-GONY4JAY.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-GONY4JAY.js");const extraHosts=config.
284
292
  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
293
  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-T5KHXNGH.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)})}
294
+ 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-YBTGYQD7.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
295
  const profile=resolveProfile(opts.profile);let creds;try{creds=new AuthSession(profile.name,profile.apiUrl).loadOrThrow()}catch(err){process.stderr.write(`${err.message}
288
296
  `);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.
289
297
  message}
290
- `);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-HHPKB6N4.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(" / ")}
298
+ `);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-74LO2SXN.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(" / ")}
291
299
  `);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.
292
- write("charter \u306B\u306F push / pull / history / diff / revert \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u61B2\u7AE0\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}if(opts.charterOp!=="push"&&opts.charterOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-TYBPPUAF.js");
293
- return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"charter",op:opts.charterOp,from:opts.revisionFrom,to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const{runCharterCommand}=await import("./charter-command-LIX2JXRJ.js");return runCharterCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.charterOp,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,
300
+ write("charter \u306B\u306F push / pull / history / diff / revert \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u61B2\u7AE0\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}if(opts.charterOp!=="push"&&opts.charterOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-KT7NMRES.js");
301
+ return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"charter",op:opts.charterOp,from:opts.revisionFrom,to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const{runCharterCommand}=await import("./charter-command-A4MFFBGE.js");return runCharterCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.charterOp,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,
294
302
  profile:opts.profile})}if(opts.action==="schedule"&&opts.scheduleOp!==void 0){const{runScheduleDefCommand}=await import("./schedule-def-command-OFCA5VH3.js");return runScheduleDefCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.scheduleOp,configOp:opts.scheduleConfigOp,id:opts.scheduleId,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.action==="settings"){if(opts.settingsOp===void 0){process.stderr.
295
303
  write("settings \u306B\u306F push / pull \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\uFF09\u306B\u306F\u30EB\u30FC\u30D7\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}const{runSettingsCommand}=await import("./settings-command-TEVH2MNY.js");return runSettingsCommand({api:new AgentLoopApi({apiUrl,projectId,
296
- session})},{op:opts.settingsOp,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.action==="skill"){if(opts.skillOp===void 0){process.stderr.write("skill \u306B\u306F push / pull / list / show / delete / history / diff / revert \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __private__\
297
- \uFF09\u306B\u306F\u30B9\u30AD\u30EB\u5B9A\u7FA9\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}if(opts.skillOp==="list"||opts.skillOp==="show"||opts.skillOp==="delete"){const{runSkillManageCommand}=await import("./skill-manage-command-S2RLIHTA.js");return runSkillManageCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.skillOp,name:opts.skillName,output:opts.output,query:opts.query,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.
298
- skillOp!=="push"&&opts.skillOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-TYBPPUAF.js");return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"skill",op:opts.skillOp,name:opts.skillName,from:opts.revisionFrom,to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const{runSkillCommand}=await import("./skill-command-4V2GT73D.js");return runSkillCommand({api:new AgentLoopApi({apiUrl,projectId,session})},
299
- {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.interval}:{},forceRunner:opts.forceRunner,...opts.engine!==void 0?{engine:opts.engine}:{},version:opts.version});const api=new AgentLoopApi(
300
- {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}
301
- `);const{runCapacityReport}=await import("./capacity-report-command-PBE73I43.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}\
304
+ session})},{op:opts.settingsOp,file:opts.charterInput,out:opts.charterOutput,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.action==="skill"){if(opts.skillOp===void 0){process.stderr.write("skill \u306B\u306F push / pull / list / show / delete / history / diff / revert / check \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\n");return 2}if(isPrivateProjectId(projectId)){process.stderr.write("\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30E5\u30FC\uFF08--project __p\
305
+ rivate__\uFF09\u306B\u306F\u30B9\u30AD\u30EB\u5B9A\u7FA9\u306E\u8A2D\u5B9A\u304C\u3042\u308A\u307E\u305B\u3093\n");return 2}if(opts.skillOp==="check"){const{runSkillCheck}=await import("./skill-check-2ILLHGDQ.js");return runSkillCheck({api:new AgentLoopApi({apiUrl,projectId,session})},{configPath:opts.skillConfig,defaultConfigPath:localConfigPath(projectId),output:opts.output})}if(opts.skillOp==="list"||opts.skillOp==="show"||opts.skillOp==="delete"){const{runSkillManageCommand}=await import("./skill-manage-command-HPJQOTQK.js");
306
+ return runSkillManageCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.skillOp,name:opts.skillName,output:opts.output,query:opts.query,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}if(opts.skillOp!=="push"&&opts.skillOp!=="pull"){const{runRevisionCommand}=await import("./revision-command-KT7NMRES.js");return runRevisionCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{target:"skill",op:opts.skillOp,name:opts.skillName,from:opts.revisionFrom,
307
+ to:opts.revisionTo,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const{runSkillCommand}=await import("./skill-command-4VMZ2H6A.js");return runSkillCommand({api:new AgentLoopApi({apiUrl,projectId,session})},{op:opts.skillOp,name:opts.skillName,all:opts.skillAll===true,dir:opts.skillDir,revision:opts.charterRevision,yes:opts.yes===true,projectRef,profile:opts.profile})}const config=buildLoopConfig({projectId,projectRef,apiUrl,safeMode:opts.safe,daemon:opts.daemon,
308
+ ...opts.maxCycles!==void 0?{maxCycles:opts.maxCycles}:{},...opts.interval!==void 0?{intervalSec:opts.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.
309
+ write(`\u26A0\uFE0F ${warning}
310
+ `);const{runCapacityReport}=await import("./capacity-report-command-QSV3A6EX.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}\
302
311
 
303
- `)}if(opts.action==="status")return showStatus(api,config);if(opts.action==="schedule"){const{runScheduleCommand}=await import("./schedule-command-2HCOGYJW.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}
312
+ `)}if(opts.action==="status")return showStatus(api,config);if(opts.action==="schedule"){const{runScheduleCommand}=await import("./schedule-command-RVKP6QQS.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}
304
313
  `);return 2}try{assertKnownEngine(config.engine)}catch(err){if(err instanceof UnknownEngineError){process.stderr.write(`${err.message}
305
314
  `);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\
306
315
  _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}\
@@ -316,7 +325,7 @@ log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u4FE1\u3057\u307E\u305
316
325
  "\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"}\
317
326
  \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.
318
327
  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`;
319
- 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-LJBDUOTV.js");const settings=new LoopSettingsApplier2({api,config,log:m=>log.log(m)});await settings.apply();const{ServerSkillCatalog:ServerSkillCatalog2}=await import("./server-skills-4XYTHPN3.js");const skills=new ServerSkillCatalog2({api,config,log:m=>log.log(m)});await skills.
328
+ 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-ELHHMBBK.js");const settings=new LoopSettingsApplier2({api,config,log:m=>log.log(m)});await settings.apply();const{ServerSkillCatalog:ServerSkillCatalog2}=await import("./server-skills-EEPBSOPO.js");const skills=new ServerSkillCatalog2({api,config,log:m=>log.log(m)});await skills.
320
329
  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.
321
330
  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.
322
331
  projectRef}\uFF08${config.projectId}\uFF09