@tocca-systems/twp-cli 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.public.md +8 -0
- package/README.md +36 -4
- package/dist/{ai-dispatch-27EZS2S3.js → ai-dispatch-PNA4UF4I.js} +2 -2
- package/dist/{api-command-BH6ILQNX.js → api-command-JJJOEIZQ.js} +2 -2
- package/dist/{app-4LRDLLTV.js → app-SOQPONUU.js} +3 -3
- package/dist/auto-update-CV2MM32C.js +4 -0
- package/dist/auto-update-worker-ML7EBNQW.js +16 -0
- package/dist/{backlog-AYEKG575.js → backlog-NV7Z76R3.js} +1 -1
- package/dist/chunk-3WHC4FSG.js +15 -0
- package/dist/chunk-5WGOHFAS.js +3 -0
- package/dist/{chunk-SQSVA6AT.js → chunk-BYRM4NSC.js} +1 -1
- package/dist/chunk-DEVIQH5U.js +18 -0
- package/dist/{chunk-RQFG3OUL.js → chunk-FOFV2MNL.js} +1 -1
- package/dist/chunk-GTABFTZP.js +23 -0
- package/dist/chunk-ILKQDXI5.js +22 -0
- package/dist/{chunk-U4QQNRXF.js → chunk-MGKVUKU5.js} +1 -1
- package/dist/{chunk-7WEYBZSK.js → chunk-MIMDLO52.js} +1 -1
- package/dist/{chunk-H3JTPDCJ.js → chunk-NWABK3RZ.js} +3 -18
- package/dist/{chunk-77CQG7O7.js → chunk-VGK2JMBW.js} +3 -3
- package/dist/{chunk-63LDNYGW.js → chunk-XNLIEUAW.js} +1 -1
- package/dist/cli.js +37 -30
- package/dist/{commands-VUWI4ERO.js → commands-7D5EEQBY.js} +6 -5
- package/dist/{commands-XYKBLMXT.js → commands-EWRHQZYM.js} +56 -61
- package/dist/logout-guard-Q4MQFEGR.js +13 -0
- package/dist/{oneshot-5EM5NFTK.js → oneshot-XLLRNRLK.js} +2 -2
- package/dist/{project-OKTJ32JT.js → project-BATJQR3F.js} +1 -1
- package/dist/{run-XALXQIC3.js → run-OB3JFPSH.js} +2 -2
- package/dist/{setup-AJ56N6XO.js → setup-ROGEF3UO.js} +2 -1
- package/dist/{task-VVBXZLPU.js → task-6QUH5OXF.js} +2 -2
- package/dist/update-EXFIHTMW.js +3 -0
- package/package.json +1 -1
- package/dist/update-WDWUECN7.js +0 -21
|
@@ -1,28 +1,22 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{CapacityReporter,buildLoopConfig,describeOperations,evaluateOwnership,formatHookIds,formatHookWiring,localDate,loopStateDir,runPrefetch,runPreflight}from"./chunk-
|
|
4
|
-
spawnSyncResolved}from"./chunk-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
lockDir}\uFF09`,note:null}}return this.takeOver(`\u30ED\u30C3\u30AF\u306B pid \u304C\u306A\u304F\u4F5C\u6210\u304B\u3089 ${Math.trunc(age/1e3)} \u79D2\u7D4C\u904E\u3057\u3066\u3044\u307E\u3059 \u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`)}release(){if(!this.owned)return;if(this.readPid()===process.pid){fs.rmSync(this.owned,{recursive:true,force:true})}this.owned=null}takeOver(note){fs.rmSync(this.lockDir,{recursive:true,force:true});if(this.tryMkdir())return{acquired:true,
|
|
8
|
-
reason:"",note};return{acquired:false,reason:`\u30ED\u30C3\u30AF\u306E\u5F15\u304D\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u5225\u30D7\u30ED\u30BB\u30B9\u304C\u5148\u306B\u53D6\u5F97\u3057\u305F\u53EF\u80FD\u6027\uFF09: ${this.lockDir}`,note:null}}tryMkdir(){try{fs.mkdirSync(path.dirname(this.lockDir),{recursive:true,mode:448});fs.mkdirSync(this.lockDir,{mode:448})}catch{return false}try{fs.writeFileSync(path.join(this.lockDir,"pid"),`${process.pid}
|
|
9
|
-
`)}catch{}this.owned=this.lockDir;return true}readPid(){try{const raw=fs.readFileSync(path.join(this.lockDir,"pid"),"utf8").split("\n")[0]?.trim();const pid=Number.parseInt(raw??"",10);return Number.isInteger(pid)&&pid>0?pid:null}catch{return null}}lockAgeMs(){try{const now=this.opts.now?.()??Date.now();return now-fs.statSync(this.lockDir).mtimeMs}catch{return null}}isLoop(pid){if(this.opts.isLoopProcess)return this.opts.isLoopProcess(pid);return defaultIsLoopProcess(pid)}};function defaultIsLoopProcess(pid,deps={}){
|
|
10
|
-
try{process.kill(pid,0)}catch(err){const code=err.code;if(code==="EPERM")return true;return false}const cmdline=readCommandLine(pid,deps);if(cmdline===null)return true;return cmdline.includes("task-loop")}function readCommandLine(pid,deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const nonEmpty=v=>v.trim()===""?null:v;if(platform==="linux"){try{const read=deps.readProc??(p=>fs.readFileSync(`/proc/${p}/cmdline`,"utf8"));return nonEmpty(read(pid).replace(/\0/g,
|
|
11
|
-
" "))}catch{return null}}const run=deps.run??((file,args)=>execFileSync(file,[...args],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],windowsHide:true}));if(platform==="win32"){const ps=system32(env,"WindowsPowerShell","v1.0","powershell.exe");if(ps===null)return null;try{const filter=`ProcessId=${String(Math.trunc(pid))}`;const cmd=`(Get-CimInstance Win32_Process -Filter "${filter}").CommandLine | Out-String -Width 32767`;return nonEmpty(run(ps,["-NoProfile","-NonInteractive","-C\
|
|
12
|
-
ommand",cmd]))}catch{return null}}try{return nonEmpty(run("ps",["-ww","-p",String(Math.trunc(pid)),"-o","command="]))}catch{return null}}import fs2 from"fs";import path2 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){fs2.mkdirSync(path2.dirname(logFile),{recursive:true});this.stream=fs2.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{InstanceLock,buildLockOwner,defaultIsLoopProcess,writeLockOwner}from"./chunk-3WHC4FSG.js";import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-ZOOEH7ZE.js";import{CapacityReporter,buildLoopConfig,describeOperations,evaluateOwnership,formatHookIds,formatHookWiring,localDate,loopStateDir,runPrefetch,runPreflight}from"./chunk-BYRM4NSC.js";import{claudeConfigDir,resolveDetectDeps}from"./chunk-DEVIQH5U.js";
|
|
4
|
+
import{exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,reloadAiConfig,skillOfItem,spawnSyncResolved}from"./chunk-NWABK3RZ.js";import{killProcessTree}from"./chunk-N2UVRM3Z.js";import{AgentLoopApi,REQUIRE_ZERO_STATUS,ScheduleApi,collectDue,describeError,filterByStatus,gateStatus,isPermanent,nowInZone,parseCounts,pick,pickString,promptSection}from"./chunk-N56AWWTM.js";import{PRIVATE_PROJECT_REF,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-GY7KI5E5.js";
|
|
5
|
+
import{AuthSession}from"./chunk-XNLIEUAW.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import{extractLeadingTaskKey}from"./chunk-II5RVJQN.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveProfile}from"./chunk-NERYSBA4.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{
|
|
6
|
+
resolveProjectRef,uuidProjectIdPolicy}from"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";import fs10 from"fs";import path8 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(
|
|
13
7
|
message)}
|
|
14
|
-
`;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=
|
|
15
|
-
name);try{if(
|
|
8
|
+
`;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,
|
|
9
|
+
name);try{if(fs.statSync(file).mtimeMs<cutoff)fs.rmSync(file,{force:true})}catch{}}}import fs7 from"fs";import path5 from"path";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";var GIT_IDENTITY_ENV_KEYS=["GIT_AUTHOR_NAME","GIT_AUTHOR_EMAIL","GIT_COMMITTER_NAME","GIT_COMMITTER_EMAIL"];function resolveDeps(deps){return{run:deps.run??spawnSync,readdirSync:deps.readdirSync??(dir=>fs2.readdirSync(dir,{withFileTypes:true})),existsSync:deps.existsSync??fs2.existsSync,env:deps.env??process.env}}function expectedIdentity(configured,env=process.env){const pick2=(envKey,fromConfig)=>{const fromEnv=(env[envKey]??"").trim();if(fromEnv!=="")return fromEnv;return(fromConfig??"").trim()};
|
|
16
10
|
const name=pick2("TWP_GIT_IDENTITY_NAME",configured?.name);const email=pick2("TWP_GIT_IDENTITY_EMAIL",configured?.email);if(name===""||email==="")return null;return{name,email}}var GIT_IDENTITY_UNSET_LOG=' git identity \u306E\u671F\u5F85\u5024\u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u63C3\u3048\u307E\u305B\u3093\u3067\u3057\u305F\uFF08~/.twp/loops/<project>.json \u306E "git_identity": {"name","email"}\u3001\u307E\u305F\u306F TWP_GIT_IDENTITY_NAME / TWP_GIT_IDENTITY_EMAIL\uFF09\u3002GitHub \u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u3065\u304B\u306A\u3044 author \u306E commit \u306F Vercel Preview \u304C BLOCKED \u306B\u306A\u308A\u307E\u3059';
|
|
17
|
-
var SKIP_DIRS=new Set(["node_modules","vendor","dist","build","target"]);function isScannable(name){return!name.startsWith(".")&&!SKIP_DIRS.has(name)}function workspaceRepos(workspace,deps={}){const d=resolveDeps(deps);if(!d.existsSync(
|
|
18
|
-
repos.push(grandchild)}}return repos}function childDirs(dir,d){let entries;try{entries=d.readdirSync(dir)}catch{return[]}return[...entries].filter(e=>e.isDirectory()&&isScannable(e.name)).sort((a,b)=>a.name.localeCompare(b.name)).map(e=>
|
|
19
|
-
key],d);if(r.error||r.status!==0)return null;const value=(r.stdout??"").trim();return value===""?null:value}function normalizeGitIdentity(workspace,configured,deps={}){const d=resolveDeps(deps);const want=expectedIdentity(configured,d.env);const logs=[];const fixed=[];if(want===null)return{logs:[GIT_IDENTITY_UNSET_LOG],fixed,strippedEnv:[]};for(const repo of workspaceRepos(workspace,deps)){const label=
|
|
11
|
+
var SKIP_DIRS=new Set(["node_modules","vendor","dist","build","target"]);function isScannable(name){return!name.startsWith(".")&&!SKIP_DIRS.has(name)}function workspaceRepos(workspace,deps={}){const d=resolveDeps(deps);if(!d.existsSync(path2.join(workspace,".git")))return[];const repos=[workspace];for(const child of childDirs(workspace,d)){if(d.existsSync(path2.join(child,".git"))){repos.push(child);continue}for(const grandchild of childDirs(child,d)){if(d.existsSync(path2.join(grandchild,".git")))
|
|
12
|
+
repos.push(grandchild)}}return repos}function childDirs(dir,d){let entries;try{entries=d.readdirSync(dir)}catch{return[]}return[...entries].filter(e=>e.isDirectory()&&isScannable(e.name)).sort((a,b)=>a.name.localeCompare(b.name)).map(e=>path2.join(dir,e.name))}function git(args,d){const options={encoding:"utf8",timeout:1e4};return spawnSyncResolved("git",args,options,{},d.run)}function gitConfigGet(repo,key,d,local){const scope=local?["--local"]:[];const r=git(["-C",repo,"config",...scope,"--get",
|
|
13
|
+
key],d);if(r.error||r.status!==0)return null;const value=(r.stdout??"").trim();return value===""?null:value}function normalizeGitIdentity(workspace,configured,deps={}){const d=resolveDeps(deps);const want=expectedIdentity(configured,d.env);const logs=[];const fixed=[];if(want===null)return{logs:[GIT_IDENTITY_UNSET_LOG],fixed,strippedEnv:[]};for(const repo of workspaceRepos(workspace,deps)){const label=path2.basename(repo);for(const[key,value]of[["user.name",want.name],["user.email",want.email]]){
|
|
20
14
|
const effective=gitConfigGet(repo,key,d,false);if(effective===value)continue;const r=git(["-C",repo,"config","--local",key,value],d);if(r.error||r.status!==0){logs.push(` \u26A0\uFE0F git identity \u3092\u4FEE\u6B63\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${label} / ${key}\uFF09\u3002commit \u306E author \u304C GitHub \u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u3065\u304B\u306A\u3044\u3068 Vercel Preview \u304C BLOCKED \u306B\u306A\u308A\u307E\u3059`);continue}fixed.push({repo:label,
|
|
21
15
|
key});logs.push(` git identity\uFF08${label}\uFF09\u3092\u4FEE\u6B63\u3057\u307E\u3057\u305F: ${key}=${value}`)}}const strippedEnv=stripConflictingGitEnv(d.env,want);for(const key of strippedEnv){logs.push(` git identity \u3092\u4E0A\u66F8\u304D\u3059\u308B\u74B0\u5883\u5909\u6570 ${key} \u3092\u89E3\u9664\u3057\u307E\u3057\u305F\uFF08git config \u3088\u308A\u5F37\u304F\u52B9\u304F\u305F\u3081\uFF09`)}return{logs,fixed,strippedEnv}}function stripConflictingGitEnv(env,want){const stripped=[];for(const key of GIT_IDENTITY_ENV_KEYS){
|
|
22
|
-
const raw=env[key];if(raw===void 0)continue;const value=raw.trim();const ok=key.endsWith("NAME")?value===want.name:value===want.email;if(ok)continue;delete env[key];stripped.push(key)}return stripped}import
|
|
16
|
+
const raw=env[key];if(raw===void 0)continue;const value=raw.trim();const ok=key.endsWith("NAME")?value===want.name:value===want.email;if(ok)continue;delete env[key];stripped.push(key)}return stripped}import fs3 from"fs";function claudeTrustFile(d){const join=joinFor(d.platform);const{dir,via}=claudeConfigDir(d);if(dir===join(d.homedir(),".claude"))return{file:join(d.homedir(),".claude.json"),via};return{file:join(dir,".claude.json"),via}}function checkWorkspaceTrust(workspace,deps={}){const d=resolveDetectDeps(deps);const{file,via}=claudeTrustFile(d);let raw;try{if(!d.existsSync(file)){return{state:"untrusted",file,detail:`\u30C8\u30E9\u30B9\u30C8\u8A2D\u5B9A\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF08${file}\
|
|
23
17
|
\uFF0F ${via}\uFF09`}}raw=d.readFileSync(file)}catch(err){return{state:"unknown",file,detail:`\u30C8\u30E9\u30B9\u30C8\u8A2D\u5B9A\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${file}: ${err.message}\uFF09`}}let projects;try{projects=JSON.parse(raw).projects}catch{return{state:"unknown",file,detail:`\u30C8\u30E9\u30B9\u30C8\u8A2D\u5B9A\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${file}\uFF09`}}if(typeof projects!=="object"||projects===null){return{state:"\
|
|
24
18
|
untrusted",file,detail:`\u30C8\u30E9\u30B9\u30C8\u8A2D\u5B9A\u306B projects \u304C\u3042\u308A\u307E\u305B\u3093\uFF08${file}\uFF09`}}const table=projects;for(const key of workspaceKeys(workspace,deps)){const entry=table[key];if(typeof entry!=="object"||entry===null)continue;if(entry.hasTrustDialogAccepted===true){return{state:"trusted",file,detail:`\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306F\u30C8\u30E9\u30B9\u30C8\u6E08\u307F\u3067\u3059\uFF08${key} \uFF0F ${file}\uFF09`}}}return{state:"u\
|
|
25
|
-
ntrusted",file,detail:`\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u672A\u30C8\u30E9\u30B9\u30C8\u3067\u3059\uFF08${workspace} \uFF0F ${file}\uFF09`}}function workspaceKeys(workspace,deps){const keys=[workspace];try{const real=(deps.realpathSync??
|
|
19
|
+
ntrusted",file,detail:`\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u672A\u30C8\u30E9\u30B9\u30C8\u3067\u3059\uFF08${workspace} \uFF0F ${file}\uFF09`}}function workspaceKeys(workspace,deps){const keys=[workspace];try{const real=(deps.realpathSync??fs3.realpathSync)(workspace);if(real!==workspace)keys.push(real)}catch{}return keys}var TRUST_GATE_TIMEOUT_MS=30*6e4;var PROCEED={wait:false,logs:[],note:null};var TrustGate=class{constructor(deps){this.deps=deps}deps;since=null;expired=false;now(){
|
|
26
20
|
return(this.deps.now??Date.now)()}get timeoutMs(){return this.deps.timeoutMs??TRUST_GATE_TIMEOUT_MS}evaluate(){const enabled=typeof this.deps.enabled==="function"?this.deps.enabled():this.deps.enabled;if(!enabled)return PROCEED;let r;try{r=this.deps.check()}catch(err){return{wait:false,logs:[` \u26A0\uFE0F \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30C8\u30E9\u30B9\u30C8\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\uFF09\u3002\u901A\u5E38\u3069\u304A\u308A\u7D9A\u884C\u3057\u307E\u3059`],
|
|
27
21
|
note:null}}if(r.state==="trusted"){const waited2=this.since===null?null:this.now()-this.since;this.since=null;this.expired=false;return{wait:false,logs:waited2===null?[]:[` \u2705 \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30C8\u30E9\u30B9\u30C8\u304C\u5C0E\u51FA\u3055\u308C\u307E\u3057\u305F\uFF08\u5F85\u6A5F ${Math.round(waited2/1e3)}\u79D2\uFF09\u3002\u5B9F\u884C\u3092\u518D\u958B\u3057\u307E\u3059`],note:null}}if(r.state==="unknown"){return{wait:false,logs:[` \u26A0\uFE0F ${r.detail}\
|
|
28
22
|
\u3002\u672A\u30C8\u30E9\u30B9\u30C8\u3068\u306F\u65AD\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u7D9A\u884C\u3057\u307E\u3059`],note:null}}if(this.expired)return{wait:false,logs:[this.expiredLog()],note:expiredNote()};const now=this.now();if(this.since===null){this.since=now;return{wait:true,logs:[` \u23F8 ${r.detail}`,` \u30C8\u30E9\u30B9\u30C8\u304C\u5C0E\u51FA\u3055\u308C\u308B\u307E\u3067\u30A2\u30A4\u30C6\u30E0\u3092\u53D6\u308A\u307E\u305B\u3093\uFF08\u6700\u5927${Math.round(this.timeoutMs/
|
|
@@ -83,13 +77,13 @@ function excludedKeyInArgs(args,excluded){if(excluded.size===0)return null;for(c
|
|
|
83
77
|
\u4EF6 > \u8A08\u753B\u5185dev-verify${devVerifyPlanned}\u4EF6\uFF08Phase 1\u306E0\u4EF6\u898B\u8FBC\u307F\u304C\u7ACB\u305F\u306A\u3044\uFF09`}return null}function duplicateTaskKeyDropReason(enqueuedKeys,taskKey){if(!taskKey)return null;if(!enqueuedKeys.has(taskKey))return null;return`${taskKey} \u306F\u672C\u8A08\u753B\u3067\u65E2\u306B\u6295\u5165\u6E08\u307F\uFF08\u540C\u4E00\u30AD\u30FC\u306F1\u8A08\u753B1\u4EF6\uFF09`}var NO_ZERO_TARGET_GATES={};function zeroTargetDropReasons(prefetchSection,gates=NO_ZERO_TARGET_GATES){
|
|
84
78
|
const reasons=new Map;for(const[skill,gate]of Object.entries(gates)){const n=parseOpsCount(prefetchSection,gate.field);if(n===null)reasons.set(skill,`${gate.label}\u4EF6\u6570\u304C\u5224\u5B9A\u4E0D\u80FD\u306E\u305F\u3081\u898B\u9001\u308A`);else if(n===0)reasons.set(skill,`${gate.label}0\u4EF6\u306E\u305F\u3081\u5BFE\u8C61\u306A\u3057`)}return reasons}var INFLIGHT_STALE_HOURS=3;function staleFloorHours(aiTimeoutSec){return Math.ceil(aiTimeoutSec*2/3600)}function inflightStaleHours(aiTimeoutSec,baseHours=INFLIGHT_STALE_HOURS){const base=Number.isFinite(baseHours)&&baseHours>0?baseHours:INFLIGHT_STALE_HOURS;return Math.max(base,staleFloorHours(aiTimeoutSec))}function ageMinutesOf(item,now){for(const raw of[item.started_at,item.updated_at,item.dequeued_at,item.created_at]){if(!raw)continue;const ts=Date.parse(raw);if(Number.isNaN(ts))continue;return Math.
|
|
85
79
|
floor((now.getTime()-ts)/6e4)}return null}function inflightEntries(items,now=new Date,staleHours=INFLIGHT_STALE_HOURS){const staleMinutes=staleHours*60;const byKey=new Map;for(const item of items){const key=(item.task_key??"").trim();if(!key)continue;const ageMinutes=ageMinutesOf(item,now);if(ageMinutes!==null&&ageMinutes>staleMinutes)continue;const entry={key,runner:item.runner_id??"-",ageMinutes,label:(item.label??"").slice(0,60)};const prev=byKey.get(key);if(!prev||(entry.ageMinutes??-1)>(prev.
|
|
86
|
-
ageMinutes??-1))byKey.set(key,entry)}return[...byKey.values()].sort((a,b)=>a.key.localeCompare(b.key))}function formatInflightEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.key} runner=${entry.runner} \u7D4C\u904E=${age}`}import
|
|
80
|
+
ageMinutes??-1))byKey.set(key,entry)}return[...byKey.values()].sort((a,b)=>a.key.localeCompare(b.key))}function formatInflightEntry(entry){const age=entry.ageMinutes===null?"\u4E0D\u660E":`${entry.ageMinutes}\u5206`;return`${entry.key} runner=${entry.runner} \u7D4C\u904E=${age}`}import fs4 from"fs";import path3 from"path";async function createItem(api,body){const res=await api.create(body);if(!res.ok)return{itemId:null,detail:describeError(res)};for(const p of["item_id","id","item.item_id","item.id","data.item_id","data.id"]){const v=pickString(res.json,p);if(v)return{itemId:v,detail:""}}return{itemId:null,detail:`item_id \u3092\u8AAD\u3081\u307E\u305B\u3093: ${res.raw.slice(0,200)}`}}function reorderSucceeded(targetId,json){if(pick(json,"result")===true)return true;const raw=Array.isArray(json)?json:pick(json,"i\
|
|
87
81
|
tems");if(!Array.isArray(raw)||raw.length===0)return false;const items=raw;const orderOf=it=>typeof it.sort_order==="number"?it.sort_order:Number.POSITIVE_INFINITY;const hit=items.find(it=>(it.item_id??"")===targetId);if(!hit)return false;return orderOf(hit)===Math.min(...items.map(orderOf))}function queueContainsKey(items,key){const re=new RegExp(`${key.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![0-9])`);return items.some(it=>re.test(`${it.label??""}
|
|
88
82
|
${it.prompt??""}
|
|
89
83
|
${it.task_key??""}`))}function localTimestamp(at=new Date){const p2=n=>String(n).padStart(2,"0");const offsetMin=-at.getTimezoneOffset();const sign=offsetMin>=0?"+":"-";const abs=Math.abs(offsetMin);return`${at.getFullYear()}-${p2(at.getMonth()+1)}-${p2(at.getDate())}T${p2(at.getHours())}:${p2(at.getMinutes())}:${p2(at.getSeconds())}${sign}${p2(Math.trunc(abs/60))}${p2(abs%60)}`}var ReleaseOutcomeLog=class{constructor(file,log){this.file=file;this.log=log}file;log;record(result,phase,reason,ai){
|
|
90
84
|
const clean=reason.replace(/[\t\n]/g," ").slice(0,200);const line=`${localTimestamp()} ${result} ${phase||"unknown"} ${ai||"unknown"} ${clean}
|
|
91
|
-
`;try{
|
|
92
|
-
let text;try{text=
|
|
85
|
+
`;try{fs4.mkdirSync(path3.dirname(this.file),{recursive:true});fs4.appendFileSync(this.file,line)}catch{return}if(result!=="NOT_EXECUTED")return;const streak=this.notExecutedStreak();if(streak>=3){this.log.log(` \u26A0\uFE0F \u30EA\u30EA\u30FC\u30B9\u304C ${streak} \u56DE\u9023\u7D9A\u3067\u672A\u5B9F\u884C\u3067\u3059\uFF08${this.file}\uFF09\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u30D6\u30ED\u30C3\u30AB\u30FC\u89E3\u6D88\u3092\u6700\u512A\u5148\u3059\u308B\u3053\u3068`)}}notExecutedStreak(){
|
|
86
|
+
let text;try{text=fs4.readFileSync(this.file,"utf8")}catch{return 0}let n=0;for(const line of text.split("\n")){if(line.trim()==="")continue;n=line.split(" ")[1]==="NOT_EXECUTED"?n+1:0}return n}};function parseReleaseResult(logText){const matches=[...logText.matchAll(/RELEASE_RESULT:[^|\n]*\|[^|\n]*\|[^\n]*/g)];const line=matches.at(-1)?.[0];if(!line)return null;const parts=line.split("|").map(s=>s.trim());return{executed:!/NOT_EXECUTED/.test(parts[0]??""),phase:parts[1]??"",reason:parts[2]??"",
|
|
93
87
|
line}}function parseOutcomeCode(logText){const matches=[...logText.matchAll(/\b([A-Z][A-Z0-9_]*_RESULT):[ \t]*([^|\n]*)/g)];const last=matches.at(-1);if(last===void 0)return null;const value=(last[2]??"").trim();return value===""?null:`${last[1]??""}: ${value}`}var RECOVER_KEY_RE=/RECOVER:[ \t]*([^\s|、,,]+-\d+)/;function parseRecoverKey(line){const m=RECOVER_KEY_RE.exec(line);return m?.[1]??null}function parsePartialMergeCause(line){const m=/PARTIAL_MERGE:\s*([A-Za-z0-9_.:-]+)/.exec(line);return m?.[1]??
|
|
94
88
|
null}function parsePhase5Pending(line){const m=/PHASE5_PENDING:\s*(\d+)/.exec(line);return m?.[1]??null}function parseMergedKeys(logText){const matches=[...logText.matchAll(/MERGED_KEYS:[ \t]*([A-Za-z0-9,_-]*)/g)];const raw=matches.at(-1)?.[1];if(raw===void 0)return null;const trimmed=raw.trim();if(trimmed===""||trimmed==="none")return[];return trimmed.split(",").filter(k=>k!=="")}var PHASE5_RECOVERY_MAX=2;var PARTIAL_MERGE_ESCALATION_MAX=1;var TANI_USER_ID="2f391dda-f0e3-42f8-a9fd-8ffc271be765";
|
|
95
89
|
var STATUS_HUMAN_DECISION="35e2d271-8a6e-4f3f-8bb6-1588a2d5a894";async function enqueueBlockerRecovery(deps,releaseLine){const{api,config,log}=deps;const key=parseRecoverKey(releaseLine);if(!key)return;const queued=await api.queuedSnapshot();if(queued===null){log.log(" \u26A0\uFE0F \u30AD\u30E5\u30FC\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2192 \u30D6\u30ED\u30C3\u30AB\u30FC\u4FEE\u6B63\u306E\u6295\u5165\u3092\u898B\u9001\u308A\u307E\u3059");log.log(
|
|
@@ -149,11 +143,11 @@ const age=advance.ageMinutes===null?"\u4E0D\u660E":`${advance.ageMinutes}\u5206\
|
|
|
149
143
|
var MARKER_PARSABLE_KEY_RE=/^[A-Z][A-Z0-9]*-\d+$/;function parseTaskStatusSnapshot(prefetchSection){const m=/<!--\s*OPS_TASK_STATUS\s([^>]*?)-->/.exec(prefetchSection);if(!m||m[1]===void 0)return null;const body=m[1];const windowMatch=/\bwindow_hours=(\d+)\b/.exec(body);const byKey=new Map;for(const pair of body.matchAll(MARKER_PAIR_RE)){byKey.set(pair[1],pair[2])}return{complete:/\bcomplete=1\b/.test(body),windowHours:windowMatch?Number(windowMatch[1]):0,byKey}}function shouldSuppressForStatus(advance,snapshot){
|
|
150
144
|
if(snapshot===null){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30DE\u30FC\u30AB\u30FC\uFF08OPS_TASK_STATUS\uFF09\u304C prefetch \u306B\u7121\u3044"}}if(!snapshot.complete){return{suppress:false,reason:"\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u305F\u3082\u306E\u304C\u3042\u308B\uFF08complete=0\uFF09"}}if(snapshot.windowHours<RECENT_ADVANCE_WINDOW_HOURS){return{suppress:false,reason:`\u30DE\u30FC\u30AB\u30FC\u306E\u7A93\uFF08${snapshot.windowHours}\
|
|
151
145
|
h\uFF09\u304C\u6291\u6B62\u306E\u7A93\uFF08${RECENT_ADVANCE_WINDOW_HOURS}h\uFF09\u3088\u308A\u72ED\u3044`}}const expected=EXPECTED_STATUS_AFTER[advance.outcome];if(expected===void 0){return{suppress:false,reason:`${advance.outcome} \u306E\u60F3\u5B9A\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u5BFE\u5FDC\u8868\u306B\u7121\u3044`}}const current=snapshot.byKey.get(advance.taskKey);if(current===void 0){if(!MARKER_PARSABLE_KEY_RE.test(advance.taskKey)){return{suppress:false,reason:"\u30DE\u30FC\u30AB\u30FC\u306E\u30D1\u30FC\u30B5\u304C\u62FE\u3048\u306A\u3044\u5F62\u306E\u30AD\u30FC\uFF08\u5927\u6587\u5B57\u306E\u307F\u5BFE\
|
|
152
|
-
\u5FDC\uFF09\u306A\u306E\u3067\u3001\u4E0D\u5728\u3092\u300C\u52D5\u3044\u3066\u3044\u306A\u3044\u300D\u6839\u62E0\u306B\u3067\u304D\u306A\u3044"}}return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}var USER_ID_RE=/^[A-Za-z0-9._-]{1,64}$/;var ProjectApi=class{constructor(apiUrl,session,fetchImpl=httpFetch){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl}apiUrl;session;fetchImpl;async resolve(ref){if(isPrivateProjectRef(ref))return this.resolvePrivate();return resolveProjectRef(ref,
|
|
146
|
+
\u5FDC\uFF09\u306A\u306E\u3067\u3001\u4E0D\u5728\u3092\u300C\u52D5\u3044\u3066\u3044\u306A\u3044\u300D\u6839\u62E0\u306B\u3067\u304D\u306A\u3044"}}return{suppress:true,reason:""}}if(current===expected)return{suppress:true,reason:""};return{suppress:false,reason:`\u524D\u56DE\u306E\u5B9F\u884C\u306E\u5F8C\u306B\u30BF\u30B9\u30AF\u304C\u52D5\u3044\u305F\uFF08${expected} \u2192 ${current}\uFF09\uFF1D\u65B0\u3057\u3044\u4ED5\u4E8B`}}var USER_ID_RE=/^[A-Za-z0-9._-]{1,64}$/;var ProjectApi=class{constructor(apiUrl,session,fetchImpl=httpFetch){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl}apiUrl;session;fetchImpl;async resolve(ref){if(isPrivateProjectRef(ref))return this.resolvePrivate();return resolveProjectRef(ref,path9=>this.get(path9),uuidProjectIdPolicy)}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.
|
|
153
147
|
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(
|
|
154
148
|
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?.
|
|
155
|
-
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(
|
|
156
|
-
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
|
|
149
|
+
pagination?.total;if(typeof total!=="number"){return{total:null,error:"\u5FDC\u7B54\u304B\u3089 pagination.total \u3092\u8AAD\u3081\u306A\u3044"}}return{total,error:null}}async get(path9){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}${path9}`,{headers:{Authorization:`Bearer ${token}`,"Content-Type":"application/json",Accept:"application/json"}});const raw=await res.text();
|
|
150
|
+
let json=null;try{json=raw.trim()===""?null:JSON.parse(raw)}catch{json=null}return{ok:res.ok,status:res.status,json,error:null}}catch(err){return{ok:false,status:null,json:null,error:err.message}}}};import fs5 from"fs";var ScheduleBridge=class{constructor(deps){this.deps=deps}deps;tzWarned=false;zoneWarned=false;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.kind==="error")return{error:res.message};if(res.
|
|
157
151
|
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}`:""))}return{config:res.config}}async loadHistory(){const res=await this.
|
|
158
152
|
deps.api.history();if(res.kind==="error")return{error:res.message};const serverTz=res.history.timezone;if(serverTz&&serverTz!==this.deps.config.scheduleTimezone&&!this.tzWarned){this.tzWarned=true;this.warn(`\u5C65\u6B74\u306E\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08\u30B5\u30FC\u30D0: ${serverTz}\uFF09\u3068\u5224\u5B9A\u306B\u4F7F\u3046\u30BF\u30A4\u30E0\u30BE\u30FC\u30F3\uFF08${this.deps.config.scheduleTimezone}\uFF09\u304C\u9055\u3044\u307E\u3059\u3002\u65E5\u6B21\u67A0\u306E\u5F53\u65E5\u5224\u5B9A\u3068 interval \u306E\u8DB3\u5207\u308A\u304C\u540C\u6642\u306B\u305A\u308C\u307E\u3059\u3002AGENT_LOOP_SCHEDULE_TZ \u3092\u5408\u308F\u305B\u3066\u304F\u3060\u3055\u3044`)}
|
|
159
153
|
return{rows:res.history.rows,windowCounts:res.history.windowCounts}}async due(counts){const cfg=await this.loadConfig();if("error"in cfg)return{kind:"error",message:cfg.error};const hist=await this.loadHistory();if("error"in hist)return{kind:"error",message:hist.error};const rows=await collectDue({config:cfg.config,now:this.now(),history:hist.rows,windowCounts:hist.windowCounts,safeMode:this.deps.config.safeMode,exclusiveSkills:this.deps.config.operations.exclusiveSkills,statusEndpoint:this.deps.
|
|
@@ -163,20 +157,20 @@ allowed:true,reason:""}}return gateStatus(skill,this.now(),res.config.gates)}cla
|
|
|
163
157
|
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\
|
|
164
158
|
\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\
|
|
165
159
|
\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(
|
|
166
|
-
cfg.config,this.now(),"error"in hist?[]:hist.rows,lines,!("error"in hist))}};function readEnqueuedLines(file){if(!file)return[];let text;try{text=
|
|
160
|
+
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$/,""))}import fs6 from"fs";import path4 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) ...
|
|
167
161
|
${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)&&
|
|
168
162
|
value>=0?value:void 0;const str=(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(
|
|
169
163
|
tokensOut);const costUsd=num(metrics.costUsd);if(costUsd!==void 0)payload.cost_usd=costUsd;const skill=str(metrics.skill,MAX_SKILL_LENGTH);if(skill!==void 0)payload.skill=skill;const effort=str(metrics.effort,32);if(effort!==void 0)payload.effort=effort;const exitReason=str(metrics.exitReason,32);if(exitReason!==void 0)payload.exit_reason=exitReason;const outcomeCode=str(metrics.outcomeCode,MAX_OUTCOME_CODE_LENGTH);if(outcomeCode!==void 0)payload.outcome_code=outcomeCode}var NO_TURN_OUTCOME_CODE="\
|
|
170
|
-
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;pendingDir(){return
|
|
164
|
+
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;pendingDir(){return path4.join(this.config.stateDir,"pending-writeback")}async write(itemId,payload){const{run_id:runId,...rest}=payload;const res=await this.api.update(itemId,rest,runId);
|
|
171
165
|
if(res.ok)return"ok";if(res.status===409){this.log.log(` \u26A0\uFE0F \u5B9F\u884C\u7D50\u679C\u3092\u66F8\u304D\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\uFF08409\u30FB\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF09: item=${itemId}`);this.log.log(" \u81EA\u5206\u306E claim \u306F\u5931\u52B9\u3057\u3066\u3044\u307E\u3059\uFF08heartbeat \u304C\u9014\u7D76\u3048\u3066\u56DE\u53CE\u3055\u308C\u305F\u53EF\u80FD\u6027\uFF09\u3002**\u7D50\u679C\u306F\u7834\u68C4\u3057\u307E\u3059**");
|
|
172
166
|
this.log.log(" \u540C\u3058\u4F5C\u696D\u304C\u4ED6\u6A5F\u3067\u8D70\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u3001\u30E9\u30F3\u30CA\u30FC\u306E\u6B7B\u6D3B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08twp task-loop status\uFF09");return"lost"}this.log.log(` \u26A0\uFE0F \u5B9F\u884C\u7D50\u679C\u306E\u66F8\u304D\u623B\u3057\u306B\u5931\u6557\uFF08${describeError(res)}\uFF09: item=${itemId}\u3002`);if(this.stash(itemId,payload)){this.log.log(`\
|
|
173
167
|
\u7D50\u679C\u306F ${this.pendingDir()}/${itemId}.json \u306B\u9000\u907F\u3057\u307E\u3057\u305F\u3002**\u6B21\u30B5\u30A4\u30AF\u30EB\u5192\u982D\u3067\u518D\u9001\u3057\u307E\u3059**`);this.log.log(" \u518D\u9001\u3067\u304D\u306A\u3044\u307E\u307E\u306A\u3089\u3001\u30B5\u30FC\u30D0\u304C\u300Clive \u3060\u304C\u5225\u30A2\u30A4\u30C6\u30E0\u3078\u79FB\u3063\u305F\u300D\u3068\u5224\u5B9A\u3057\u3066\u56DE\u53CE\u3057\u307E\u3059")}else{this.log.log(" \u26D4 \u9000\u907F\u306B\u3082\u5931\u6557\u3057\u305F\u305F\u3081\u3001\u3053\u306E\u7D50\u679C\u306F\u5931\u308F\u308C\u307E\u3057\u305F\uFF08\u30B5\u30FC\u30D0\
|
|
174
|
-
\u306E\u56DE\u53CE\u3067 pending \u306B\u623B\u308A\u518D\u5B9F\u884C\u3055\u308C\u307E\u3059\uFF09")}this.log.log(" \u5B8C\u4E86\u6271\u3044\u306E\u5F8C\u51E6\u7406\uFF08\u5B9A\u671F\u67A0\u306E\u7D42\u7AEF\u30FB\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u306E\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");return"failed"}stash(itemId,payload){if(!/^[A-Za-z0-9_-]+$/.test(itemId))return false;const dir=this.pendingDir();try{
|
|
175
|
-
if(process.platform!=="win32")
|
|
176
|
-
const recorded=[];for(const name of files){const itemId=name.replace(/\.json$/,"");const file=
|
|
177
|
-
\u907F\u304B\u3089 ${this.config.writebackMaxAgeDays} \u65E5\u3092\u8D85\u3048\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);continue}}catch{continue}let payload;try{payload=JSON.parse(
|
|
178
|
-
api.update(itemId,rest,runId||this.config.runId);if(res.ok){
|
|
179
|
-
\u2192 \u7D50\u679C\u306F\u7834\u68C4\u3057\u307E\u3059`)}else if(res.status!==null&&res.status>=400&&res.status<500&&res.status!==408&&res.status!==429){
|
|
168
|
+
\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{fs6.mkdirSync(dir,{recursive:true,mode:448});
|
|
169
|
+
if(process.platform!=="win32")fs6.chmodSync(dir,448);fs6.writeFileSync(path4.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=fs6.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`);
|
|
170
|
+
const recorded=[];for(const name of files){const itemId=name.replace(/\.json$/,"");const file=path4.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-fs6.statSync(file).mtimeMs)/864e5;if(ageDays>this.config.writebackMaxAgeDays){fs6.rmSync(file,{force:true});this.log.log(` \u26D4 \u9000\
|
|
171
|
+
\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(fs6.readFileSync(file,"utf8"))}catch{fs6.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.
|
|
172
|
+
api.update(itemId,rest,runId||this.config.runId);if(res.ok){fs6.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){fs6.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}\
|
|
173
|
+
\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){fs6.rmSync(file,{force:true});this.log.log(` \u26D4 \u30B5\u30FC\u30D0\u306B\u6052\u4E45\u7684\u306B\u62D2\u5426\u3055\u308C\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3059\uFF08http=${res.status}\uFF09: item=${itemId}`)}else{this.log.log(` \u26A0\uFE0F \u518D\u9001\u306B\u5931\u6557\uFF08${describeError(res)}\uFF09: item=${itemId}\u3002\u6B21\u30B5\u30A4\u30AF\u30EB\u3067\u518D\u8A66\
|
|
180
174
|
\u884C\u3057\u307E\u3059`)}}return recorded}};function exitReasonFor(outcome){if(outcome==="ok")return"ok";if(outcome==="timeout")return"timeout";if(outcome==="rate-limited")return"rate_limited";if(outcome==="aborted")return"interrupted";if(outcome==="max-turns")return"max_turns";return"error"}function withFailureHint(base,output){const hint=failureHint(output);return hint===""?base:`${base} | ${hint}`}var STOP_WAIT_MAX_SEC=3600;var AI_RECOVERY_HINT="\u78BA\u8A8D: claude-auto-switch status \uFF0F \u5404AI CLI\u306E\u30ED\u30B0\u30A4\u30F3\u72B6\u614B\uFF08twp task-loop setup \u3067\u691C\u51FA\u7D50\u679C\u304C\u51FA\u307E\u3059\uFF09";
|
|
181
175
|
var ABORT_DRAIN_TIMEOUT_MS=15e3;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=>{const statusId=Object.prototype.hasOwnProperty.call(REQUIRE_ZERO_STATUS,key)?REQUIRE_ZERO_STATUS[key]:void 0;if(!statusId)return null;const{total}=await deps.projectApi.countByStatus(deps.config.projectId,statusId);return total}});this.engine=
|
|
182
176
|
deps.engine;this.releaseLog=new ReleaseOutcomeLog(deps.config.releaseOutcomeLogPath,deps.log);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:()=>this.hasPendingItems(),reregister:async()=>{deps.runner.registered=false;await deps.runner.registerOrThrow()},...deps.sleepFn?{sleepFn:deps.sleepFn}:{}});this.trustGate=deps.trustGate??new TrustGate({enabled:()=>deps.
|
|
@@ -231,8 +225,8 @@ const{itemId,detail}=await createItem(this.deps.api,{label,prompt,...primary==="
|
|
|
231
225
|
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.scheduleId}\
|
|
232
226
|
] ${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(` \u5B9A\u671F\u30A8\u30F3\u30AD\u30E5\u30FC\
|
|
233
227
|
: [${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\u30E5\u30FC\u30EB: \u4ECA\u30B5\u30A4\u30AF\u30EB\u3067\u767A\u706B\u3057\u305F\u5B9A\u671F\u30BF\u30B9\u30AF\u306F\u3042\u308A\u307E\u305B\u3093")}
|
|
234
|
-
if(!midcycle){const file=
|
|
235
|
-
if(this.midcycleEnqueued>=this.deps.config.scheduleMidcycleMax)return;await this.enqueueDueScheduled(true)}async runPlanAndEnqueue(cycle){const{config,log}=this.deps;log.separator();log.log("Phase 1: \u8A08\u753B\u3092\u7ACB\u6848\u3057\u3066\u30AD\u30E5\u30FC\u306B\u683C\u7D0D...");log.separator();const planLogFile=
|
|
228
|
+
if(!midcycle){const file=path5.join(this.deps.config.logDir,`schedule-enqueued-${this.timestamp}.txt`);try{fs7.mkdirSync(path5.dirname(file),{recursive:true});fs7.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(res)}\uFF09`)}
|
|
229
|
+
if(this.midcycleEnqueued>=this.deps.config.scheduleMidcycleMax)return;await this.enqueueDueScheduled(true)}async runPlanAndEnqueue(cycle){const{config,log}=this.deps;log.separator();log.log("Phase 1: \u8A08\u753B\u3092\u7ACB\u6848\u3057\u3066\u30AD\u30E5\u30FC\u306B\u683C\u7D0D...");log.separator();const planLogFile=path5.join(config.logDir,`plan-${this.timestamp}-${cycle}.log`);const enqueuedFile=path5.join(config.logDir,`schedule-enqueued-${this.timestamp}.txt`);const scheduleSection=await this.
|
|
236
230
|
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(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: ${[
|
|
237
231
|
...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\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.
|
|
238
232
|
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 result=await this.engine.run({prompt:buildPlanPrompt(config,scheduleSection,prefetchSection),promptPrefix:this.cyclePreflightSection,logFile:planLogFile,timeoutSec:config.planTimeoutSec,cwd:config.workspace,
|
|
@@ -267,7 +261,7 @@ continue}log.log(`[${stepNum}] /stop \u2192 \u30EB\u30FC\u30D7\u3092\u7D42\u4E86
|
|
|
267
261
|
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(
|
|
268
262
|
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");
|
|
269
263
|
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**");
|
|
270
|
-
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=
|
|
264
|
+
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=path5.join(config.logDir,`step-${this.timestamp}-${cycle}-${stepNum}.lo\
|
|
271
265
|
g`);const startedAt=Date.now();const taggedCategory=/#ai:([a-z]+)/.exec(label)?.[1];this.itemInFlight=itemId;const ownershipWatch=this.startOwnershipWatch(itemId);let result;try{result=await this.engine.run({prompt:buildStepPrompt(config,prompt),promptPrefix:this.cyclePreflightSection,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?
|
|
272
266
|
{category:taggedCategory}:{}})}finally{ownershipWatch.stop();this.itemInFlight=null}writeLogFile(stepLog,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\
|
|
273
267
|
\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");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"},
|
|
@@ -293,7 +287,7 @@ this.postDeps,contract);return}const followUpOnCut=this.deps.config.operations.p
|
|
|
293
287
|
"object")return{kind:"claimed",item};log.log(` \u26A0\uFE0F claim \u304C claimed \u3092\u8FD4\u3057\u307E\u3057\u305F\u304C item \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}\uFF09`);return{kind:"undetermined"}}if(reason==="empty")return{kind:"empty"};if(reason!=="runner_not_registered"){log.log(` \u26A0\uFE0F claim \u306E\u5FDC\u7B54\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08reason='${reason}'\uFF09\u3002`);log.log(` **\u30AD\u30E5\u30FC\u304C\u7A7A\
|
|
294
288
|
\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u5FDC\u7B54\u306E\u5148\u982D: ${res.raw.slice(0,120)}`);return{kind:"undetermined"}}}attempt+=1;if(res.status===409||pickString(res.json,"reason")==="runner_not_registered"){log.log(" \u26A0\uFE0F claim \u304C 409\uFF08\u30E9\u30F3\u30CA\u30FC\u672A\u767B\u9332\u6271\u3044\uFF09\u3002register \u304B\u3089\u3084\u308A\u76F4\u3057\u307E\u3059");runner.registered=false;try{await runner.registerOrThrow()}catch{return{
|
|
295
289
|
kind:"undetermined"}}if(attempt>=3)return{kind:"undetermined"};continue}if(attempt>=3){log.log(` \u26A0\uFE0F claim API\u304C3\u56DE\u9023\u7D9A\u3067\u5931\u6557\uFF08${describeError(res)}\uFF09\u3002`);log.log(" **\u30AD\u30E5\u30FC\u304C\u7A7A\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002** \u672A\u51E6\u7406\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u6B8B\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002");return{kind:"undetermined"}}
|
|
296
|
-
log.log(` \u26A0\uFE0F claim API\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C`);await this.sleep(5e3)}}};function writeLogFile(file,text){try{
|
|
290
|
+
log.log(` \u26A0\uFE0F claim API\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF08${describeError(res)}\uFF09\u3002${attempt}\u56DE\u76EE\u30FB5\u79D2\u5F8C\u306B\u518D\u8A66\u884C`);await this.sleep(5e3)}}};function writeLogFile(file,text){try{fs7.mkdirSync(path5.dirname(file),{recursive:true});fs7.writeFileSync(file,text)}catch{}}function buildPlanPrompt(config,scheduleSection,prefetchSection){return[config.safeMode?SAFE_MODE_NOTE:"",NON_INTERACTIVE_NOTE,scheduleSection,prefetchSection,"/twp-o\
|
|
297
291
|
ps-plan"].filter(s=>s!=="").join("\n\n")}function buildStepPrompt(config,prompt){const timeoutMin=Math.trunc(config.aiTimeoutSec/60);const softMin=Math.trunc(config.aiTimeoutSec*config.aiSoftDeadlineRatio/100/60);const wrapUpMin=Math.max(0,timeoutMin-softMin);return[`\u3010\u5B9F\u884C\u6642\u9593\u306E\u4E88\u7B97\u3011\u3053\u306E\u5B9F\u884C\u306F ${timeoutMin}\u5206 \u3067\u30D7\u30ED\u30BB\u30B9\u304C\u5F37\u5236\u7D42\u4E86\u3055\u308C\u307E\u3059\u3002\u4E88\u544A\u3084\u7336\u4E88\u306F\u3042\u308A\u307E\u305B\u3093\u3002`,
|
|
298
292
|
[`- \u958B\u59CB\u304B\u3089 **${softMin}\u5206** \u3092\u904E\u304E\u305F\u3089\u3001\u4F5C\u696D\u3092\u6253\u3061\u5207\u3063\u3066\u7DE0\u3081\u51E6\u7406\u306B\u5165\u3063\u3066\u304F\u3060\u3055\u3044\uFF08\u30B3\u30DF\u30C3\u30C8 \u2192 push \u2192 PR\u4F5C\u6210 \u2192 \u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u62C5\u5F53\u306E\u66F4\u65B0 \u2192 \u5F15\u304D\u7D99\u304E\u30B3\u30E1\u30F3\u30C8\uFF09`,`- \u7DE0\u3081\u51E6\u7406\u306B\u306F10\u5206\u7A0B\u5EA6\u3092\u898B\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\uFF08${softMin}\
|
|
299
293
|
\u5206\u6642\u70B9\u3067\u306E\u6B8B\u308A\u306F ${wrapUpMin}\u5206\uFF09`,"- **\u7D4C\u904E\u6642\u9593\u306F `date` \u3067\u5B9F\u6E2C\u3057\u3066\u304F\u3060\u3055\u3044\u3002** \u4F53\u611F\u3067\u300C\u4E88\u7B97\u304C\u5C3D\u304D\u304B\u3051\u3066\u3044\u308B\u300D\u3068\u5224\u65AD\u3057\u306A\u3044\u3053\u3068\u2014\u2014\u5B9F\u6E2C\u305B\u305A\u306B\u65E9\u671F\u96E2\u8131\u3059\u308B\u3068\u3001\u6B8B\u308A\u6642\u9593\u304C\u3042\u308B\u306E\u306B\u5DE5\u7A0B\u304C\u9014\u4E2D\u3067\u6B62\u307E\u308A\u307E\u3059\uFF08\u5B9F\u6E2C\u305B\u305A\u306B\u8FF0\u3079\u305F\u6B8B\u308A\u6642\u9593\u306F\u61B2\u7AE0A3\u9055\u53CD\uFF09",
|
|
@@ -306,43 +300,44 @@ join("\n"),"**\u5927\u304D\u306A\u672A\u5B8C\u6210\u3088\u308A\u3001\u5C0F\u3055
|
|
|
306
300
|
\u305F\u3060\u3057\u3001\u4EBA\u9593\u3084\u5225\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u65E2\u306B\u30EA\u30EA\u30FC\u30B9\u6E08\u307F\u306E\u30BF\u30B9\u30AF\u306B\u3064\u3044\u3066\u3001\u4E8B\u5B9F\u3092\u30B9\u30C6\u30FC\u30BF\u30B9\u3078\u53CD\u6620\u3059\u308B\u3053\u3068\u306F\u5236\u9650\u5BFE\u8C61\u5916\u3067\u3059\u3002`;var NON_INTERACTIVE_NOTE=`\u3010\u91CD\u8981: \u975E\u5BFE\u8A71\u30E2\u30FC\u30C9\uFF08\u81EA\u52D5\u5B9F\u884C\uFF09\u3067\u5B9F\u884C\u4E2D\u3011
|
|
307
301
|
\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u81EA\u52D5\u5B9F\u884C\u3067\u3059\u3002\u4EBA\u9593\u3078\u306E\u5BFE\u8A71\u7684\u306A\u8CEA\u554F\u306F\u3067\u304D\u307E\u305B\u3093\u3002
|
|
308
302
|
- \u4ED5\u69D8\u30FB\u8981\u4EF6\u30FB\u65B9\u91DD\u306B\u3064\u3044\u3066\u4EBA\u9593\u306E\u5224\u65AD\u304C\u5FC5\u8981\u306A\u5834\u5408 \u2192 \u30BF\u30B9\u30AF\u306B\u30B3\u30E1\u30F3\u30C8\u3067\u8CEA\u554F\u3092\u6295\u7A3F\u3057\u3001\u4EBA\u9593\u5224\u65AD\u5F85\u3061\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3078\u5909\u66F4\u3057\u3066\u304B\u3089\u51E6\u7406\u3092\u7D42\u4E86\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
309
|
-
- \u904B\u7528\u4E0A\u306E\u5224\u65AD\uFF08\u30EA\u30C8\u30E9\u30A4\u3001\u30B9\u30AD\u30C3\u30D7\u7B49\uFF09\u2192 \u5B89\u5168\u306A\u65B9\u3092\u81EA\u52D5\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;import
|
|
310
|
-
join(dir,"package.json");try{const parsed=JSON.parse(read(candidate));const name=parsed.name;const version=parsed.version;if(name===PACKAGE_NAME&&typeof version==="string"&&version!==""){const safeVersion=stripTerminalControls(version).replace(/\s+/g," ").trim().slice(0,MAX_VERSION_CHARS);if(safeVersion==="")return null;let installedAtMs=null;try{installedAtMs=mtime(candidate)}catch{}return{packageJsonPath:candidate,version:safeVersion,installedAtMs}}}catch{}const parent=
|
|
303
|
+
- \u904B\u7528\u4E0A\u306E\u5224\u65AD\uFF08\u30EA\u30C8\u30E9\u30A4\u3001\u30B9\u30AD\u30C3\u30D7\u7B49\uFF09\u2192 \u5B89\u5168\u306A\u65B9\u3092\u81EA\u52D5\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;import fs8 from"fs";import path6 from"path";import{fileURLToPath}from"url";var EXIT_VERSION_DRIFT=75;var DEFAULT_MIN_UPTIME_MS=10*6e4;var DRIFT_POLL_MS=5*6e4;var DEFAULT_INSTALL_MAX_AGE_DAYS=3;var MAX_VERSION_CHARS=64;var MAX_PACKAGE_LOOKUP_DEPTH=6;var PACKAGE_NAME="@tocca-systems/twp-cli";function findInstalledPackage(deps={}){const read=deps.readFileSync??(p=>fs8.readFileSync(p,"utf8"));const mtime=deps.statMtimeMs??(p=>fs8.statSync(p).mtimeMs);let dir=deps.startDir??path6.dirname(fileURLToPath(import.meta.url));for(let i=0;i<MAX_PACKAGE_LOOKUP_DEPTH;i++){const candidate=path6.
|
|
304
|
+
join(dir,"package.json");try{const parsed=JSON.parse(read(candidate));const name=parsed.name;const version=parsed.version;if(name===PACKAGE_NAME&&typeof version==="string"&&version!==""){const safeVersion=stripTerminalControls(version).replace(/\s+/g," ").trim().slice(0,MAX_VERSION_CHARS);if(safeVersion==="")return null;let installedAtMs=null;try{installedAtMs=mtime(candidate)}catch{}return{packageJsonPath:candidate,version:safeVersion,installedAtMs}}}catch{}const parent=path6.dirname(dir);if(parent===
|
|
311
305
|
dir)break;dir=parent}return null}function isNewerVersion(installed,running){if(!isReleaseVersion(installed)||!isReleaseVersion(running))return false;const a=parseVersionCore(installed);const b=parseVersionCore(running);if(a===null||b===null)return false;return compareVersionCores(a,b)>0}function isReleaseVersion(version){if(version.includes("-")||version.includes("+"))return false;return parseVersionCore(version)!==null}function decideOnDrift(input){const{runningVersion,installedVersion,previousAttempt}=input;
|
|
312
306
|
if(installedVersion===null)return{action:"none"};if(!isNewerVersion(installedVersion,runningVersion))return{action:"none"};const drift=`${runningVersion} \u2192 ${installedVersion}`;if(input.disabled){return{action:"warn",key:`disabled:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u81EA\u52D5\u518D\u8D77\u52D5\u306F\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u307E\u3059`}}if(!input.supervised){return{action:"w\
|
|
313
307
|
arn",key:`unsupervised:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u7D42\u4E86\u3057\u3066\u3082\u518D\u8D77\u52D5\u3059\u308B\u76E3\u7763\u8005\u304C\u5C45\u306A\u3044\u305F\u3081\u7D42\u4E86\u3057\u307E\u305B\u3093\uFF08systemd \u914D\u4E0B\u306A\u3089\u81EA\u52D5\u30FB\u4ED6\u306E\u76E3\u7763\u4E0B\u3067\u306F TWP_LOOP_AUTO_RESTART=1 \u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`}}const minUptimeMs=input.
|
|
314
308
|
minUptimeMs??DEFAULT_MIN_UPTIME_MS;if(input.uptimeMs<minUptimeMs){return{action:"warn",key:`too-young:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u304C\u3001\u8D77\u52D5\u304B\u3089 ${Math.trunc(input.uptimeMs/1e3)}\u79D2 \u3057\u304B\u7D4C\u3063\u3066\u3044\u307E\u305B\u3093\uFF08${Math.trunc(minUptimeMs/6e4)}\u5206 \u672A\u6E80\u306F\u518D\u8D77\u52D5\u3057\u307E\u305B\u3093\u3002\u901F\u3044\u518D\u8D77\u52D5\u30EB\u30FC\u30D7\u3092\u907F\u3051\u308B\u305F\u3081\uFF09`}}
|
|
315
309
|
if(previousAttempt!==null&&previousAttempt.to===installedVersion){return{action:"warn",key:`repeat:${installedVersion}`,reason:`\u7248\u30C9\u30EA\u30D5\u30C8\uFF08${drift}\uFF09\u304C\u518D\u8D77\u52D5\u5F8C\u3082\u89E3\u6D88\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u524D\u56DE ${previousAttempt.at} \u306B ${previousAttempt.to} \u3092\u76EE\u6A19\u306B\u518D\u8D77\u52D5\u6E08\u307F\uFF09\u3002\u81EA\u52D5\u518D\u8D77\u52D5\u3092\u7E70\u308A\u8FD4\u3055\u305A\u505C\u6B62\u3057\u307E\u3059\u3002\u5C0E\u5165\u5148\u3068\u8D77\u52D5\u7D4C\u8DEF\u304C\u540C\u3058\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044`}}
|
|
316
|
-
return{action:"restart",from:runningVersion,to:installedVersion}}function resolveAutoRestart(env){const raw=(env["TWP_LOOP_AUTO_RESTART"]??"").trim().toLowerCase();if(raw==="0"||raw==="false")return{supervised:false,disabled:true};if(raw==="1"||raw==="true")return{supervised:true,disabled:false};return{supervised:(env["INVOCATION_ID"]??"")!=="",disabled:false}}function restartAttemptPath(stateDir,projectKey){return
|
|
317
|
-
function readRestartAttempt(stateDir,projectKey,deps={}){const read=deps.readFileSync??(p=>
|
|
318
|
-
return{from,to,at:typeof at==="string"?at:""}}catch{return null}}function writeRestartAttempt(stateDir,projectKey,attempt,deps={}){const write=deps.writeFileSync??((p,d)=>
|
|
319
|
-
`);return true}catch{return false}}function clearRestartAttempt(stateDir,projectKey,deps={}){const rm=deps.rmSync??(p=>
|
|
310
|
+
return{action:"restart",from:runningVersion,to:installedVersion}}function resolveAutoRestart(env){const raw=(env["TWP_LOOP_AUTO_RESTART"]??"").trim().toLowerCase();if(raw==="0"||raw==="false")return{supervised:false,disabled:true};if(raw==="1"||raw==="true")return{supervised:true,disabled:false};return{supervised:(env["INVOCATION_ID"]??"")!=="",disabled:false}}function restartAttemptPath(stateDir,projectKey){return path6.join(stateDir,`task-loop-${projectKey}.restart.json`)}var MAX_RESTART_ATTEMPT_BYTES=4096;
|
|
311
|
+
function readRestartAttempt(stateDir,projectKey,deps={}){const read=deps.readFileSync??(p=>fs8.readFileSync(p,"utf8"));const size=deps.statSize??(p=>fs8.statSync(p).size);const target=restartAttemptPath(stateDir,projectKey);try{if(size(target)>MAX_RESTART_ATTEMPT_BYTES)return null;const raw=read(target);if(raw.length>MAX_RESTART_ATTEMPT_BYTES)return null;const parsed=JSON.parse(raw);const from=parsed.from;const to=parsed.to;const at=parsed.at;if(typeof from!=="string"||typeof to!=="string")return null;
|
|
312
|
+
return{from,to,at:typeof at==="string"?at:""}}catch{return null}}function writeRestartAttempt(stateDir,projectKey,attempt,deps={}){const write=deps.writeFileSync??((p,d)=>fs8.writeFileSync(p,d,{flag:"wx",mode:384}));clearRestartAttempt(stateDir,projectKey,deps);try{write(restartAttemptPath(stateDir,projectKey),`${JSON.stringify(attempt)}
|
|
313
|
+
`);return true}catch{return false}}function clearRestartAttempt(stateDir,projectKey,deps={}){const rm=deps.rmSync??(p=>fs8.rmSync(p,{recursive:true,force:true}));try{rm(restartAttemptPath(stateDir,projectKey))}catch{}}function installAgeDays(installedAtMs,nowMs){if(installedAtMs===null||!Number.isFinite(installedAtMs))return null;const days=(nowMs-installedAtMs)/864e5;return days<0?0:days}function watchVersionDrift(opts,handlers){const now=opts.now??Date.now;const find=opts.findInstalled??(()=>findInstalledPackage());
|
|
320
314
|
const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)return;const installed=find();const decision=decideOnDrift({runningVersion:opts.runningVersion,installedVersion:installed?.version??null,supervised:opts.supervised,disabled:opts.disabled,uptimeMs:now()-startedAtMs,...opts.minUptimeMs===void 0?{}:{minUptimeMs:opts.minUptimeMs},previousAttempt:readRestartAttempt(opts.stateDir,opts.projectKey,opts.store)});if(decision.action==="none")return;if(decision.action==="warn"){if(warned===
|
|
321
315
|
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`)}
|
|
322
|
-
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
|
|
323
|
-
`);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=>
|
|
324
|
-
pid
|
|
316
|
+
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 fs9 from"fs";import path7 from"path";var POLL_MS=1e3;var MAX_STOP_BYTES=4096;var MAX_AT_LENGTH=64;function markerPath(lockDir2,kind){return path7.join(lockDir2,kind)}function requestMarker(lockDir2,kind,pid,deps={}){const target=markerPath(lockDir2,kind);const write=deps.writeFileSync??((p,d)=>fs9.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()})}
|
|
317
|
+
`);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=>fs9.readFileSync(p,"utf8"));const size=deps.statSize??(p=>fs9.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)||
|
|
318
|
+
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=>fs9.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-PNA4UF4I.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-PNA4UF4I.js");const extraHosts=config.
|
|
325
319
|
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},compileCommand:config.compileCommand??void 0,launcherBin:config.claudeLauncher.bin,...extraHosts.length>0?{preflightHosts:[...DEFAULT_PREFLIGHT_HOSTS,...extraHosts]}:{}})}function lockDir(config){
|
|
326
|
-
return
|
|
320
|
+
return path8.join(config.stateDir,`task-loop-${projectFileKey(config.projectId)}.lock.d`)}async function runTaskLoop(opts){if(opts.action==="stop")return await stopLoop(opts);const profile=resolveProfile(opts.profile);let creds;try{creds=new AuthSession(profile.name,profile.apiUrl).loadOrThrow()}catch(err){process.stderr.write(`${err.message}
|
|
327
321
|
`);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.
|
|
328
322
|
message}
|
|
329
|
-
`);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-
|
|
323
|
+
`);return 1}const projectId=project.id;if(opts.action==="setup"){const{runSetup,parseAiList}=await import("./setup-ROGEF3UO.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(" / ")}
|
|
330
324
|
`);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}:{}})}const config=buildLoopConfig({projectId,projectRef,apiUrl,safeMode:opts.
|
|
331
325
|
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({apiUrl,projectId,session});if(opts.action==="status"||opts.action==="schedule"){for(const warning of config.warnings)process.stderr.write(`\u26A0\uFE0F ${warning}
|
|
332
326
|
`)}if(opts.action==="status")return showStatus(api,config);if(opts.action==="schedule"){const{runScheduleCommand}=await import("./schedule-command-YPKIO3FK.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}
|
|
333
327
|
`);return 2}try{assertKnownEngine(config.engine)}catch(err){if(err instanceof UnknownEngineError){process.stderr.write(`${err.message}
|
|
334
|
-
`);return 2}throw err}
|
|
335
|
-
S_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}`);
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
lockDir(config),"
|
|
345
|
-
|
|
328
|
+
`);return 2}throw err}fs10.mkdirSync(config.logDir,{recursive:true,mode:448});rotateLogs(config.logDir,config.logRetentionDays);const logFile=path8.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_OP\
|
|
329
|
+
S_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}\
|
|
330
|
+
\uFF09\u3002twp logout \u306F\u5224\u5B9A\u4E0D\u80FD\u3068\u3057\u3066\u62D2\u5426\u3057\u307E\u3059`)}for(const kind of["stop","drain"]){const existing=readMarker(lockDir(config),kind);if(existing===null||existing.pid!==process.pid)clearMarker(lockDir(config),kind)}const runner=new RunnerSession(api,config,log);log.separator();log.log("twp task-loop \u958B\u59CB");log.log(` PROJECT: ${config.projectRef}\uFF08${config.projectId}\uFF09`);log.log(` API: ${api.baseUrl}`);log.log(` RUNNER_ID: ${config.
|
|
331
|
+
runnerId}`);log.log(` RUN_ID: ${config.runId}`);log.log(` ENGINE: ${config.engine}${config.engine==="noop"?"\uFF08\u26A0\uFE0F AI \u306F\u8D77\u52D5\u3057\u307E\u305B\u3093\uFF09":""}`);log.log(` AI_CONFIG_HASH: ${config.configHash}`);if(!config.charterEnabled){log.log(" CHARTER: \u524D\u7F6E\u3057\u307E\u305B\u3093\uFF08charter_enabled=false\uFF09")}else{const wrap=config.charterPrefix===null&&config.charterSuffix===null?"":"\u30FB\u56F2\u307F\u6587\u306F\u4E0A\u66F8\u304D";log.log(` CHART\
|
|
332
|
+
ER: ${config.charterFile??"(\u306A\u3057)"}${wrap}`)}if(config.prefetch.length>0){log.log(` PREFETCH: ${config.prefetch.map(h=>h.id).join(", ")}`)}if(config.preflight.length>0){log.log(` PREFLIGHT: ${config.preflight.map(h=>h.id).join(", ")}`)}log.log(` MAX_CYCLES: ${config.daemon?"\u30C7\u30FC\u30E2\u30F3\uFF08\u7121\u5236\u9650\uFF09":config.maxCycles}`);log.log(` INTERVAL: ${config.intervalSec}s / SAFE_MODE: ${config.safeMode}`);log.log(` WORKSPACE: ${config.workspace}`);log.log(` LOG_D\
|
|
333
|
+
IR: ${config.logDir}`);const installed=findInstalledPackage();const autoRestart=resolveAutoRestart(process.env);if(installed===null){log.log(" CLI: \u5C0E\u5165\u5143\u306E package.json \u3092\u7279\u5B9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u7248\u30C9\u30EA\u30D5\u30C8\u306E\u76E3\u8996\u306F\u884C\u3044\u307E\u305B\u3093\uFF09")}else{const ageDays=installAgeDays(installed.installedAtMs,Date.now());const age=ageDays===null?"\u5C0E\u5165\u6642\u523B\u4E0D\u660E":`\u5C0E\u5165\u304B\u3089${ageDays.
|
|
334
|
+
toFixed(1)}\u65E5`;log.log(` CLI: ${installed.version}\uFF08${installed.packageJsonPath}\u30FB${age}\uFF09 / \u81EA\u52D5\u518D\u8D77\u52D5: ${autoRestart.disabled?"\u7121\u52B9":autoRestart.supervised?"\u6709\u52B9":"\u76E3\u7763\u8005\u306A\u3057"}`);const maxAge=Number.parseFloat(process.env["TWP_LOOP_INSTALL_MAX_AGE_DAYS"]??"");const threshold=Number.isFinite(maxAge)&&maxAge>0?maxAge:DEFAULT_INSTALL_MAX_AGE_DAYS;if(ageDays!==null&&ageDays>threshold&&isReleaseVersion(opts.version)){log.log(`\
|
|
335
|
+
\u26A0\uFE0F \u5C0E\u5165\u304B\u3089${ageDays.toFixed(1)}\u65E5 \u7D4C\u904E\u3057\u3066\u3044\u307E\u3059\uFF08\u3057\u304D\u3044\u5024 ${threshold}\u65E5\uFF09\u3002\`npm i -g @tocca-systems/twp-cli@latest\` \u3067\u66F4\u65B0\u3092\u691C\u8A0E\u3057\u3066\u304F\u3060\u3055\u3044\uFF08TWP_LOOP_INSTALL_MAX_AGE_DAYS \u3067\u8ABF\u6574\u30FB\u65B0\u3057\u3044\u7248\u306E\u6709\u7121\u306F\u78BA\u8A8D\u3057\u3066\u3044\u307E\u305B\u3093\uFF09`)}const previous=readRestartAttempt(config.stateDir,
|
|
336
|
+
projectFileKey(config.projectId));if(previous!==null&&previous.to===opts.version){log.log(` \u2139\uFE0F \u7248\u30C9\u30EA\u30D5\u30C8\u306B\u3088\u308B\u81EA\u52D5\u518D\u8D77\u52D5\u304C\u53CD\u6620\u3055\u308C\u307E\u3057\u305F\uFF08${previous.from} \u2192 ${opts.version}\uFF09`);clearRestartAttempt(config.stateDir,projectFileKey(config.projectId))}}log.separator();let exitCode;let loop=null;let shuttingDown=false;let stopWatcher=null;let drainWatcher=null;let driftWatcher=null;const pendingDrain={
|
|
337
|
+
value:null};const shutdown=async()=>{if(shuttingDown)return;shuttingDown=true;stopWatcher?.();drainWatcher?.();driftWatcher?.();await loop?.abortRunningAi();await loop?.shutdown();await runner.deregister();lock.release();log.close()};const onSignal=()=>{log.log("\u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F\u3002\u7D42\u4E86\u3057\u307E\u3059...");stopWatcher?.();drainWatcher?.();driftWatcher?.();void shutdown().catch(()=>void 0).then(()=>process.exit(130))};process.
|
|
338
|
+
once("SIGINT",onSignal);process.once("SIGTERM",onSignal);process.once("SIGHUP",onSignal);stopWatcher=watchMarker(lockDir(config),"stop",process.pid,req=>{log.log(`\u505C\u6B62\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${req.at||"\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,
|
|
339
|
+
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"}\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(
|
|
340
|
+
{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.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}\
|
|
346
341
|
\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`;if(loop===null)pendingDrain.value={reason,exitCode:EXIT_VERSION_DRIFT};else loop.requestDrain(reason,EXIT_VERSION_DRIFT)}});driftWatcher=watch.stop}try{await runner.checkHeartbeatInterval();await runner.registerOrThrow();runner.startHeartbeatWorker();log.log(` heartbeat: ${config.
|
|
347
342
|
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))});if(pendingDrain.value!==null){loop.requestDrain(pendingDrain.value.reason,pendingDrain.value.exitCode)}exitCode=await loop.run()}catch(err){if(err instanceof RunnerRegistrationError){exitCode=
|
|
348
343
|
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.projectRef}\uFF08${config.projectId}\uFF09
|
|
@@ -355,12 +350,12 @@ heartbeatIntervalSec}\u79D2\u3054\u3068\u306B\u9001\u4FE1${runner.heartbeatTimeo
|
|
|
355
350
|
`);continue}const items=pick(res.json,"items");const more=pick(res.json,"has_more")===true||pick(res.json,"pagination.has_more")===true;const counted=Array.isArray(items)?filterByStatus(items,status).length:null;out.write(`${status}: ${counted??"?"}\u4EF6${more?"\u4EE5\u4E0A":""}
|
|
356
351
|
`)}const state=await api.request("GET","/state");if(state.ok){const planning=pick(state.json,"state.planning")===true;out.write(`\u8A08\u753B\u30ED\u30C3\u30AF: ${planning?`\u4FDD\u6301\u4E2D\uFF08${pick(state.json,"state.plan_owner_runner_id")??"?"} / \u671F\u9650 ${pick(state.json,"state.plan_lock_expires_at")??"?"}\uFF09`:"\u7A7A\u304D"}
|
|
357
352
|
`)}const lock=lockDir(config);out.write(`
|
|
358
|
-
\u30ED\u30FC\u30AB\u30EB\u30ED\u30C3\u30AF: ${
|
|
353
|
+
\u30ED\u30FC\u30AB\u30EB\u30ED\u30C3\u30AF: ${fs10.existsSync(lock)?`\u4FDD\u6301\u4E2D\uFF08${lock}\uFF09`:"\u7121\u3057"}
|
|
359
354
|
`);return 0}var STOP_WAIT_MS=18e4;var STOP_POLL_MS=250;function defaultIsAlive(pid){try{process.kill(pid,0);return true}catch(err){return err.code==="EPERM"}}async function stopLoop(opts,deps={}){const platform=deps.platform??process.platform;const isLoopProcess=deps.isLoopProcess??defaultIsLoopProcess;const isAlive=deps.isAlive??defaultIsAlive;const waitMs=deps.waitMs??STOP_WAIT_MS;const pollMs=deps.pollMs??STOP_POLL_MS;const now=deps.now??Date.now;const nap=deps.sleep??(ms=>new Promise(r=>setTimeout(
|
|
360
|
-
r,ms)));const request=deps.requestMarkerFn??requestMarker;const out=m=>void process.stdout.write(m);const err=m=>void process.stderr.write(m);if(opts.force&&opts.drain){err("\u26A0\uFE0F --force \u3068 --drain \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u8981\u6C42\u304C\u6B63\u53CD\u5BFE\u3067\u3059\uFF09\u3002\u3069\u3061\u3089\u3082\u5B9F\u884C\u3057\u307E\u305B\u3093\n");return 2}const stateDir=deps.stateDir??loopStateDir();let dirs;try{dirs=
|
|
355
|
+
r,ms)));const request=deps.requestMarkerFn??requestMarker;const out=m=>void process.stdout.write(m);const err=m=>void process.stderr.write(m);if(opts.force&&opts.drain){err("\u26A0\uFE0F --force \u3068 --drain \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u8981\u6C42\u304C\u6B63\u53CD\u5BFE\u3067\u3059\uFF09\u3002\u3069\u3061\u3089\u3082\u5B9F\u884C\u3057\u307E\u305B\u3093\n");return 2}const stateDir=deps.stateDir??loopStateDir();let dirs;try{dirs=fs10.readdirSync(stateDir).
|
|
361
356
|
filter(d=>/^task-loop-.*\.lock\.d$/.test(d))}catch{dirs=[]}if(opts.project){if(/^[0-9a-f-]{36}$/i.test(opts.project)){dirs=dirs.filter(d=>d===`task-loop-${opts.project}.lock.d`)}else if(isPrivateProjectRef(opts.project)){dirs=dirs.filter(d=>d.startsWith("task-loop-private-"))}else{err(`\u26A0\uFE0F --project \u306F UUID \u6307\u5B9A\u306E\u3068\u304D\u3060\u3051\u7D5E\u308A\u8FBC\u3081\u307E\u3059\uFF08${safe(opts.project)} \u306F\u30AD\u30FC\u5F62\u5F0F\u306B\u898B\u3048\u307E\u3059\uFF09\u3002\u3053\u306E\u30DE\u30B7\u30F3\u306E task-loop ${dirs.
|
|
362
357
|
length}\u4EF6\u3059\u3079\u3066\u3092\u5BFE\u8C61\u306B\u3057\u307E\u3059
|
|
363
|
-
`)}}if(dirs.length===0){out("\u3053\u306E\u30DE\u30B7\u30F3\u3067\u7A3C\u50CD\u4E2D\u306E task-loop \u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\n");return 0}const startedAt=now();const targets=[];for(const dir of dirs){const lockDirPath=
|
|
358
|
+
`)}}if(dirs.length===0){out("\u3053\u306E\u30DE\u30B7\u30F3\u3067\u7A3C\u50CD\u4E2D\u306E task-loop \u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\n");return 0}const startedAt=now();const targets=[];for(const dir of dirs){const lockDirPath=path8.join(stateDir,dir);let pid;try{pid=Number.parseInt(fs10.readFileSync(path8.join(lockDirPath,"pid"),"utf8").trim(),10)}catch{continue}if(!Number.isInteger(pid)||pid<=0)continue;if(!isLoopProcess(pid)){out(`\u6B8B\u9AB8\u306E\u30ED\u30C3\u30AF\u3092\u691C\u51FA\u3057\u307E\u3057\u305F\uFF08pid=${pid}\
|
|
364
359
|
\u306F task-loop \u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002\u505C\u6B62\u8981\u6C42\u306F\u9001\u308A\u307E\u305B\u3093: ${safe(dir)}
|
|
365
360
|
`);continue}targets.push({dir,lockDir:lockDirPath,pid,requested:false})}if(targets.length===0){out("\u7A3C\u50CD\u4E2D\u306E\u30D7\u30ED\u30BB\u30B9\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u6B8B\u9AB8\u306E\u30ED\u30C3\u30AF\u306F\u6B21\u56DE\u8D77\u52D5\u6642\u306B\u5F15\u304D\u53D6\u3089\u308C\u307E\u3059\uFF09\u3002\n");return 0}if(opts.drain)return drainLoops(targets,{out,err,request});for(const t of targets){const result=request(t.lockDir,"stop",t.pid);t.requested=
|
|
366
361
|
result.ok;if(!result.ok){err(`\u26A0\uFE0F pid=${t.pid} \u3078\u505C\u6B62\u8981\u6C42\u3092\u66F8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${result.reason}\uFF09: ${safe(t.dir)}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{defaultIsLoopProcess,readLockOwner,sameTwpHome}from"./chunk-3WHC4FSG.js";import{loopStateDir}from"./chunk-BYRM4NSC.js";import"./chunk-NWABK3RZ.js";import"./chunk-N2UVRM3Z.js";import"./chunk-GY7KI5E5.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import{twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";var PIDLESS_GRACE_MS=6e4;function defaultStateDirs(env){const dirs=[loopStateDir(env),loopStateDir({})].map(d=>path.resolve(d));return[...new Set(dirs)]}function readPidFile(lockDir){try{const raw=fs.readFileSync(path.join(lockDir,"pid"),"utf8").split("\n")[0]?.trim()??"";const n=Number.parseInt(raw,10);return{pid:Number.isInteger(n)&&n>0?n:null,error:null}}catch(err){const code=err.code;return{pid:null,error:code==="ENOENT"?null:code??err.message}}}function findLoopsUsingProfile(profileName,deps={}){
|
|
4
|
+
const env=deps.env??process.env;const now=deps.now??Date.now;const isLoopProcess=deps.isLoopProcess??defaultIsLoopProcess;const myHome=twpHomeDir(env);const result={users:[],undetermined:[]};for(const stateDir of deps.stateDirs??defaultStateDirs(env)){let dirs;try{dirs=fs.readdirSync(stateDir).filter(d=>/^task-loop-.*\.lock\.d$/.test(d))}catch(err){if(err.code==="ENOENT")continue;result.undetermined.push({pid:null,lockDir:stateDir,reason:`\u30ED\u30C3\u30AF\u306E\u7F6E\u304D\u5834\u6240\u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${err.
|
|
5
|
+
code??err.message}\uFF09`});continue}for(const dir of dirs){const lockDir=path.join(stateDir,dir);const pidFile=readPidFile(lockDir);if(pidFile.error!==null){result.undetermined.push({pid:null,lockDir,reason:`pid \u3092\u8AAD\u3081\u307E\u305B\u3093\uFF08${pidFile.error}\uFF09`});continue}const owner=readLockOwner(lockDir);let pid=pidFile.pid;if(pid===null){if(owner.ok){pid=owner.owner.pid}else{let ageMs=null;try{ageMs=now()-fs.statSync(lockDir).mtimeMs}catch{}if(ageMs!==null&&ageMs>=PIDLESS_GRACE_MS)
|
|
6
|
+
continue;result.undetermined.push({pid:null,lockDir,reason:"\u30ED\u30C3\u30AF\u306B pid \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u8D77\u52D5\u76F4\u5F8C\u306E\u53EF\u80FD\u6027\uFF09"});continue}}if(!isLoopProcess(pid))continue;if(!owner.ok){result.undetermined.push({pid,lockDir,reason:owner.reason});continue}if(owner.owner.pid!==pid){result.undetermined.push({pid,lockDir,reason:`\u6240\u6709\u8005\u306E\u8A18\u9332\uFF08pid=${owner.owner.pid}\uFF09\u304C\u30ED\u30C3\u30AF\u306E pid \u3068\u4E00\u81F4\u3057\u307E\u305B\u3093`});
|
|
7
|
+
continue}if(owner.owner.profile!==profileName)continue;if(!sameTwpHome(owner.owner.twp_home,myHome,deps.platform))continue;result.users.push({pid,projectRef:owner.owner.project_ref,projectId:owner.owner.project_id,lockDir})}}return result}function describeLogoutImpact(profileName,found,forced){const lines=[];if(found.users.length>0){lines.push(`\u26A0\uFE0F \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u300C${profileName}\u300D\u306E\u8CC7\u683C\u60C5\u5831\u3092\u3001\u3053\u306E\u30DE\u30B7\u30F3\u3067\u7A3C\u50CD\u4E2D\u306E twp task-loop \u304C\u4F7F\u3063\u3066\u3044\u307E\u3059\u3002`);
|
|
8
|
+
for(const u of found.users){const project=u.projectRef&&u.projectId&&u.projectRef!==u.projectId?`${u.projectRef}\uFF08${u.projectId}\uFF09`:u.projectRef||u.projectId||"?";lines.push(` - task-loop / \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8: ${project} / pid=${u.pid}`)}}if(found.undetermined.length>0){lines.push(found.users.length>0?" \u6B21\u306E\u30EB\u30FC\u30D7\u306F\u3001\u3069\u306E\u8CC7\u683C\u60C5\u5831\u3092\u4F7F\u3063\u3066\u3044\u308B\u304B\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u540C\u3058\u3082\u306E\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09:":
|
|
9
|
+
`\u26A0\uFE0F \u3053\u306E\u30DE\u30B7\u30F3\u306E twp task-loop \u304C\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u300C${profileName}\u300D\u3092\u4F7F\u3063\u3066\u3044\u308B\u304B\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u4F7F\u3063\u3066\u3044\u308B\u3082\u306E\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09\u3002`);for(const u of found.undetermined){lines.push(` - pid=${u.pid??"?"} / ${u.reason} / \u30ED\u30C3\u30AF: ${u.lockDir}`)}}lines.push("");lines.push("\u30ED\u30B0\u30A2\u30A6\u30C8\u3059\u308B\u3068:");
|
|
10
|
+
lines.push(" - \u305D\u306E\u30EB\u30FC\u30D7\u306E\u4EE5\u5F8C\u306E API \u547C\u3073\u51FA\u3057\u304C\u3059\u3079\u3066\u300C\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u300D\u3067\u5931\u6557\u3057\u3001\u30EB\u30FC\u30D7\u306F\u6B62\u307E\u308A\u307E\u3059");lines.push(" \uFF08heartbeat \u304C\u9014\u7D76\u3048\u3001\u4ED6\u306E\u6A5F\u4F53\u304B\u3089\u306F\u300C\u5FDC\u7B54\u306A\u3057\u300D\u306B\u898B\u3048\u307E\u3059\uFF09");lines.push(" - \u30B5\u30FC\u30D0\u5074\u306E\u30C8\u30FC\u30AF\u30F3\u3082\u5931\u52B9\u3059\u308B\u305F\u3081\u3001\u5FA9\u65E7\u306B\
|
|
11
|
+
\u306F `twp login` \u306E\u3084\u308A\u76F4\u3057\u304C\u8981\u308A\u307E\u3059");lines.push("");if(forced){lines.push("--force \u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u30ED\u30B0\u30A2\u30A6\u30C8\u3092\u7D9A\u884C\u3057\u307E\u3059\u3002")}else{lines.push("\u30ED\u30B0\u30A2\u30A6\u30C8\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002");lines.push(" - \u305D\u308C\u3067\u3082\u30ED\u30B0\u30A2\u30A6\u30C8\u3059\u308B\u306A\u3089: twp logout --force");lines.push(" \
|
|
12
|
+
- \u5225\u306E\u8CC7\u683C\u60C5\u5831\u3067\u8A66\u3059\u306A\u3089: TWP_HOME=$(mktemp -d) twp login\uFF08\u3053\u306E\u30DE\u30B7\u30F3\u306E\u30EB\u30FC\u30D7\u306B\u306F\u5F71\u97FF\u3057\u307E\u305B\u3093\uFF09");lines.push(" - \u5148\u306B\u30EB\u30FC\u30D7\u3092\u6B62\u3081\u308B\u306A\u3089: twp task-loop stop")}return stripTerminalControls(`${lines.join("\n")}
|
|
13
|
+
`)}export{describeLogoutImpact,findLoopsUsingProfile};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,displayCwd,runTurn}from"./chunk-
|
|
4
|
-
import"./chunk-
|
|
3
|
+
import{activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,currentBranch,displayCwd,runTurn}from"./chunk-MGKVUKU5.js";import"./chunk-N2UVRM3Z.js";import{getMode}from"./chunk-BOBSH3QN.js";import{RelayError,createRuntime,pickModel}from"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import{checkMinSupportedVersion,enforceMinSupportedVersion,floorNeedsRefresh}from"./chunk-DXXFUNYN.js";
|
|
4
|
+
import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";async function runOneShot(opts,deps={}){const out=deps.out??(text=>void process.stdout.write(stripTerminalControls(text)));const err=deps.err??(text=>void process.stderr.write(stripTerminalControls(text)));activateModeFiles(err);const permissionLayers=activatePermissionSettings(err,{...opts.allowedTools?{allowedTools:opts.allowedTools}:{},...opts.disallowedTools?{disallowedTools:opts.disallowedTools}:{}});const prompt=opts.fromStdin?await(deps.readStdin??readStdin)():opts.prompt;if(prompt.trim()===
|
|
5
5
|
""){err('\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u7A7A\u3067\u3059\u3002`twp -p "\u8CEA\u554F"`\uFF08`-p -` \u3067\u6A19\u6E96\u5165\u529B\uFF09\n');return 2}const runtime=deps.runtime??createRuntime({...opts.profile!==void 0?{profile:opts.profile}:{},...opts.model!==void 0?{model:opts.model}:{},cliVersion:opts.version});const cachedFloor=runtime.loadCachedFloor();if(await checkMinSupportedVersion({current:opts.version,cachedFloor:cachedFloor.minSupportedVersion,refresh:async()=>(await runtime.loadCatalog()).
|
|
6
6
|
minSupportedVersion,write:err})){return 1}if(!runtime.loggedIn){err("\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002`twp login` \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n");return 1}let model=runtime.configuredModel??"";let catalog=null;if(model===""){catalog=await runtime.loadCatalog();const picked=pickModel(catalog,void 0);model=picked.model;if(catalog.source!=="server"){err(`\u26A0 \u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081 ${model}\
|
|
7
7
|
\u3067\u5B9F\u884C\u3057\u307E\u3059\uFF08${catalog.source}\uFF09
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-2VISRLWS.js";import{isRecord,pick,requireResolved,withResolved}from"./chunk-GFC2ASHE.js";import{ApiResponseError,UsageError}from"./chunk-M3GWY6NT.js";import{collapsesInUrlPath,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";var LIST_COLUMNS=["id","code","name","status","effective_status"];var GET_COLUMNS=["id","code","name","status","effective_status","display_flg","closed_flg","task_enabled_flg","start_date","end_date","created_at","updated_at"];var MEMBER_COLUMNS=["user_id","user_name","user_email","role","alias","department_name"];function memberItems(body){const list=isRecord(body)?body["list"]:void 0;if(!Array.isArray(list)){throw new ApiResponseError("\u30E1\u30F3\u30D0\u30FC\u4E00\u89A7\u306E\u5FDC\u7B54\u306B list \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
4
4
|
return list}var listPaging=envelopePaging({label:"\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7"});function listItems(body){return listPaging.items(body)}function projectObject(body){const project=isRecord(body)?body["project"]:void 0;if(!isRecord(project)){throw new ApiResponseError("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u8A73\u7D30\u306E\u5FDC\u7B54\u306B project \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}return project}
|
|
5
5
|
var projectDomain={name:"project",summary:"\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u89A7\u30FB\u8A73\u7D30",operations:[{name:"list",summary:"\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u4E00\u89A7\u3059\u308B",usage:"twp project list [--all] [--limit <\u4EF6\u6570>] [--cursor <\u30AB\u30FC\u30BD\u30EB>] [--keyword <\u8A9E>] [--status <\u72B6\u614B>]",description:"--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002\n--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08id / code / name / status / effective_status\uFF09\u3067\u3059\u3002\n\u6B32\u3057\u3044\u5217\u3060\u3051\u3092\
|
|
6
6
|
\u6A5F\u68B0\u51E6\u7406\u3057\u305F\u3044\u3068\u304D\u306F --query \u3067\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08--query \u306F\u751F\u30C7\u30FC\u30BF\u306B\u5BFE\u3057\u3066\u8A55\u4FA1\u3055\u308C\u307E\u3059\uFF09\u3002\n\n"+LIST_PAGING_HELP,flags:[...LIST_FLAGS,{name:"--keyword",summary:"\u30B3\u30FC\u30C9\u30FB\u540D\u79F0\u306E\u90E8\u5206\u4E00\u81F4\u3067\u7D5E\u308A\u8FBC\u3080",takesValue:true,placeholder:"<\u8A9E>"},{name:"--status",summary:"\u30B9\u30C6\u30FC\u30BF\u30B9\u3067\u7D5E\u308A\u8FBC\u3080\uFF08\u4F8B: active\uFF09",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-
|
|
4
|
-
import"./chunk-
|
|
3
|
+
import{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain}from"./chunk-VGK2JMBW.js";import"./chunk-WVS4W5FY.js";import"./chunk-O52CUEDO.js";import"./chunk-FKIZ5ZJU.js";import"./chunk-QQRJLH6B.js";import"./chunk-XNLIEUAW.js";import"./chunk-MIMDLO52.js";import"./chunk-II5RVJQN.js";import"./chunk-JKSXUBND.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";
|
|
4
|
+
import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-2VISRLWS.js";import"./chunk-M3GWY6NT.js";import"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";export{CURATED_PAGING_VOCABULARY,buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,reportError,requiresYes,resolvePaging,runDomain};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{localConfigPath,parseClaudeLauncher}from"./chunk-BYRM4NSC.js";import{PromptAbortedError,promptText}from"./chunk-L37NS5L2.js";import{detectAiClis,formatDetection,isDetectableAi,isSelectable}from"./chunk-DEVIQH5U.js";import{AiConfig}from"./chunk-NWABK3RZ.js";import"./chunk-N2UVRM3Z.js";import"./chunk-GY7KI5E5.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
|
|
4
|
+
import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";var RECOMMENDED_ROTATION={complex:["claude"],verify:["claude"],security:["claude"],support:["claude"],triage:["claude"],search:["claude"],simple:["claude"]};var RECOMMENDED_CHAINS={complex:["claude","codex"],verify:["claude","codex","copilot"],security:["claude","codex","copilot"],support:["claude","codex","copilot"],triage:["codex","gemini","copilot","claude"],search:["codex","gemini","copilot","claude"],simple:["codex","gemini","copilot","claude"]};var PREFERENCE=["claude","codex","gemini","co\
|
|
4
5
|
pilot"];function buildAiAssignment(selected){if(selected.length===0)throw new Error("\u9078\u629E\u3055\u308C\u305FAI\u304C\u7A7A\u3067\u3059");const fallbackOrder=PREFERENCE.filter(ai=>selected.includes(ai));for(const ai of selected)if(!fallbackOrder.includes(ai))fallbackOrder.push(ai);const chains={};const rotation={};for(const category of Object.keys(RECOMMENDED_CHAINS)){const filtered=(RECOMMENDED_CHAINS[category]??[]).filter(ai=>selected.includes(ai));const chain=filtered.length>0?filtered:
|
|
5
6
|
[...fallbackOrder];chains[category]=chain;const rot=(RECOMMENDED_ROTATION[category]??[]).filter(ai=>selected.includes(ai));const head=chain[0];rotation[category]=rot.length>0?rot:head===void 0?[...fallbackOrder]:[head]}return{primary_rotation:rotation,fallback_chains:chains}}var SETUP_EXIT_NO_CLI=3;var SETUP_EXIT_ABORTED=130;async function runSetup(opts){const env=opts.env??process.env;const rawOut=opts.out??(t=>void process.stdout.write(t));const rawErr=opts.err??(t=>void process.stderr.write(t));
|
|
6
7
|
const out=t=>rawOut(stripTerminalControls(t));const err=t=>rawErr(stripTerminalControls(t));const rawAsk=opts.ask??promptText;const ask=q=>rawAsk(stripTerminalControls(q));const detect=opts.detect??detectAiClis;try{return await setupFlow(opts,{env,out,err,ask,detect})}catch(e){if(e instanceof PromptAbortedError){err("\n\u4E2D\u6B62\u3057\u307E\u3057\u305F\u3002\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306F\u4F5C\u6210\u3057\u3066\u3044\u307E\u305B\u3093\u3002\n \u5BFE\u8A71\u305B\u305A\u306B\u5B9F\u884C\u3059\u308B\u306B\u306F --yes \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002\n");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{PRIVATE_PROJECT_REF,isPrivateProjectRef}from"./chunk-GY7KI5E5.js";import{
|
|
4
|
-
import"./chunk-
|
|
3
|
+
import{repeatedValues}from"./chunk-O52CUEDO.js";import{PRIVATE_PROJECT_REF,isPrivateProjectRef}from"./chunk-GY7KI5E5.js";import"./chunk-QQRJLH6B.js";import{charCount,readBody}from"./chunk-QVXZEUKN.js";import{PRIVATE_TASKS_PATH,TASK_MASTERS}from"./chunk-MIMDLO52.js";import{PRIVATE_TASK_KEY_PREFIX,isPrivateTaskKey,isTaskKey}from"./chunk-II5RVJQN.js";import"./chunk-JKSXUBND.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";
|
|
4
|
+
import"./chunk-NHYMHCAT.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-2VISRLWS.js";import{acknowledgement,isRecord,pick,requireResolved,singleRef,withResolved}from"./chunk-GFC2ASHE.js";import{ApiResponseError,UsageError}from"./chunk-M3GWY6NT.js";import{isSafePathSegment,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";function classifyTaskRef(ref){const value=ref.trim();if(safeProjectIdPolicy.isDirectId(value))return{kind:"id",value};if(isTaskKey(value))return{kind:"key",value};return{kind:"unknown",value}}function wantsPrivateSurface(input){const project=input.flags.get("--project");return project!==void 0&&isPrivateProjectRef(project)}function taskSurface(input,ref){const project=input.flags.get("--project");const{kind,value}=classifyTaskRef(ref);if(project!==void 0&&isPrivateProjectRef(project)){if(kind===
|
|
5
5
|
"key"&&!isPrivateTaskKey(value)){throw new UsageError(`--project ${PRIVATE_PROJECT_REF}\uFF08\u500B\u4EBA\u30BF\u30B9\u30AF\uFF09\u306B ${value} \u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u306F ${PRIVATE_TASK_KEY_PREFIX}-<\u756A\u53F7> \u306E\u5F62\u3067\u3059\u3002ID\uFF08UUID / ULID\uFF09\u3067\u3082\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002
|
|
6
6
|
\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u3092\u6307\u3059\u306A\u3089 --project ${PRIVATE_PROJECT_REF} \u3092\u5916\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return"private"}if(kind==="key"&&isPrivateTaskKey(value)&&project===void 0){throw new UsageError(`${value} \u306F\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u306B\u3082\u3001\u30B3\u30FC\u30C9 ${PRIVATE_TASK_KEY_PREFIX} \u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u30AD\u30FC\u306B\u3082\u8AAD\u3081\u307E\u3059`,
|
|
7
7
|
`\u3069\u3061\u3089\u3092\u6307\u3059\u304B --project \u3067\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{fetchLatestVersion,isBehindLatest,runUpdate}from"./chunk-GTABFTZP.js";import"./chunk-FOFV2MNL.js";import"./chunk-XNLIEUAW.js";import"./chunk-PMOUHEJQ.js";import"./chunk-ILKQDXI5.js";import"./chunk-DXXFUNYN.js";import"./chunk-5WGOHFAS.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";export{fetchLatestVersion,isBehindLatest,runUpdate};
|