@tocca-systems/twp-cli 0.11.0 → 0.12.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 +45 -0
- package/README.md +12 -1
- package/dist/ai-dispatch-AAV7BYPB.js +77 -0
- package/dist/{backlog-62DCJY45.js → backlog-D7PL5FLC.js} +17 -5
- package/dist/{chunk-U457A23B.js → chunk-EOFANBVM.js} +1 -1
- package/dist/{chunk-7ZVTACQS.js → chunk-JKSXUBND.js} +4 -3
- package/dist/{chunk-Y46OQT4N.js → chunk-MZHTRHZS.js} +3 -3
- package/dist/chunk-NAQ7OCUV.js +17 -0
- package/dist/chunk-O52CUEDO.js +6 -0
- package/dist/chunk-QQRJLH6B.js +3 -0
- package/dist/{chunk-6G3AJ4JZ.js → chunk-QVXZEUKN.js} +1 -1
- package/dist/cli.js +9 -5
- package/dist/{commands-HS3KIPJ4.js → commands-HYHUXQZT.js} +13 -13
- package/dist/{commands-QKNOQRWT.js → commands-YPT6RK74.js} +1 -1
- package/dist/run-TCAJZMNJ.js +63 -0
- package/dist/{task-EY3XJHST.js → task-ZYBI6Z4U.js} +50 -13
- package/package.json +1 -1
- package/dist/ai-dispatch-T6PJ4DUG.js +0 -82
- package/dist/chunk-4QI5NX4C.js +0 -6
- package/dist/run-2GFG6YVB.js +0 -57
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-
|
|
3
|
+
import{EngineNotConfiguredError,NoopEngine,UnknownEngineError,aiUnavailableLabel,assertKnownEngine,failureHint,isAiUnavailable,needsHumanToRestoreAi}from"./chunk-NAQ7OCUV.js";import{buildLoopConfig,describeOperations,evaluateOwnership,formatHookIds,formatHookWiring,localDate,loopStateDir,runPrefetch,runPreflight}from"./chunk-56TC423T.js";import{claudeConfigDir,exclusiveInflightEntries,formatExclusiveEntry,normalizeSkillName,resolveDetectDeps,skillOfItem,spawnSyncResolved}from"./chunk-3WJHTPOZ.js";
|
|
4
4
|
import{AgentLoopApi,REQUIRE_ZERO_STATUS,ScheduleApi,collectDue,describeError,filterByStatus,gateStatus,isPermanent,nowInZone,parseCounts,pick,pickString,promptSection}from"./chunk-N56AWWTM.js";import{killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{PRIVATE_PROJECT_REF,isPrivateProjectRef,privateProjectId,projectFileKey}from"./chunk-GY7KI5E5.js";import{extractLeadingTaskKey}from"./chunk-II5RVJQN.js";import{resolveProjectRef,uuidProjectIdPolicy}from"./chunk-5QCAIKFE.js";
|
|
5
5
|
import{compareVersionCores,parseVersionCore}from"./chunk-DXXFUNYN.js";import{joinFor}from"./chunk-PMOUHEJQ.js";import{AuthSession}from"./chunk-63LDNYGW.js";import{effectiveApiUrl,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs11 from"fs";import path9 from"path";import{execFileSync}from"child_process";import fs from"fs";import path from"path";var DEFAULT_GRACE_MS=6e4;var InstanceLock=class{constructor(lockDir2,opts={}){this.lockDir=lockDir2;this.opts=opts}lockDir;opts;owned=null;acquire(){const mine=this.tryMkdir();if(mine)return{acquired:true,reason:"",note:null};const oldPid=this.readPid();if(oldPid!==null){if(this.isLoop(oldPid)){return{acquired:false,reason:`\u540C\u3058\u30DE\u30B7\u30F3\u3067\u5225\u306E task-loop \u304C\u7A3C\u50CD\u4E2D\u3067\u3059\uFF08pid=${oldPid} / \u30ED\u30C3\u30AF: ${this.lockDir}\uFF09`,note:null}}const note=`\
|
|
6
6
|
\u30ED\u30C3\u30AF\u306EPID ${oldPid} \u306F\u5225\u306E\u30D7\u30ED\u30BB\u30B9\u306B\u518D\u5229\u7528\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u30EB\u30FC\u30D7\u3067\u306F\u306A\u3044\uFF09\u2192 \u6B8B\u9AB8\u3068\u3057\u3066\u5F15\u304D\u53D6\u308A\u307E\u3059`;return this.takeOver(note)}const age=this.lockAgeMs();const grace=this.opts.graceMs??DEFAULT_GRACE_MS;if(age===null||age<grace){return{acquired:false,reason:`\u30ED\u30C3\u30AF\u304C\u4F5C\u6210\u76F4\u5F8C\u306E\u305F\u3081\u5F85\u6A5F\u5074\u306B\u5012\u3057\u307E\u3059\uFF08\u30ED\u30C3\u30AF: ${this.
|
|
@@ -173,12 +173,12 @@ return"failed"}stash(itemId,payload){if(!/^[A-Za-z0-9_-]+$/.test(itemId))return
|
|
|
173
173
|
continue}try{const ageDays=(now-fs7.statSync(file).mtimeMs)/864e5;if(ageDays>this.config.writebackMaxAgeDays){fs7.rmSync(file,{force:true});this.log.log(` \u26D4 \u9000\u907F\u304B\u3089 ${this.config.writebackMaxAgeDays} \u65E5\u3092\u8D85\u3048\u305F\u305F\u3081\u7834\u68C4\u3057\u307E\u3057\u305F: item=${itemId}`);continue}}catch{continue}let payload;try{payload=JSON.parse(fs7.readFileSync(file,"utf8"))}catch{fs7.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}`);
|
|
174
174
|
continue}const{run_id:runId,...rest}=payload;const res=await this.api.update(itemId,rest,runId||this.config.runId);if(res.ok){fs7.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){fs7.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}\
|
|
175
175
|
\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){fs7.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\
|
|
176
|
-
\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"}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";
|
|
177
|
-
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=
|
|
178
|
-
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.
|
|
179
|
-
|
|
180
|
-
ms)}sleepUnlessDraining(ms){if(this.draining)return Promise.resolve();return new Promise(resolve=>{let timer=null;let settled=false;const wake=()=>{if(settled)return;settled=true;if(timer!==null)clearTimeout(timer);this.drainWaiters.delete(wake);resolve()};this.drainWaiters.add(wake);const injected=this.deps.sleepFn;if(injected)void injected(ms).then(wake);else timer=setTimeout(wake,ms)})}requestDrain(reason,exitCode=0){if(this.draining)return;this.draining=true;this.drainExitCode=
|
|
181
|
-
itemInFlight;const why=reason.trim()===""?"\u7406\u7531\u4E0D\u660E":reason;this.deps.log.log(running===null?`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\uFF09\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u3092\u53D6\u3089\u305A\u306B\u7D42\u4E86\u3057\u307E\u3059\u3002`:`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\
|
|
176
|
+
\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";
|
|
177
|
+
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=
|
|
178
|
+
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.
|
|
179
|
+
config.ai.usesAi("claude"),check:()=>checkWorkspaceTrust(deps.config.workspace,{launcherBin:deps.config.claudeLauncher.bin})});this.timestamp=new Date().toISOString().replace(/[-:]/g,"").replace(/\..*$/,"")}deps;writeback;schedule;planLock;engine;releaseLog;postDeps;timestamp;deferredIds=new Set;midcycleEnqueued=0;aborting=false;draining=false;drainExitCode=0;drainWaiters=new Set;itemInFlight=null;ownershipLostItemId=null;abortDrained=null;cyclePreflightSection="";trustGate;sleep(ms){return(this.
|
|
180
|
+
deps.sleepFn??sleep)(ms)}sleepUnlessDraining(ms){if(this.draining)return Promise.resolve();return new Promise(resolve=>{let timer=null;let settled=false;const wake=()=>{if(settled)return;settled=true;if(timer!==null)clearTimeout(timer);this.drainWaiters.delete(wake);resolve()};this.drainWaiters.add(wake);const injected=this.deps.sleepFn;if(injected)void injected(ms).then(wake);else timer=setTimeout(wake,ms)})}requestDrain(reason,exitCode=0){if(this.draining)return;this.draining=true;this.drainExitCode=
|
|
181
|
+
exitCode;const running=this.itemInFlight;const why=reason.trim()===""?"\u7406\u7531\u4E0D\u660E":reason;this.deps.log.log(running===null?`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\uFF09\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u65B0\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u3092\u53D6\u3089\u305A\u306B\u7D42\u4E86\u3057\u307E\u3059\u3002`:`\u30C9\u30EC\u30A4\u30F3\u8981\u6C42\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF08${why}\
|
|
182
182
|
\uFF09\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\uFF08${running}\uFF09\u3092\u5B8C\u8D70\u3055\u305B\u3066\u304B\u3089\u7D42\u4E86\u3057\u307E\u3059\u3002`);const waiters=[...this.drainWaiters];this.drainWaiters.clear();for(const w of waiters)w()}cooldownNote(outcome){if(outcome!=="rate-limited")return"";const remaining=this.deps.config.ai.minCooldownRemainingSec();return remaining===null?"":`\uFF08\u6700\u77ED\u306E\u89E3\u9664\u307E\u3067\u7D04${remaining}\u79D2\uFF09`}startOwnershipWatch(itemId){
|
|
183
183
|
const{config,log,api}=this.deps;const intervalSec=config.ownershipCheckIntervalSec;if(intervalSec<=0)return{stop:()=>{}};let stopped=false;let checking=false;let unknownLogged=false;const timer=setInterval(()=>{if(stopped||checking)return;checking=true;void(async()=>{try{const res=await api.getItem(itemId);const check=evaluateOwnership(res.json?.item??null,config.runnerId,config.runId);if(stopped)return;if(check.verdict==="unknown"){if(!unknownLogged){unknownLogged=true;log.log(` \u26A0\uFE0F \u6240\u6709\u6A29\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\
|
|
184
184
|
\u3093\u3067\u3057\u305F\uFF08${check.reason}\uFF09\u3002\u76E3\u8996\u306F\u7D9A\u3051\u307E\u3059\u304C\u5B9F\u884C\u306F\u6B62\u3081\u307E\u305B\u3093`)}return}if(check.verdict!=="lost")return;stopped=true;clearInterval(timer);this.ownershipLostItemId=itemId;log.log(` \u26D4 \u5B9F\u884C\u4E2D\u306B\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306E\u6240\u6709\u6A29\u3092\u5931\u3044\u307E\u3057\u305F: ${check.reason}`);log.log(" **AI \u3092\u3053\u3053\u3067\u505C\u6B62\u3057\u307E\u3059**\uFF08\u7D9A\u3051\u3066\u3082\u7D50\u679C\u306F\u66F8\u304D\u623B\u305B\u305A\u3001PR\u30FB\u30B3\u30E1\u30F3\u30C8\u3060\u3051\u304C\u91CD\u8907\u3057\u307E\u3059\uFF09");
|
|
@@ -265,11 +265,11 @@ g`);const startedAt=Date.now();const taggedCategory=/#ai:([a-z]+)/.exec(label)?.
|
|
|
265
265
|
\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"},
|
|
266
266
|
config.runId);if(res.status===409){log.log(` \u26A0\uFE0F \u30AD\u30E5\u30FC\u3078\u8FD4\u305D\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`)}else if(res.ok){log.log(" \u2192 \u30A2\u30A4\u30C6\u30E0\u3092 pending \u306B\u623B\u3057\u307E\u3057\u305F\uFF08\u6B21\u306E\u8D77\u52D5\u3067\u62FE\u3044\u76F4\u3057\u307E\u3059\uFF09")}else{log.log(` \u26A0\uFE0F pending \u3078\u623B\
|
|
267
267
|
\u305B\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002\u30B5\u30FC\u30D0\u306E\u56DE\u53CE\u3092\u5F85\u3061\u307E\u3059: item=${itemId}`)}log.log(" \u2192 \u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u5C65\u6B74\u306B\u306F\u8A18\u9332\u3057\u307E\u305B\u3093\uFF08\u505C\u6B62\u64CD\u4F5C\u304C\u539F\u56E0\u306E\u305F\u3081\uFF09");this.abortDrained?.();this.abortDrained=null;stop=true;break}if(isAiUnavailable(result.outcome)){unexecuted+=1;if(needsHumanToRestoreAi(
|
|
268
|
-
result.outcome))unexecutedNeedsHuman=true;log.log(`[${stepNum}] ${label} \u2192 \u672A\u5B9F\u884C [ai=${result.usedAi||"-"}] (${durationSec}s)`);log.log(` \u23ED AI \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);if(needsHumanToRestoreAi(result.outcome))log.log(` ${AI_RECOVERY_HINT}`);const res=await api.update(itemId,{status:"pending",result:truncateResult(result.output),error_message
|
|
269
|
-
status===409){log.log(` \u26A0\uFE0F \u30AD\u30E5\u30FC\u3078\u8FD4\u305D\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`)}else if(res.ok){log.log(" \u2192 \u30A2\u30A4\u30C6\u30E0\u3092 pending \u306B\u623B\u3057\u307E\u3057\u305F\uFF08\u4ED6\u306E\u53F0\u304C\u5B9F\u884C\u3067\u304D\u307E\u3059\uFF09")}else{log.log(` \u26A0\uFE0F
|
|
270
|
-
res)}\uFF09\u3002\u30B5\u30FC\u30D0\u306E\u56DE\u53CE\u3092\u5F85\u3061\u307E\u3059: item=${itemId}`)}log.log(" \u2192 \u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u5C65\u6B74\u306B\u306F\u8A18\u9332\u3057\u307E\u305B\u3093\uFF08\u67A0\u306F\u4ED6\u306E\u53F0\u304C\u6D88\u5316\u3067\u304D\u307E\u3059\uFF09");log.log(" \u2192 AI \u304C1\u3064\u3082\u4F7F\u3048\u306A\u3044\u305F\u3081\u3001\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306E Phase 2 \u306F\u6253\u3061\u5207\u308A\u307E\u3059");
|
|
271
|
-
outcome==="ok"?"completed":"failed";const errorMessage=result.outcome==="ok"?void 0
|
|
272
|
-
null:skillName,effort:result.metrics?.effort??null,exitReason:exitReasonFor(result.outcome),outcomeCode:parseOutcomeCode(result.output)}}));if(outcome!=="ok"){log.log(outcome==="lost"?`[${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)`:`[${stepNum}] ${label} \u2192 \u26A0\uFE0F \u5B9F\u884C\u306F\u7D42\u308F\u3063\u305F\u304C\u7D50\u679C\u3092\u66F8\u304D\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F [ai=${result.
|
|
268
|
+
result.outcome))unexecutedNeedsHuman=true;log.log(`[${stepNum}] ${label} \u2192 \u672A\u5B9F\u884C [ai=${result.usedAi||"-"}] (${durationSec}s)`);log.log(` \u23ED AI \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08outcome=${result.outcome}\uFF09`);if(needsHumanToRestoreAi(result.outcome))log.log(` ${AI_RECOVERY_HINT}`);const res=await api.update(itemId,{status:"pending",result:truncateResult(result.output),error_message:withFailureHint(`not executed: ${result.outcome}`,
|
|
269
|
+
result.output)},config.runId);if(res.status===409){log.log(` \u26A0\uFE0F \u30AD\u30E5\u30FC\u3078\u8FD4\u305D\u3046\u3068\u3057\u305F\u30A2\u30A4\u30C6\u30E0\u306F\u65E2\u306B\u5225\u306E\u30E9\u30F3\u30CA\u30FC\u304C\u4FDD\u6301\u3057\u3066\u3044\u307E\u3059\uFF08409\uFF09: item=${itemId}`)}else if(res.ok){log.log(" \u2192 \u30A2\u30A4\u30C6\u30E0\u3092 pending \u306B\u623B\u3057\u307E\u3057\u305F\uFF08\u4ED6\u306E\u53F0\u304C\u5B9F\u884C\u3067\u304D\u307E\u3059\uFF09")}else{log.log(` \u26A0\uFE0F \
|
|
270
|
+
pending \u3078\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${describeError(res)}\uFF09\u3002\u30B5\u30FC\u30D0\u306E\u56DE\u53CE\u3092\u5F85\u3061\u307E\u3059: item=${itemId}`)}log.log(" \u2192 \u5B9A\u671F\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u5C65\u6B74\u306B\u306F\u8A18\u9332\u3057\u307E\u305B\u3093\uFF08\u67A0\u306F\u4ED6\u306E\u53F0\u304C\u6D88\u5316\u3067\u304D\u307E\u3059\uFF09");log.log(" \u2192 AI \u304C1\u3064\u3082\u4F7F\u3048\u306A\u3044\u305F\u3081\u3001\u3053\u306E\u30B5\u30A4\u30AF\u30EB\u306E Phase 2 \u306F\u6253\u3061\u5207\u308A\u307E\u3059");
|
|
271
|
+
break}const status=result.outcome==="ok"?"completed":"failed";const errorMessage=result.outcome==="ok"?void 0:withFailureHint(`outcome: ${result.outcome}`,result.output);const outcome=await this.writeback.write(itemId,buildPayload({status,aiType:result.serverAiType,runId:config.runId,logText:result.output,...errorMessage?{errorMessage}:{},metrics:{durationMs:Date.now()-startedAt,turns:result.metrics?.turns??null,tokensIn:result.metrics?.tokensIn??null,tokensOut:result.metrics?.tokensOut??null,costUsd:result.
|
|
272
|
+
metrics?.costUsd??null,skill:skillName===""?null:skillName,effort:result.metrics?.effort??null,exitReason:exitReasonFor(result.outcome),outcomeCode:parseOutcomeCode(result.output)}}));if(outcome!=="ok"){log.log(outcome==="lost"?`[${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)`:`[${stepNum}] ${label} \u2192 \u26A0\uFE0F \u5B9F\u884C\u306F\u7D42\u308F\u3063\u305F\u304C\u7D50\u679C\u3092\u66F8\u304D\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F [ai=${result.
|
|
273
273
|
usedAi}] (${durationSec}s)`);log.log(" \u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306E\u5F8C\u51E6\u7406\uFF08\u5B9A\u671F\u67A0\u306E\u8A18\u9332\u30FB\u30EA\u30EA\u30FC\u30B9\u7D50\u679C\u306E\u8A18\u9332\u30FB\u5F8C\u7D9A\u6295\u5165\uFF09\u306F\u884C\u3044\u307E\u305B\u3093");continue dequeue}if(status==="completed"){completed+=1;log.log(`[${stepNum}] ${label} \u2192 \u5B8C\u4E86 [ai=${result.usedAi}] (${durationSec}s)`)}else if(result.outcome==="max-turns"){failed+=1;log.log(`[${stepNum}] ${label}\
|
|
274
274
|
\u2192 \u26A0\uFE0F \u30BF\u30FC\u30F3\u4E0A\u9650\u5230\u9054\u3067\u6253\u3061\u5207\u308A [ai=${result.usedAi}] (${durationSec}s)`)}else{failed+=1;log.log(`[${stepNum}] ${label} \u2192 \u5931\u6557 [ai=${result.usedAi}] (${durationSec}s)`)}if(this.deps.engine.name==="noop"){log.log(" \u23ED engine=noop \u306E\u305F\u3081\u5B9A\u671F\u67A0\u306E\u8A18\u9332\u30FB\u5B8C\u4E86\u5F8C\u51E6\u7406\u306F\u884C\u3044\u307E\u305B\u3093\uFF08AI \u3092\u8D77\u52D5\u3057\u3066\u3044\u306A\u3044\u306E\u3067\u5B9F\u4F53\u304C\u3042\u308A\u307E\u305B\u3093\uFF09");
|
|
275
275
|
continue dequeue}await this.schedule.recordByItem(itemId,status);if(status==="completed"){await this.runCompletionHooks(skillName,result.output,result.usedAi)}else if(result.outcome==="max-turns"){await this.runMaxTurnsHooks(skillName,result.output,result.usedAi)}await this.maybeEnqueueDueMidcycle()}log.separator();log.log(`Phase 2 \u5B8C\u4E86: ${completed} \u5B8C\u4E86 / ${failed} \u5931\u6557`+(unexecuted>0?` / ${unexecuted} \u672A\u5B9F\u884C`:"")+` (\u8A08 ${stepNum} \u30A2\u30A4\u30C6\u30E0)`);
|
|
@@ -312,7 +312,7 @@ const startedAtMs=now();let warned="";let done=false;const check=()=>{if(done)re
|
|
|
312
312
|
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`)}
|
|
313
313
|
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 fs10 from"fs";import path8 from"path";var POLL_MS=1e3;var MAX_STOP_BYTES=4096;var MAX_AT_LENGTH=64;function markerPath(lockDir2,kind){return path8.join(lockDir2,kind)}function requestMarker(lockDir2,kind,pid,deps={}){const target=markerPath(lockDir2,kind);const write=deps.writeFileSync??((p,d)=>fs10.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()})}
|
|
314
314
|
`);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=>fs10.readFileSync(p,"utf8"));const size=deps.statSize??(p=>fs10.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(
|
|
315
|
-
pid)||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=>fs10.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-
|
|
315
|
+
pid)||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=>fs10.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-AAV7BYPB.js");const{DEFAULT_PREFLIGHT_HOSTS}=await import("./ai-dispatch-AAV7BYPB.js");const extraHosts=config.
|
|
316
316
|
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){
|
|
317
317
|
return path9.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}
|
|
318
318
|
`);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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{PromptAbortedError,promptHidden,promptText}from"./chunk-L37NS5L2.js";import{system32}from"./chunk-N2UVRM3Z.js";import{ApiError,TwpApiClient}from"./chunk-
|
|
3
|
+
import{PromptAbortedError,promptHidden,promptText}from"./chunk-L37NS5L2.js";import{system32}from"./chunk-N2UVRM3Z.js";import{ApiError,TwpApiClient}from"./chunk-JKSXUBND.js";import{isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{AuthSession,NotLoggedInError,SessionExpiredError,deleteCredentials,loadCredentials,maskToken,saveCredentials}from"./chunk-63LDNYGW.js";import{effectiveApiUrl,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";
|
|
4
4
|
import{httpFetch}from"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import os from"os";import{createHash,randomBytes}from"crypto";function generatePkcePair(){const verifier=randomBytes(32).toString("base64url");return{verifier,challenge:computeChallenge(verifier),method:"S256"}}function computeChallenge(verifier){return createHash("sha256").update(verifier,"ascii").digest("base64url")}function generateState(){return randomBytes(16).toString("base64url")}import http from"http";import crypto from"crypto";function safeEqual(a,b){const x=Buffer.from(a,"utf8");const y=Buffer.from(b,"utf8");const len=Math.max(x.length,y.length,1);const px=Buffer.alloc(len);const py=Buffer.alloc(len);x.copy(px);y.copy(py);return crypto.timingSafeEqual(px,py)&&x.length===y.length}var LoginTimeoutError=class extends Error{constructor(timeoutMs){super(`\u30D6\u30E9\u30A6\u30B6\u3067\u306E\u627F\u8A8D\u3092 ${Math.round(timeoutMs/1e3)} \u79D2\u5F85\u3061\u307E\u3057\u305F\u304C\u5B8C\u4E86\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002twp login \u3092\u3084\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\
|
|
5
5
|
\u3044\u3002`)}};var SUCCESS_HTML=`<!doctype html><html lang="ja"><head><meta charset="utf-8"><title>TWP CLI \u30ED\u30B0\u30A4\u30F3\u5B8C\u4E86</title></head>
|
|
6
6
|
<body style="font-family: sans-serif; text-align: center; padding-top: 4rem; background:#f7f9fc; color:#1b2559">
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{stringWidth}from"./chunk-WVS4W5FY.js";import{GLOBAL_OPTIONS_HELP,HELP_TOKEN}from"./chunk-EOFANBVM.js";import{parseOperationArgs}from"./chunk-O52CUEDO.js";import"./chunk-QQRJLH6B.js";import{Resolver,requireDefaultProject}from"./chunk-MZHTRHZS.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JKSXUBND.js";import"./chunk-II5RVJQN.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,nextPageNotes,positiveInteger,shellQuote}from"./chunk-2SGDY6YP.js";
|
|
4
|
+
import{ApiResponseError,EXIT_API_CLIENT,EXIT_API_SERVER,EXIT_AUTH,EXIT_FAILURE,EXIT_OK,EXIT_USAGE,NetworkError,UsageError}from"./chunk-M3GWY6NT.js";import{ResolveError}from"./chunk-5QCAIKFE.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-63LDNYGW.js";import{effectiveApiUrl,loadUserConfig,resolveConfiguredOutput,resolveProfile}from"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";
|
|
5
|
+
import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import fs from"fs";import path from"path";var SENSITIVE_HEADERS=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-vercel-protection-bypass"]);var REDACTED="***\uFF08\u4F0F\u5B57\uFF09";var SECRET_KEY_PATTERN="[A-Za-z0-9_-]*(?:token|secret|password|passwd|api[_-]?key|credential)[A-Za-z0-9_-]*";function redactSecrets(text){return text.replace(/\bBearer\s+[^\s"'`,;)\]}]+/gi,`Bearer ${REDACTED}`).replace(new RegExp(`("${SECRET_KEY_PATTERN}"\\s*:\\s*)"(?:[^"\\\\]|\\\\.)*"`,"gi"),`$1"${REDACTED}\
|
|
6
|
+
"`).replace(new RegExp(`([?&]${SECRET_KEY_PATTERN}=)[^&\\s]+`,"gi"),`$1${REDACTED}`)}function formatHeaders(headers){if(!headers)return[];const entries=headers instanceof Headers?[...headers.entries()]:Array.isArray(headers)?headers:Object.entries(headers);return entries.map(([name,value])=>{const shown=SENSITIVE_HEADERS.has(name.toLowerCase())?REDACTED:redactSecrets(String(value));return` ${name.toLowerCase()}: ${shown}`})}var BODY_LIMIT=4e3;function formatBody(raw){const safe=stripTerminalControls(
|
|
7
|
+
redactSecrets(raw));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
|
|
8
|
+
\u2026\uFF08\u4EE5\u964D ${safe.length-BODY_LIMIT} \u6587\u5B57\u3092\u7701\u7565\uFF09`:safe}function isTextualContentType(contentType){if(contentType===null)return false;return/^\s*(text\/|application\/(json|xml|javascript|x-www-form-urlencoded)|application\/[\w.+-]*\+(json|xml))/i.test(contentType)}function withDebug(inner,options={}){const write=options.write??(text=>void process.stderr.write(text));const now=options.now??(()=>Date.now());return async(input,init)=>{const method=init?.method??
|
|
9
|
+
"GET";const lines=[`[debug] \u2192 ${method} ${redactSecrets(input)}`,...formatHeaders(init?.headers)];if(typeof init?.body==="string")lines.push(` ${formatBody(init.body)}`);write(`${lines.join("\n")}
|
|
10
|
+
`);const started=now();let res;try{res=await inner(input,init)}catch(err){write(`[debug] \u2717 \u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F (${now()-started}ms): ${redactSecrets(err.message)}
|
|
11
|
+
`);throw err}const out=[`[debug] \u2190 ${res.status} ${res.statusText} (${now()-started}ms)`,...formatHeaders(res.headers)];const contentType=res.headers.get("content-type");if(isTextualContentType(contentType)){const raw=await res.clone().text().catch(()=>"\uFF08\u672C\u6587\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF09");if(raw!=="")out.push(` ${formatBody(raw)}`)}else{const length=res.headers.get("content-length");out.push(` \uFF08\u672C\u6587\u306F ${contentType??"content-ty\
|
|
12
|
+
pe \u4E0D\u660E"}\u30FB${length===null?"\u30B5\u30A4\u30BA\u4E0D\u660E":`${length} \u30D0\u30A4\u30C8`}\u3002\u30C6\u30AD\u30B9\u30C8\u3067\u306A\u3044\u305F\u3081\u51FA\u529B\u3057\u306A\u3044\uFF09`)}write(`${out.join("\n")}
|
|
13
|
+
`);return res}}var OUTPUT_FORMATS=["json","table","text","tsv"];function isOutputFormat(value){return typeof value==="string"&&OUTPUT_FORMATS.includes(value)}function resolveOutputFormat(input){if(input.flag!==void 0){return isOutputFormat(input.flag)?input.flag:null}if(isOutputFormat(input.configured))return input.configured;return input.isTty?"table":"json"}function formatOutput(value,format){switch(format){case"json":return formatJson(value);case"table":return formatTable(value);case"text":return formatDelimited(
|
|
14
|
+
value," ");case"tsv":return formatDelimited(value," ")}}var JSON_UNSAFE_CONTROLS=/[\u007f-\u009f]/gu;function formatJson(value){const text=JSON.stringify(value===void 0?null:value,null,2);return text.replace(JSON_UNSAFE_CONTROLS,ch=>`\\u${ch.codePointAt(0)?.toString(16).padStart(4,"0")??""}`)}function cell(value){if(value===null||value===void 0)return"";if(typeof value==="string")return stripTerminalControls(value);if(typeof value==="number"||typeof value==="boolean"||typeof value==="bigint"){return String(
|
|
15
|
+
value)}return stripTerminalControls(JSON.stringify(value)??"")}function isPlainRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function collectColumns(rows){const columns=[];const seen=new Set;for(const row of rows){for(const key of Object.keys(row)){if(!seen.has(key)){seen.add(key);columns.push(key)}}}return columns}function renderRow(cells,widths){return cells.map((text,i)=>{if(i===cells.length-1)return text;const pad=Math.max(0,(widths[i]??0)-stringWidth(text));
|
|
16
|
+
return text+" ".repeat(pad)}).join(" ").trimEnd()}function singleLine(text){return stripTerminalControls(text).replace(/\t/g,"\\t").replace(/\n/g,"\\n")}function renderGrid(header,rows){const normalizedHeader=header?header.map(singleLine):null;const normalizedRows=rows.map(row=>row.map(singleLine));return renderGridNormalized(normalizedHeader,normalizedRows)}function renderGridNormalized(header,rows){const all=header?[header,...rows]:rows;const columnCount=all.reduce((max,row)=>Math.max(max,row.
|
|
17
|
+
length),0);const widths=[];for(let i=0;i<columnCount;i+=1){widths.push(all.reduce((max,row)=>Math.max(max,stringWidth(row[i]??"")),0))}const lines=[];if(header){lines.push(renderRow(header,widths));lines.push(widths.map(w=>"-".repeat(Math.max(1,w))).join(" ").trimEnd())}for(const row of rows)lines.push(renderRow(row,widths));return lines.join("\n")}function formatTable(value){if(Array.isArray(value)){if(value.length===0)return"";const records=value.filter(isPlainRecord);if(records.length!==value.
|
|
18
|
+
length){return renderGrid(null,value.map(v=>[cell(v)]))}const columns=collectColumns(records);if(columns.length===0)return"";return renderGrid(columns,records.map(row=>columns.map(c=>cell(row[c]))))}if(isPlainRecord(value)){const entries=Object.entries(value);if(entries.length===0)return"";return renderGrid(null,entries.map(([k,v])=>[k,cell(v)]))}return cell(value)}function escapeDelimited(text){return text.replace(/\\/g,"\\\\").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/\n/g,"\\n")}function formatDelimited(value,separator){
|
|
19
|
+
const rows=[];if(Array.isArray(value)){const records=value.filter(isPlainRecord);if(value.length>0&&records.length===value.length){const columns=collectColumns(records);for(const row of records)rows.push(columns.map(c=>cell(row[c])))}else{for(const v of value)rows.push([cell(v)])}}else if(isPlainRecord(value)){rows.push(Object.values(value).map(cell))}else{rows.push([cell(value)])}return rows.map(row=>row.map(escapeDelimited).join(separator)).join("\n")}async function evaluateQuery(expression,value){if(expression.trim()===""){throw new UsageError("--query \u306B\u7A7A\u306E\u5F0F\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093")}const{search}=await import("./dist-HZIZTJ4O.js");try{return search(value??null,expression)}catch(err){throw new UsageError(`--query \u306E\u5F0F\u3092\u8A55\u4FA1\u3067\u304D\u307E\u305B\u3093: ${err.message}`)}}function alignedList(entries,indent=" "){const width=entries.reduce((max,[left])=>Math.max(max,stringWidth(left)),0);return entries.map(([left,right])=>`${indent}${left}${" ".repeat(Math.max(0,width-stringWidth(left)))} ${right}`).join("\n")}function subresourcesOf(resource){return resource.subresources??[]}function renderResourceHelp(resource,path2){const subresources=subresourcesOf(resource);const operationSection=resource.operations.length===0?"":`
|
|
20
|
+
\u64CD\u4F5C:
|
|
21
|
+
${alignedList(resource.operations.map(op=>[op.name,op.summary]))}
|
|
22
|
+
`;const subSection=subresources.length===0?"":`
|
|
23
|
+
\u30B5\u30D6\u8CC7\u6E90:
|
|
24
|
+
${alignedList(subresources.map(sub=>[`${sub.name} <\u64CD\u4F5C>`,sub.summary]))}
|
|
25
|
+
`;return`twp ${path2} \u2014 ${resource.summary}
|
|
26
|
+
|
|
27
|
+
\u4F7F\u3044\u65B9:
|
|
28
|
+
twp ${path2} <\u64CD\u4F5C> [\u5F15\u6570] [\u30AA\u30D7\u30B7\u30E7\u30F3]
|
|
29
|
+
twp ${path2} <\u64CD\u4F5C> ${HELP_TOKEN} \u305D\u306E\u64CD\u4F5C\u306E\u8A73\u3057\u3044\u30D8\u30EB\u30D7
|
|
30
|
+
${operationSection}${subSection}
|
|
31
|
+
${GLOBAL_OPTIONS_HELP}
|
|
32
|
+
`}function renderOperationHelp(op,path2){const sections=[`twp ${path2} ${op.name} \u2014 ${op.summary}`,"","\u4F7F\u3044\u65B9:",` ${op.usage}`];if(op.description!==void 0){sections.push("",...op.description.split("\n"))}if(op.destructive===true){sections.push("","\u26A0 \u7834\u58CA\u7684\u306A\u64CD\u4F5C\u3067\u3059\u3002\u5B9F\u884C\u3059\u308B\u306B\u306F --yes \u304C\u5FC5\u8981\u3067\u3059\u3002")}if(op.flags.length>0){sections.push("","\u30AA\u30D7\u30B7\u30E7\u30F3:",alignedList(op.flags.
|
|
33
|
+
map(flag=>[flag.takesValue?`${flag.name} ${flag.placeholder??"<\u5024>"}`:flag.name,flag.summary])))}sections.push("",GLOBAL_OPTIONS_HELP,"");return sections.join("\n")}function renderUnknownOperation(resource,path2,attempted){const names=[...resource.operations.map(op=>op.name),...subresourcesOf(resource).map(sub=>`${sub.name} <\u64CD\u4F5C>`)].join(" / ");return attempted===void 0?`twp ${path2} \u306B\u306F\u64CD\u4F5C\u306E\u6307\u5B9A\u304C\u5FC5\u8981\u3067\u3059\uFF08${names}\uFF09\u3002\u8A73\u3057\u304F\u306F twp ${path2}\
|
|
34
|
+
${HELP_TOKEN}`:`twp ${path2} \u306B\u300C${attempted}\u300D\u3068\u3044\u3046\u64CD\u4F5C\u306F\u3042\u308A\u307E\u305B\u3093\uFF08${names}\uFF09\u3002\u8A73\u3057\u304F\u306F twp ${path2} ${HELP_TOKEN}`}var LOADERS={backlog:async()=>(await import("./backlog-D7PL5FLC.js")).backlogDomain,project:async()=>(await import("./project-KIPSH5GP.js")).projectDomain,task:async()=>(await import("./task-ZYBI6Z4U.js")).taskDomain};async function loadDomain(name){return LOADERS[name]()}var writeOut=text=>void process.stdout.write(text);var writeErr=text=>void process.stderr.write(text);function line(text){return text===""?"":text.endsWith("\n")?text:`${text}
|
|
35
|
+
`}function outputValue(operation,format,body){return format==="json"?operation.raw(body):operation.summarize(body)}function requiresYes(operation,yes){return operation.destructive===true&&!yes}function exitCodeForStatus(status){if(status===401)return EXIT_AUTH;if(status===429)return EXIT_API_SERVER;if(status>=400&&status<500)return EXIT_API_CLIENT;return EXIT_API_SERVER}function exitCodeFor(err){if(err instanceof UsageError)return EXIT_USAGE;if(err instanceof NotLoggedInError||err instanceof SessionExpiredError)
|
|
36
|
+
return EXIT_AUTH;if(err instanceof ApiError)return exitCodeForStatus(err.status);if(err instanceof ApiResponseError||err instanceof NetworkError)return EXIT_API_SERVER;if(err instanceof ResolveError){return err.status===null?EXIT_API_SERVER:exitCodeForStatus(err.status)}return EXIT_FAILURE}function reportError(err,format,code){const message=stripTerminalControls(err instanceof Error?err.message:String(err));const rawHint=err instanceof UsageError?err.hint:void 0;const hint=rawHint!==void 0?stripTerminalControls(
|
|
37
|
+
rawHint):void 0;if(format==="json"){const body={code,message};if(err instanceof ApiError)body["status"]=err.status;if(err instanceof ResolveError&&err.status!==null)body["status"]=err.status;if(hint!==void 0)body["hint"]=hint;writeErr(`${JSON.stringify({error:body},null,2)}
|
|
38
|
+
`);return}writeErr(`${message}
|
|
39
|
+
`);if(hint!==void 0)writeErr(`${hint}
|
|
40
|
+
`)}function dryRunValue(apiUrl,plan){const value={method:plan.method,url:`${apiUrl}${appendQuery(plan.path,plan.query)}`};if(plan.body!==void 0)value["body"]=plan.body;return value}async function send(client,apiUrl,plan){try{return await client.request(plan.method,appendQuery(plan.path,plan.query),plan.body)}catch(err){if(err instanceof ApiError||err instanceof NotLoggedInError||err instanceof SessionExpiredError){throw err}throw new NetworkError(`${apiUrl} \u3078\u306E\u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${err.
|
|
41
|
+
message}`,{cause:err})}}function resolveDownloadTarget(spec,commandPath,operationName,input){const raw=input.flags.get(spec.outFlag);if(raw===void 0||raw.trim()===""){throw new UsageError(`${spec.outFlag} \u306F\u5FC5\u9808\u3067\u3059\uFF08twp ${commandPath} ${operationName}\uFF09`,`\u66F8\u304D\u51FA\u3057\u5148\u306E\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u6A19\u6E96\u51FA\u529B\u3078\u306F\u51FA\u3057\u307E\u305B\u3093\uFF09\u3002`)}return{
|
|
42
|
+
out:path.resolve(raw.trim()),force:input.flags.has(spec.forceFlag)}}function assertWritableTarget(target,forceFlag){if(!target.force&&fs.existsSync(target.out)){throw new UsageError(`\u66F8\u304D\u51FA\u3057\u5148\u304C\u65E2\u306B\u3042\u308A\u307E\u3059: ${target.out}`,`\u4E0A\u66F8\u304D\u3059\u308B\u306A\u3089 ${forceFlag} \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\uFF08\u65E2\u5B9A\u3067\u306F\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\uFF09\u3002`)}const dir=path.dirname(target.out);if(!fs.
|
|
43
|
+
existsSync(dir)){throw new UsageError(`\u66F8\u304D\u51FA\u3057\u5148\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u3042\u308A\u307E\u305B\u3093: ${dir}`,"\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u3063\u3066\u304B\u3089\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u81EA\u52D5\u3067\u306F\u4F5C\u6210\u3057\u307E\u305B\u3093\uFF09\u3002")}}async function download(args){let received;try{received=await args.client.requestBinary(args.plan.method,appendQuery(args.plan.path,args.plan.
|
|
44
|
+
query))}catch(err){if(err instanceof ApiError||err instanceof NotLoggedInError||err instanceof SessionExpiredError)throw err;throw new NetworkError(`${args.apiUrl} \u3078\u306E\u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${err.message}`,{cause:err})}try{fs.writeFileSync(args.target.out,received.bytes,{flag:args.target.force?"w":"wx"})}catch(err){const code=err.code;if(code==="EEXIST"){throw new UsageError(`\u66F8\u304D\u51FA\u3057\u5148\u304C\u65E2\u306B\u3042\u308A\u307E\u3059: ${args.
|
|
45
|
+
target.out}`,"\u4E0A\u66F8\u304D\u3059\u308B\u306A\u3089 --force \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002")}throw new Error(`\u66F8\u304D\u51FA\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${args.target.out}\uFF09: ${err.message}`,{cause:err})}return{path:args.target.out,size:received.bytes.byteLength,contentType:received.contentType}}function capExceeded(reason,pages,count,cursor){return new UsageError(`--all \u304C\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u4E2D\u65AD\u3057\u307E\u3057\u305F\uFF08${reason}\
|
|
46
|
+
\uFF0F${pages} \u30DA\u30FC\u30B8\u30FB${count} \u4EF6\u3092\u53D6\u5F97\u6E08\u307F\uFF09\u3002\u3053\u308C\u306F\u5168\u4EF6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002`,`--limit \u3092\u5927\u304D\u304F\u3057\u3066\u5F80\u5FA9\u3092\u6E1B\u3089\u3059\u304B\u3001--max-pages / --max-items \u3092\u4E0A\u3052\u3066\u304F\u3060\u3055\u3044\u3002\u7D9A\u304D\u3060\u3051\u3092\u53D6\u308B\u306A\u3089 --cursor ${shellQuote(cursor)} \u304B\u3089\u518D\u958B\u3067\u304D\u307E\u3059`)}async function fetchAllPages(args){
|
|
47
|
+
const{paging,maxPages,maxItems}=args;const merged=[];const first=args.plan.query?.[paging.cursorParam];let sent=typeof first==="string"?first:"";for(let page=1;;page+=1){const plan=page===1?args.plan:{...args.plan,query:{...args.plan.query,[paging.cursorParam]:sent}};let body;try{body=await send(args.client,args.apiUrl,plan)}catch(err){if(page>1){writeErr(`--all \u306F ${page} \u30DA\u30FC\u30B8\u76EE\u3067\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${page-1} \u30DA\u30FC\u30B8\u30FB${merged.length}\
|
|
48
|
+
\u4EF6\u3092\u53D6\u5F97\u6E08\u307F\uFF09\u3002\u3053\u308C\u306F\u5168\u4EF6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u7D9A\u304D\u306F --cursor ${shellQuote(stripTerminalControls(sent))} \u304B\u3089\u518D\u958B\u3067\u304D\u307E\u3059\u3002
|
|
49
|
+
`)}throw err}for(const item of paging.items(body))merged.push(item);const next=paging.nextCursor(body);if(next===null)return{body:paging.withItems(body,merged),pages:page,count:merged.length};if(merged.length>=maxItems)throw capExceeded(`\u6700\u5927\u4EF6\u6570 ${maxItems} \u4EF6`,page,merged.length,next);if(page>=maxPages)throw capExceeded(`\u6700\u5927\u30DA\u30FC\u30B8\u6570 ${maxPages}`,page,merged.length,next);if(next===sent){throw new ApiResponseError(`\u540C\u3058\u30AB\u30FC\u30BD\u30EB\uFF08${next}\
|
|
50
|
+
\uFF09\u304C\u7E70\u308A\u8FD4\u3057\u8FD4\u3055\u308C\u305F\u305F\u3081\u4E2D\u65AD\u3057\u307E\u3057\u305F\u3002${merged.length} \u4EF6\u3092\u53D6\u5F97\u3057\u305F\u6642\u70B9\u3067\u3001\u3053\u308C\u306F\u5168\u4EF6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002`)}sent=next}}function resolvePaging(operation,path2,input){const all=input.flags.has("--all");const maxPages=positiveInteger(input.flags,"--max-pages")??DEFAULT_MAX_PAGES;const maxItems=positiveInteger(input.flags,"--max-items")??
|
|
51
|
+
DEFAULT_MAX_ITEMS;positiveInteger(input.flags,"--limit");if(all&&operation.paging===void 0){throw new UsageError(`twp ${path2} ${operation.name} \u306F --all \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093`)}for(const name of["--max-pages","--max-items"]){if(!all&&input.flags.has(name)){throw new UsageError(`${name} \u306F --all \u3068\u4F75\u305B\u3066\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,`${name} \u3060\u3051\u3067\u306F\u4F55\u3082\u5909\u308F\u308A\u307E\u305B\u3093`)}}return{
|
|
52
|
+
all,maxPages,maxItems}}function profileAliases(profileName){const aliases=loadUserConfig().profiles?.[profileName]?.aliases;return aliases!==void 0?{aliases}:{}}function buildPrepareContext(args){const cache=new Map;return{resolver:args.resolver,projectId(explicit){if(explicit!==void 0&&explicit.trim()===""){throw new UsageError("--project \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093","--project <\u30B3\u30FC\u30C9|ID> \u3092\u6307\u5B9A\u3059\u308B\u304B\u3001--project \u3054\u3068\u5916\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
53
|
+
const ref=requireDefaultProject(explicit,args.profileName,args.env,args.cwd).ref;const hit=cache.get(ref);if(hit!==void 0)return hit;const resolved=args.resolver.project(ref).then(project=>project.id);cache.set(ref,resolved);return resolved}}}async function runDomain(options){const{globals}=options;let format=null;try{const profile=resolveProfile(globals.profile);format=resolveOutputFormat({...globals.output!==void 0?{flag:globals.output}:{},...(()=>{const configured=resolveConfiguredOutput(profile.
|
|
54
|
+
name);return configured!==void 0?{configured}:{}})(),isTty:process.stdout.isTTY===true});if(format===null){throw new UsageError(`--output \u306B\u300C${globals.output??""}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${OUTPUT_FORMATS.join(" / ")} \u3067\u3059`)}const domain=await loadDomain(options.domain);if(options.operation===HELP_TOKEN||options.help&&options.operation===void 0){const[extra,...rest2]=options.argv;if(extra===void 0){writeOut(
|
|
55
|
+
renderResourceHelp(domain,domain.name));return EXIT_OK}const target=domain.subresources?.find(resource2=>resource2.name===extra);if(target===void 0||rest2.length>0){throw new UsageError(renderUnknownOperation(domain,domain.name,extra))}writeOut(renderResourceHelp(target,`${domain.name} ${extra}`));return EXIT_OK}const sub=domain.subresources?.find(resource2=>resource2.name===options.operation);const resource=sub??domain;const path2=sub===void 0?domain.name:`${domain.name} ${sub.name}`;const operationName=sub===
|
|
56
|
+
void 0?options.operation:options.argv[0];const rest=sub===void 0?options.argv:options.argv.slice(1);if(sub!==void 0&&(operationName===HELP_TOKEN||options.help&&operationName===void 0)){writeOut(renderResourceHelp(sub,path2));return EXIT_OK}const operation=resource.operations.find(op=>op.name===operationName);if(operation===void 0){throw new UsageError(renderUnknownOperation(resource,path2,operationName))}if(options.help||rest[0]===HELP_TOKEN){writeOut(renderOperationHelp(operation,path2));return EXIT_OK}
|
|
57
|
+
const input=parseOperationArgs(rest,operation.flags);if(!globals.dryRun&&requiresYes(operation,globals.yes)){throw new UsageError(`twp ${path2} ${operation.name} \u306F\u7834\u58CA\u7684\u306A\u64CD\u4F5C\u3067\u3059\u3002\u5B9F\u884C\u3059\u308B\u306B\u306F --yes \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002`)}const paging=resolvePaging(operation,path2,input);const downloadTarget=operation.download===void 0?void 0:resolveDownloadTarget(operation.download,path2,operation.name,input);const stored=loadCredentials(
|
|
58
|
+
profile.name);const apiUrl=effectiveApiUrl(profile,stored?.api_url);const transport=options.fetchImpl??httpFetch;const fetchImpl=globals.debug?withDebug(transport):transport;const session=new AuthSession(profile.name,apiUrl,process.env,fetchImpl);const client=new TwpApiClient(apiUrl,session,fetchImpl,options.version);const prepared=operation.prepare===void 0?input:await operation.prepare(input,buildPrepareContext({resolver:new Resolver(client,{profile:profile.name,refresh:globals.refresh,...profileAliases(
|
|
59
|
+
profile.name)}),profileName:profile.name,env:process.env,cwd:process.cwd()}));const plan=operation.plan(prepared);for(const note of operation.plannedNotes?.(prepared)??[])writeErr(`${stripTerminalControls(note)}
|
|
60
|
+
`);if(globals.dryRun){writeOut(line(redactSecrets(formatOutput(dryRunValue(apiUrl,plan),format))));return EXIT_OK}let body;let paged;if(operation.download!==void 0&&downloadTarget!==void 0){assertWritableTarget(downloadTarget,operation.download.forceFlag);body=await download({client,apiUrl,plan,target:downloadTarget})}else if(paging.all&&operation.paging!==void 0){paged=await fetchAllPages({client,apiUrl,plan,paging:operation.paging,maxPages:paging.maxPages,maxItems:paging.maxItems});body=paged.
|
|
61
|
+
body}else{body=await send(client,apiUrl,plan)}const value=globals.query!==void 0?await evaluateQuery(globals.query,operation.raw(body)):outputValue(operation,format,body);writeOut(line(formatOutput(value,format)));if(paged!==void 0){writeErr(`--all: ${paged.pages} \u30DA\u30FC\u30B8\u3092\u8FBF\u3063\u3066 ${paged.count} \u4EF6\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002
|
|
62
|
+
`)}const pagingNotes=operation.paging===void 0?[]:nextPageNotes(body,prepared,{command:`twp ${path2} ${operation.name}`,flags:operation.flags,profile:globals.profile});for(const note of[...pagingNotes,...operation.notes?.(body,prepared)??[]]){writeErr(`${stripTerminalControls(note)}
|
|
63
|
+
`)}return EXIT_OK}catch(err){const code=exitCodeFor(err);reportError(err,format,code);return code}}export{buildPrepareContext,exitCodeFor,fetchAllPages,outputValue,requiresYes,resolvePaging,runDomain};
|
|
@@ -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{readBody}from"./chunk-
|
|
4
|
-
import{ApiResponseError,UsageError}from"./chunk-M3GWY6NT.js";import{isSafePathSegment,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-J7QYPKVK.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";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===
|
|
3
|
+
import{PRIVATE_PROJECT_REF,isPrivateProjectRef}from"./chunk-GY7KI5E5.js";import{charCount,readBody}from"./chunk-QVXZEUKN.js";import{acknowledgement,isRecord,pick,requireResolved,singleRef,withResolved}from"./chunk-GFC2ASHE.js";import{repeatedValues}from"./chunk-O52CUEDO.js";import"./chunk-QQRJLH6B.js";import{PRIVATE_TASKS_PATH}from"./chunk-MZHTRHZS.js";import"./chunk-JKSXUBND.js";import{PRIVATE_TASK_KEY_PREFIX,isPrivateTaskKey,isTaskKey}from"./chunk-II5RVJQN.js";
|
|
4
|
+
import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-2SGDY6YP.js";import{ApiResponseError,UsageError}from"./chunk-M3GWY6NT.js";import{isSafePathSegment,safeProjectIdPolicy}from"./chunk-5QCAIKFE.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-J7QYPKVK.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";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
|
|
@@ -23,30 +23,67 @@ takesValue:true,placeholder:"<\u30AD\u30FC|ID>"};var PROJECT_FLAG={name:"--proje
|
|
|
23
23
|
ID\uFF08UUID / ULID\uFF09\u3067\u6307\u5B9A\u3059\u308B\u5834\u5408\u3060\u3051 --project\uFF08\u307E\u305F\u306F\u65E2\u5B9A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\uFF09\u304C\u8981\u308A\u307E\u3059\u3002
|
|
24
24
|
UUID / ULID \u306E\u5F62\u3092\u3057\u305F\u5024\u306F\u3001\u30AD\u30FC\u306E\u5F62\u306B\u3082\u8AAD\u3081\u308B\u3068\u304D\u3067\u3082 ID \u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF08\u4F8B: \u672B\u5C3E12\u6841\u304C\u5168\u6570\u5B57\u306E UUID\uFF09\u3002\u3053\u306E\u5834\u5408\u306F --project \u304C\u8981\u308A\u307E\u3059\u3002
|
|
25
25
|
--task <\u30AD\u30FC|ID> \u3067\u3082\u540C\u3058\u610F\u5473\u3067\u3059\u3002\u4F4D\u7F6E\u5F15\u6570\u3068 --task \u306E\u4E21\u65B9\u3092\u6307\u5B9A\u3059\u308B\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
|
|
26
|
-
${PRIVATE_TASK_KEY_PREFIX}-<\u756A\u53F7> \u306E\u5F62\u306E\u30AD\u30FC\u3060\u3051\u306F\u4F8B\u5916\u3067\u3001--project \u304C\u5FC5\u9808\u3067\u3059\uFF08\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u3068\u3082\u3001\u30B3\u30FC\u30C9 ${PRIVATE_TASK_KEY_PREFIX} \u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u30AD\u30FC\u3068\u3082\u8AAD\u3081\u308B\u305F\u3081\uFF09\u3002`;var LIST_COLUMNS=["id","created_at","created_by_name","comment_type","content"];var
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
${PRIVATE_TASK_KEY_PREFIX}-<\u756A\u53F7> \u306E\u5F62\u306E\u30AD\u30FC\u3060\u3051\u306F\u4F8B\u5916\u3067\u3001--project \u304C\u5FC5\u9808\u3067\u3059\uFF08\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u3068\u3082\u3001\u30B3\u30FC\u30C9 ${PRIVATE_TASK_KEY_PREFIX} \u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u30AD\u30FC\u3068\u3082\u8AAD\u3081\u308B\u305F\u3081\uFF09\u3002`;var LIST_COLUMNS=["id","created_at","created_by_name","comment_type","content"];var QUESTION_COLUMN="question";var ANSWER_COLUMN="answer";function summarizeComments(items){const answersByQuestion=new Map;for(const row of items){const answer=isRecord(row)?row["answer_to"]:void 0;if(!isRecord(answer))continue;const target=answer["comment_id"];if(typeof target!=="string"||target==="")continue;answersByQuestion.set(target,selectedKeyText(answer["selected_key"]))}return items.map(row=>{const source=isRecord(
|
|
27
|
+
row)?row:{};const id=typeof source["id"]==="string"?source["id"]:"";const answer=isRecord(source["answer_to"])?selectedKeyText(source["answer_to"]["selected_key"]):answersByQuestion.get(id)??null;const base=pick(row,LIST_COLUMNS);return{id:base["id"],created_at:base["created_at"],created_by_name:base["created_by_name"],comment_type:base["comment_type"],[QUESTION_COLUMN]:questionText(source["question"]),[ANSWER_COLUMN]:answer,content:base["content"]}})}function questionText(question){if(!isRecord(
|
|
28
|
+
question))return null;const options=question["options"];if(!Array.isArray(options))return null;const parts=options.map(option=>{if(!isRecord(option))return null;const key=typeof option["key"]==="string"?option["key"]:null;if(key===null)return null;const label=typeof option["label"]==="string"?option["label"]:"";return label===""?key:`${key}=${label}`}).filter(part=>part!==null);return parts.length===0?null:parts.join(" / ")}function selectedKeyText(selected){if(typeof selected==="string"&&selected!==
|
|
29
|
+
"")return selected;if(Array.isArray(selected)){const keys=selected.filter(key=>typeof key==="string"&&key!=="");if(keys.length>0)return keys.join(",")}return"(\u81EA\u7531\u8A18\u8FF0)"}var WRITE_COLUMNS=["id","task_id","created_at","updated_at","created_by_name","content"];var CONTENT_MAX_CHARS=1e4;var QUESTION_MAX_CHARS=2e3;var CONTENT_HTML_MAX_CHARS=1e5;var OPTION_KEY_MAX_CHARS=10;var OPTION_LABEL_MAX_CHARS=200;var OPTION_MIN=1;var OPTION_MAX=5;var SELECTED_KEY_MAX_CHARS=10;var listPaging=envelopePaging(
|
|
30
|
+
{label:"\u30B3\u30E1\u30F3\u30C8\u4E00\u89A7"});function commentObject(body){const comment=isRecord(body)?body["comment"]:void 0;if(!isRecord(comment)){throw new ApiResponseError("\u30B3\u30E1\u30F3\u30C8\u306E\u5FDC\u7B54\u306B comment \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}return comment}var BODY_FLAGS=[{name:"--body-file",summary:"\u672C\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09\u3002\u6539\u884C\u30FBMarkdown \u3092\u58CA\u3055\u306A\u3044\u4E3B\u7D4C\u8DEF",
|
|
31
|
+
takesValue:true,placeholder:"<\u30D1\u30B9|->"},{name:"--body",summary:"\u672C\u6587\u3092\u76F4\u63A5\u6307\u5B9A\u3059\u308B\uFF08\u4E00\u884C\u5411\u3051\u3002--body-file \u3068\u306E\u4F75\u7528\u306F\u30A8\u30E9\u30FC\uFF09",takesValue:true,placeholder:"<\u6587\u5B57\u5217>"}];var BODY_HELP=`\u672C\u6587\u306F --body-file \u3092\u4E3B\u7D4C\u8DEF\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B7\u30A7\u30EB\u306E\u5F15\u6570\u306B\u8F09\u305B\u308B\u3068\u6539\u884C\u30FBMarkdown \u306E\u898B\u51FA\u3057\uFF08#\uFF09\u30FB
|
|
29
32
|
\u5F15\u7528\u7B26\u3067\u58CA\u308C\u307E\u3059\uFF08gh pr create --body \u3068\u540C\u3058\u554F\u984C\uFF09\u3002--body-file - \u3067\u6A19\u6E96\u5165\u529B\u304B\u3089\u8AAD\u3081\u307E\u3059\u3002
|
|
30
33
|
|
|
31
34
|
\u672C\u6587\u306F\u52A0\u5DE5\u3057\u307E\u305B\u3093\uFF08\u6539\u884C\u30FB\u672B\u5C3E\u306E\u6539\u884C\u30FBCRLF \u306F\u305D\u306E\u307E\u307E\u9001\u308A\u307E\u3059\uFF09\u3002\u843D\u3068\u3059\u306E\u306F\u5148\u982D\u306E UTF-8 BOM \u3060\u3051\u3067\u3059\u3002
|
|
32
35
|
\u7A7A\u30FB\u7A7A\u767D\u306E\u307F\u306E\u672C\u6587\u306F\u6295\u7A3F\u3057\u307E\u305B\u3093\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 2\uFF09\u3002\u4E0A\u9650\u306F ${CONTENT_MAX_CHARS} \u6587\u5B57\u3067\u3059\u3002`;var COMMENT_REF_FLAG={name:"--comment",summary:"\u30B3\u30E1\u30F3\u30C8\u306E ID\uFF08\u4F4D\u7F6E\u5F15\u6570\u3068\u540C\u3058\u610F\u5473\u3002\u4E21\u65B9\u6307\u5B9A\u306F\u30A8\u30E9\u30FC\uFF09",takesValue:true,placeholder:"<\u30B3\u30E1\u30F3\u30C8ID>"};var COMMENT_REF_HELP="\
|
|
33
36
|
\u30B3\u30E1\u30F3\u30C8 ID \u306F twp task comment list <\u30AD\u30FC> \u306E id \u5217\u304B\u3089\u53D6\u308C\u307E\u3059\u3002\n\u5BFE\u8C61\u306E\u30BF\u30B9\u30AF\u306F --task <\u30AD\u30FC|ID> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u30B3\u30E1\u30F3\u30C8 ID \u3060\u3051\u3067\u306F\u5F15\u3051\u307E\u305B\u3093\uFF09\u3002";async function prepareCommentTarget(input,ctx,usage){const commentId=singleRef(input,{flag:"--comment",label:"\u30B3\u30E1\u30F3\u30C8",usage});
|
|
34
37
|
if(!isSafePathSegment(commentId)){throw new UsageError(`\u30B3\u30E1\u30F3\u30C8 ID \u306E\u5F62\u5F0F\u3067\u306F\u3042\u308A\u307E\u305B\u3093: ${commentId}`,"\u30B3\u30E1\u30F3\u30C8 ID \u306F twp task comment list <\u30AD\u30FC> \u306E id \u5217\u304B\u3089\u53D6\u308C\u307E\u3059\u3002")}const task=input.flags.get("--task");if(task===void 0||task.trim()===""){throw new UsageError("\u5BFE\u8C61\u306E\u30BF\u30B9\u30AF\u3092 --task <\u30AD\u30FC|ID> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
35
|
-
usage)}const located=await resolveTaskLocation({...input,args:[]},ctx,task.trim());return withResolved(input,{...located,commentId:commentId.trim()})}
|
|
36
|
-
|
|
38
|
+
usage)}const located=await resolveTaskLocation({...input,args:[]},ctx,task.trim());return withResolved(input,{...located,commentId:commentId.trim()})}var QUESTION_FLAGS=[{name:"--ask-question",summary:"\u30AF\u30EA\u30C3\u30AF\u3067\u56DE\u7B54\u3067\u304D\u308B\u8CEA\u554F\u3068\u3057\u3066\u6295\u7A3F\u3059\u308B\uFF08--question \u3068 --option \u304C\u8981\u308B\uFF09",takesValue:false},{name:"--question",summary:`\u8CEA\u554F\u6587\u3092\u76F4\u63A5\u6307\u5B9A\u3059\u308B\uFF08\u4E0A\u9650 ${QUESTION_MAX_CHARS}\
|
|
39
|
+
\u6587\u5B57\uFF09`,takesValue:true,placeholder:"<\u6587\u5B57\u5217>"},{name:"--question-file",summary:"\u8CEA\u554F\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9|->"},{name:"--option",summary:`\u9078\u629E\u80A2 \u30AD\u30FC=\u8868\u793A\u6587\uFF08${OPTION_MIN}\u301C${OPTION_MAX}\u56DE\u3002\u30AD\u30FC\u306F${OPTION_KEY_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\uFF09`,takesValue:true,placeholder:"\
|
|
40
|
+
<\u30AD\u30FC=\u8868\u793A\u6587>",repeatable:true},{name:"--multi-select",summary:"\u8907\u6570\u306E\u9078\u629E\u80A2\u3092\u9078\u3079\u308B\u8CEA\u554F\u306B\u3059\u308B",takesValue:false},{name:"--no-free-text",summary:"\u81EA\u7531\u8A18\u8FF0\u3067\u306E\u56DE\u7B54\u3092\u8A31\u3055\u306A\u3044\uFF08\u65E2\u5B9A\u306F\u8A31\u3059\uFF09",takesValue:false}];var ANSWER_FLAGS=[{name:"--answer-to",summary:"\u56DE\u7B54\u3059\u308B\u8CEA\u554F\u30B3\u30E1\u30F3\u30C8\u306E ID\uFF08list \u306E id \u5217\uFF09",
|
|
41
|
+
takesValue:true,placeholder:"<\u30B3\u30E1\u30F3\u30C8ID>"},{name:"--select",summary:`\u9078\u3093\u3060\u9078\u629E\u80A2\u306E\u30AD\u30FC\uFF08\u8907\u6570\u9078\u629E\u306E\u8CEA\u554F\u306A\u3089\u8907\u6570\u56DE\u30FB${SELECTED_KEY_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\uFF09`,takesValue:true,placeholder:"<\u30AD\u30FC>",repeatable:true}];var MENTION_FLAG={name:"--mention",summary:"\u30E1\u30F3\u30B7\u30E7\u30F3\u3059\u308B\u76F8\u624B\uFF08me / \u540D\u524D / \u30E1\u30FC\u30EB / ID\u30FB\u8907\u6570\u56DE\u53EF\uFF09",
|
|
42
|
+
takesValue:true,placeholder:"<me|\u540D\u524D|ID>",repeatable:true};var ATTACHMENT_FLAG={name:"--attachment",summary:"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u6E08\u307F\u306E\u6DFB\u4ED8 ID \u3092\u7D10\u3065\u3051\u308B\uFF08\u8907\u6570\u56DE\u53EF\u3002\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306F 7-E \u306E\u7BC4\u56F2\uFF09",takesValue:true,placeholder:"<\u6DFB\u4ED8ID>",repeatable:true};var CONTENT_HTML_FLAG={name:"--content-html-file",summary:`\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u672C\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\u30FB\u4E0A\u9650 ${CONTENT_HTML_MAX_CHARS}\
|
|
43
|
+
\u6587\u5B57\uFF09`,takesValue:true,placeholder:"<\u30D1\u30B9|->"};var QUESTION_HELP=`\u8CEA\u554F\u3068\u3057\u3066\u6295\u7A3F\u3059\u308B\u306B\u306F --ask-question \uFF0B \u8CEA\u554F\u6587\uFF08--question / --question-file\uFF09\uFF0B \u9078\u629E\u80A2\uFF08--option\uFF09\u304C\u8981\u308A\u307E\u3059\u3002
|
|
44
|
+
\u9078\u629E\u80A2\u306F \u30AD\u30FC=\u8868\u793A\u6587 \u306E\u5F62\u3067 ${OPTION_MIN}\u301C${OPTION_MAX} \u500B\u3002\u30AD\u30FC\u306F${OPTION_KEY_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\u3067\u3001\u56DE\u7B54\u306E\u8B58\u5225\u5B50\u306B\u306A\u308A\u307E\u3059
|
|
45
|
+
\uFF08\u4F8B: --option ok=\u627F\u8A8D\u3059\u308B --option back=\u5DEE\u3057\u623B\u3059\uFF09\u3002
|
|
46
|
+
\u672C\u6587\uFF08--body-file\uFF09\u306F\u8CEA\u554F\u306E\u80CC\u666F\u306B\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u8CEA\u554F\u6587\u305D\u306E\u3082\u306E\u306F --question \u5074\u306B\u7F6E\u304D\u307E\u3059\u3002
|
|
47
|
+
|
|
48
|
+
\u56DE\u7B54\u3059\u308B\u3068\u304D\u306F --answer-to <\u8CEA\u554F\u306E\u30B3\u30E1\u30F3\u30C8ID> \u3068 --select <\u30AD\u30FC> \u3092\u4F7F\u3044\u307E\u3059\uFF08\u81EA\u7531\u8A18\u8FF0\u3060\u3051\u306E\u56DE\u7B54\u306A\u3089 --select \u306F\u4E0D\u8981\uFF09\u3002
|
|
49
|
+
--ask-question \u3068 --answer-to \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u8CEA\u554F\u3068\u56DE\u7B54\u306F\u5225\u306E\u30B3\u30E1\u30F3\u30C8\u3067\u3059\uFF09\u3002`;function tooLong(value,max){return charCount(value)>max}function parseOption(raw){const at=raw.indexOf("=");if(at<=0){throw new UsageError(`--option \u306F \u30AD\u30FC=\u8868\u793A\u6587 \u306E\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,"\u4F8B: --option ok=\u627F\u8A8D\u3059\u308B\u3002\u30AD\u30FC\u306F\u56DE\u7B54\u306B\u4F7F\u3046\u8B58\u5225\u5B50\
|
|
50
|
+
\u3067\u3001\u8868\u793A\u6587\u304C\u753B\u9762\u306E\u30DC\u30BF\u30F3\u306B\u306A\u308A\u307E\u3059\u3002")}const key=raw.slice(0,at).trim();const label=raw.slice(at+1).trim();if(key==="")throw new UsageError(`--option \u306E\u30AD\u30FC\u304C\u7A7A\u3067\u3059: ${raw}`);if(label==="")throw new UsageError(`--option \u306E\u8868\u793A\u6587\u304C\u7A7A\u3067\u3059: ${raw}`);if(tooLong(key,OPTION_KEY_MAX_CHARS)){throw new UsageError(`--option \u306E\u30AD\u30FC\u306F${OPTION_KEY_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\u3067\
|
|
51
|
+
\u3059\uFF08${charCount(key)}\u6587\u5B57\uFF09: ${key}`,"\u30B5\u30FC\u30D0\u304C 422 \u3067\u62D2\u3080\u5024\u306A\u306E\u3067\u3001\u9001\u3089\u305A\u306B\u6B62\u3081\u3066\u3044\u307E\u3059\u3002\u77ED\u3044\u8B58\u5225\u5B50\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: ok / back / hold\uFF09\u3002")}if(tooLong(label,OPTION_LABEL_MAX_CHARS)){throw new UsageError(`--option \u306E\u8868\u793A\u6587\u306F${OPTION_LABEL_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\u3067\u3059\uFF08${charCount(
|
|
52
|
+
label)}\u6587\u5B57\uFF09`,"\u9577\u3044\u8AAC\u660E\u306F\u672C\u6587\uFF08--body-file\uFF09\u3078\u66F8\u3044\u3066\u304F\u3060\u3055\u3044\u3002")}return{key,label}}async function buildQuestion(input,usage){const asking=input.flags.has("--ask-question");const options=repeatedValues(input,"--option");const multiSelect=input.flags.has("--multi-select");const noFreeText=input.flags.has("--no-free-text");const hasQuestionText=input.flags.has("--question")||input.flags.has("--question-file");if(!asking){
|
|
53
|
+
const stray=[...options.length>0?["--option"]:[],...hasQuestionText?["--question / --question-file"]:[],...multiSelect?["--multi-select"]:[],...noFreeText?["--no-free-text"]:[]];if(stray.length>0){throw new UsageError(`${stray.join(" / ")} \u306F --ask-question \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,"\u8CEA\u554F\u3068\u3057\u3066\u6295\u7A3F\u3059\u308B\u306A\u3089 --ask-question \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002\n\u3075\u3064\u3046\u306E\u30B3\u30E1\u30F3\u30C8\u3068\u3057\u3066\u6295\u7A3F\u3059\u308B\u306A\u3089\u3001\u3053\u308C\u3089\u306E\u30D5\u30E9\u30B0\u3092\u5916\u3057\u3066\u304F\u3060\u3055\u3044\n\uFF08\u4ED8\u3051\u305F\u307E\u307E\u6295\u7A3F\u3059\u308B\u3068\u5E73\u6587\u306E\u30B3\u30E1\u30F3\u30C8\u306B\u306A\u308A\u3001\u753B\u9762\u306B\u56DE\u7B54\u30DC\u30BF\u30F3\u304C\u51FA\u307E\u305B\u3093\uFF09\u3002")}
|
|
54
|
+
return void 0}const description=await readBody(input,{flag:"--question",fileFlag:"--question-file",label:"\u8CEA\u554F\u6587",maxChars:QUESTION_MAX_CHARS,usage});if(description===void 0){throw new UsageError("\u8CEA\u554F\u6587\u3092 --question <\u6587\u5B57\u5217> \u304B --question-file <\u30D1\u30B9> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usage)}if(options.length<OPTION_MIN){throw new UsageError(`--ask-question \u306B\u306F\u9078\u629E\u80A2\u304C${OPTION_MIN}\u500B\u4EE5\u4E0A\u8981\u308A\u307E\u3059`,
|
|
55
|
+
"\u4F8B: --option ok=\u627F\u8A8D\u3059\u308B --option back=\u5DEE\u3057\u623B\u3059")}if(options.length>OPTION_MAX){throw new UsageError(`\u9078\u629E\u80A2\u306F${OPTION_MAX}\u500B\u307E\u3067\u3067\u3059\uFF08${options.length}\u500B\uFF09`,"\u30B5\u30FC\u30D0\u304C 422 \u3067\u62D2\u3080\u5024\u306A\u306E\u3067\u3001\u9001\u3089\u305A\u306B\u6B62\u3081\u3066\u3044\u307E\u3059\u3002\u9078\u629E\u80A2\u3092\u7D5E\u3063\u3066\u304F\u3060\u3055\u3044\u3002")}const parsed=options.map(parseOption);
|
|
56
|
+
const seen=new Set;for(const option of parsed){if(seen.has(option.key))throw new UsageError(`--option \u306E\u30AD\u30FC\u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059: ${option.key}`);seen.add(option.key)}return{description,options:parsed,allow_free_text:!noFreeText,multi_select:multiSelect}}function buildAnswer(input){const target=nonEmpty(input.flags,"--answer-to");const selected=repeatedValues(input,"--select").map(key=>key.trim());if(target===void 0){if(selected.length>0){throw new UsageError(
|
|
57
|
+
"--select \u306F --answer-to <\u30B3\u30E1\u30F3\u30C8ID> \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","\u56DE\u7B54\u5148\u306E\u8CEA\u554F\u30B3\u30E1\u30F3\u30C8\u306E ID \u306F twp task comment list <\u30AD\u30FC> \u306E id \u5217\u304B\u3089\u53D6\u308C\u307E\u3059\u3002")}return void 0}const seen=new Set;for(const key of selected){if(key==="")throw new UsageError("--select \u306B\u7A7A\u306E\u30AD\u30FC\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093");if(tooLong(
|
|
58
|
+
key,SELECTED_KEY_MAX_CHARS)){throw new UsageError(`--select \u306E\u30AD\u30FC\u306F${SELECTED_KEY_MAX_CHARS}\u6587\u5B57\u4EE5\u5185\u3067\u3059\uFF08${charCount(key)}\u6587\u5B57\uFF09: ${key}`,"\u8CEA\u554F\u306E\u9078\u629E\u80A2\u306E\u30AD\u30FC\u3092\u305D\u306E\u307E\u307E\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08list \u306E question \u5217\u306B\u51FA\u307E\u3059\uFF09\u3002")}if(seen.has(key))throw new UsageError(`--select \u306E\u30AD\u30FC\u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059: ${key}`);
|
|
59
|
+
seen.add(key)}return{comment_id:target.trim(),...selected.length===0?{}:{selected_key:selected.length===1?selected[0]:[...selected]}}}function attachmentIds(input){const ids=repeatedValues(input,"--attachment").map(id=>id.trim());const seen=new Set;for(const id of ids){if(id==="")throw new UsageError("--attachment \u306B\u7A7A\u306E ID \u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093");if(seen.has(id))throw new UsageError(`--attachment \u306E ID \u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059: ${id}`);
|
|
60
|
+
seen.add(id)}return ids}async function resolveMentions(input,ctx,projectId){const refs=repeatedValues(input,"--mention");const ids=[];for(const ref of refs){if(ref.trim()==="")throw new UsageError("--mention \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093");const member=await ctx.resolver.assignee(projectId,ref,"--mention");if(!ids.includes(member.id))ids.push(member.id)}return ids}async function readContentHtml(input,usage){return readBody(input,{flag:"--content-html",fileFlag:"\
|
|
61
|
+
--content-html-file",label:"\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u672C\u6587",maxChars:CONTENT_HTML_MAX_CHARS,usage})}function rejectDoubleStdin(input){const stdinFlags=["--body-file","--question-file","--content-html-file"].filter(name=>input.flags.get(name)==="-");if(stdinFlags.length>1){throw new UsageError(`\u6A19\u6E96\u5165\u529B\u3092\u8AAD\u3080\u30D5\u30E9\u30B0\u304C\u8907\u6570\u3042\u308A\u307E\u3059: ${stdinFlags.join(" / ")}`,"\u6A19\u6E96\u5165\u529B\u306F1\u3064\u3057\u304B\u8AAD\u3081\u307E\u305B\u3093\u3002\u3069\u308C\u304B1\u3064\u3060\u3051\u3092 - \u306B\u3057\u3066\u3001\u6B8B\u308A\u306F\u30D5\u30A1\u30A4\u30EB\u3067\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}}
|
|
62
|
+
function takeJson(input,key){const raw=input.resolved?.[key];if(raw===void 0||raw==="")return void 0;return JSON.parse(raw)}function takeList(input,key){const parsed=takeJson(input,key);if(parsed===void 0)return[];if(!Array.isArray(parsed))throw new Error(`\u5185\u90E8\u30A8\u30E9\u30FC: ${key} \u306E\u53D7\u3051\u6E21\u3057\u304C\u58CA\u308C\u3066\u3044\u307E\u3059`);return parsed}function optionalResolved(values){const out={};for(const[key,value]of Object.entries(values)){if(value===void 0)continue;
|
|
63
|
+
out[key]=typeof value==="string"?value:JSON.stringify(value)}return out}function commonOptionalBody(input){const mentions=takeList(input,"mentioned_user_ids");const attachments=takeList(input,"attachment_ids");const contentHtml=input.resolved?.["content_html"];return{content_html:contentHtml??null,...mentions.length>0?{mentioned_user_ids:mentions}:{},...attachments.length>0?{attachment_ids:attachments}:{}}}function commentBody(input){const question=takeJson(input,"question");const answer=takeJson(
|
|
64
|
+
input,"answer_to");return{content:requireResolved(input,"content"),...commonOptionalBody(input),...question!==void 0?{comment_type:"ask_question",question}:{},...answer!==void 0?{answer_to:answer}:{}}}function commentPath(input){const projectId=encodeURIComponent(requireResolved(input,"projectId"));const taskId=encodeURIComponent(requireResolved(input,"taskId"));return`/api/v2/projects/${projectId}/tasks/${taskId}/comments`}var taskCommentResource={name:"comment",summary:"\u30BF\u30B9\u30AF\u30B3\u30E1\u30F3\u30C8\u306E\u4E00\u89A7\u30FB\u6295\u7A3F\u30FB\u66F4\u65B0\u30FB\u524A\u9664",
|
|
65
|
+
operations:[{name:"list",summary:"\u30BF\u30B9\u30AF\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u4E00\u89A7\u3059\u308B",usage:"twp task comment list <\u30AD\u30FC|ID> [--project <\u30B3\u30FC\u30C9|ID>] [--all]",description:`${TASK_REF_HELP}
|
|
37
66
|
|
|
38
67
|
\u4F5C\u6210\u65E5\u6642\u306E\u6607\u9806\u3067\u8FD4\u308A\u307E\u3059\uFF08\u30B5\u30FC\u30D0\u5074\u306E\u4E26\u3073\uFF09\u3002
|
|
39
68
|
|
|
40
|
-
${LIST_PAGING_HELP}`,flags:[...LIST_FLAGS,TASK_REF_FLAG,PROJECT_FLAG],paging:listPaging,async prepare(input,ctx){const ref=singleRef(input,{flag:"--task",label:"\u30BF\u30B9\u30AF",usage:"twp task comment list help"});return withResolved(input,await resolveTaskLocation(input,ctx,ref))},plan(input){return{method:"GET",path:commentPath(input),query:{limit:positiveInteger(input.flags,"--limit"),cursor:nonEmpty(input.flags,"--cursor")}}},summarize:body=>listPaging.items(body)
|
|
41
|
-
|
|
69
|
+
${LIST_PAGING_HELP}`,flags:[...LIST_FLAGS,TASK_REF_FLAG,PROJECT_FLAG],paging:listPaging,async prepare(input,ctx){const ref=singleRef(input,{flag:"--task",label:"\u30BF\u30B9\u30AF",usage:"twp task comment list help"});return withResolved(input,await resolveTaskLocation(input,ctx,ref))},plan(input){return{method:"GET",path:commentPath(input),query:{limit:positiveInteger(input.flags,"--limit"),cursor:nonEmpty(input.flags,"--cursor")}}},summarize:body=>summarizeComments(listPaging.items(body)),raw:body=>listPaging.
|
|
70
|
+
items(body)},{name:"create",summary:"\u30BF\u30B9\u30AF\u306B\u30B3\u30E1\u30F3\u30C8\u3092\u6295\u7A3F\u3059\u308B\uFF08\u8CEA\u554F\u30FB\u56DE\u7B54\u30FB\u30E1\u30F3\u30B7\u30E7\u30F3\u30FB\u6DFB\u4ED8\u7D10\u3065\u3051\u3092\u542B\u3080\uFF09",usage:"twp task comment create <\u30AD\u30FC|ID> --body-file <\u30D1\u30B9> [--ask-question --option <\u30AD\u30FC=\u8868\u793A\u6587>] [--mention <\u76F8\u624B>]",description:`${TASK_REF_HELP}
|
|
42
71
|
|
|
43
|
-
${BODY_HELP}
|
|
44
|
-
|
|
72
|
+
${BODY_HELP}
|
|
73
|
+
|
|
74
|
+
${QUESTION_HELP}`,flags:[...BODY_FLAGS,...QUESTION_FLAGS,...ANSWER_FLAGS,MENTION_FLAG,ATTACHMENT_FLAG,CONTENT_HTML_FLAG,TASK_REF_FLAG,PROJECT_FLAG],async prepare(input,ctx){const usage="twp task comment create help";const ref=singleRef(input,{flag:"--task",label:"\u30BF\u30B9\u30AF",usage});rejectDoubleStdin(input);const content=await requireContent(input,usage);const contentHtml=await readContentHtml(input,usage);const question=await buildQuestion(input,usage);const answer=buildAnswer(input);if(question!==
|
|
75
|
+
void 0&&answer!==void 0){throw new UsageError("--ask-question \u3068 --answer-to \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093","\u8CEA\u554F\u3068\u56DE\u7B54\u306F\u5225\u306E\u30B3\u30E1\u30F3\u30C8\u3067\u3059\u3002\u307E\u305A\u56DE\u7B54\u3092\u6295\u7A3F\u3057\u3001\u7D9A\u3051\u3066\u65B0\u3057\u3044\u8CEA\u554F\u3092\u6295\u7A3F\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}const attachments=attachmentIds(input);const located=await resolveTaskLocation(input,ctx,ref);const mentions=await resolveMentions(
|
|
76
|
+
input,ctx,located.projectId);return withResolved(input,{...located,content,...optionalResolved({content_html:contentHtml,question,answer_to:answer,...mentions.length>0?{mentioned_user_ids:mentions}:{},...attachments.length>0?{attachment_ids:attachments}:{}})})},plan:input=>({method:"POST",path:commentPath(input),body:commentBody(input)}),summarize:body=>pick(commentObject(body),WRITE_COLUMNS),raw:commentObject},{name:"update",summary:"\u30B3\u30E1\u30F3\u30C8\u306E\u672C\u6587\u3092\u66F8\u304D\u63DB\u3048\u308B",
|
|
77
|
+
usage:"twp task comment update <\u30B3\u30E1\u30F3\u30C8ID> --task <\u30AD\u30FC|ID> --body-file <\u30D1\u30B9>",description:`${COMMENT_REF_HELP}
|
|
45
78
|
|
|
46
79
|
${BODY_HELP}
|
|
47
80
|
|
|
48
|
-
\u672C\u6587\u306F\u7F6E\u304D\u63DB\u3048\u3067\u3059\uFF08\u8FFD\u8A18\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002
|
|
49
|
-
|
|
81
|
+
\u672C\u6587\u306F\u7F6E\u304D\u63DB\u3048\u3067\u3059\uFF08\u8FFD\u8A18\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002
|
|
82
|
+
|
|
83
|
+
\u30B5\u30FC\u30D0\u306F\u66F4\u65B0\u3067 content / content_html / \u30E1\u30F3\u30B7\u30E7\u30F3 / \u6DFB\u4ED8\u3057\u304B\u53D7\u3051\u307E\u305B\u3093\u3002
|
|
84
|
+
\u8CEA\u554F\uFF08--ask-question\uFF09\u3068\u56DE\u7B54\uFF08--answer-to\uFF09\u306F\u6295\u7A3F\u6642\u306B\u3057\u304B\u6307\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u3053\u3053\u3067\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002`,flags:[...BODY_FLAGS,MENTION_FLAG,ATTACHMENT_FLAG,CONTENT_HTML_FLAG,COMMENT_REF_FLAG,TASK_REF_FLAG,PROJECT_FLAG],async prepare(input,ctx){const usage="twp task comment update help";rejectDoubleStdin(input);const content=await requireContent(input,usage);
|
|
85
|
+
const contentHtml=await readContentHtml(input,usage);const attachments=attachmentIds(input);const located=await prepareCommentTarget(input,ctx,usage);const mentions=await resolveMentions(located,ctx,requireResolved(located,"projectId"));return withResolved(located,{content,...optionalResolved({content_html:contentHtml,...mentions.length>0?{mentioned_user_ids:mentions}:{},...attachments.length>0?{attachment_ids:attachments}:{}})})},plan:input=>({method:"PUT",path:`${commentPath(input)}/${encodeURIComponent(
|
|
86
|
+
requireResolved(input,"commentId"))}`,body:commentBody(input)}),summarize:body=>pick(commentObject(body),WRITE_COLUMNS),raw:commentObject},{name:"delete",summary:"\u30B3\u30E1\u30F3\u30C8\u3092\u524A\u9664\u3059\u308B",usage:"twp task comment delete <\u30B3\u30E1\u30F3\u30C8ID> --task <\u30AD\u30FC|ID> --yes",description:`${COMMENT_REF_HELP}
|
|
50
87
|
|
|
51
88
|
\u524A\u9664\u306F\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3002`,destructive:true,flags:[COMMENT_REF_FLAG,TASK_REF_FLAG,PROJECT_FLAG],prepare:(input,ctx)=>prepareCommentTarget(input,ctx,"twp task comment delete help"),plan:input=>({method:"DELETE",path:`${commentPath(input)}/${encodeURIComponent(requireResolved(input,"commentId"))}`}),summarize:body=>acknowledgement(body,"\u30B3\u30E1\u30F3\u30C8\u524A\u9664"),raw:body=>acknowledgement(body,"\u30B3\u30E1\u30F3\u30C8\u524A\u9664")}]};async function requireContent(input,usage){
|
|
52
89
|
const content=await readBody(input,{flag:"--body",fileFlag:"--body-file",label:"\u30B3\u30E1\u30F3\u30C8\u672C\u6587",maxChars:CONTENT_MAX_CHARS,usage});if(content===void 0){throw new UsageError("\u30B3\u30E1\u30F3\u30C8\u672C\u6587\u3092 --body-file <\u30D1\u30B9> \u304B --body <\u6587\u5B57\u5217> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usage)}return content}var ISO_DATE_RE=/^\d{4}-\d{2}-\d{2}$/;function isoDate(input,flag){const raw=input.flags.get(flag);if(raw===void 0)return void 0;const value=raw.trim();if(!ISO_DATE_RE.test(value)){throw new UsageError(`${flag} \u306F YYYY-MM-DD \u306E\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,"\u4F8B: 2026-09-30")}const[y,m,d]=value.split("-").map(Number);const probe=new Date(Date.UTC(y,m-1,d));if(probe.getUTCFullYear()!==y||probe.getUTCMonth()+1!==m||probe.getUTCDate()!==d){throw new UsageError(
|
package/package.json
CHANGED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
-
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{isServerAiType}from"./chunk-4QI5NX4C.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectAiClis,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-3WJHTPOZ.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var MAX_SCAN_BYTES=512*1024;var PROGRESS_PREFIX=/^\s*\[\d{2}:\d{2}:\d{2}\]\s*/;var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var TRANSCRIPT_MARKER=/^(>>|<<|⛔|!!)\s/;function stripProgressPrefix(line){return line.replace(PROGRESS_PREFIX,"").trim()}function stripTranscript(raw){return filterLines(raw,true)}function stripModelProse(raw){return filterLines(raw,false)}function filterLines(raw,dropToolLines){const out=[];let inReport=false;for(const line of raw.
|
|
4
|
-
split("\n")){if(line.includes(FINAL_REPORT_BEGIN)){inReport=true;continue}if(line.includes(FINAL_REPORT_END)){inReport=false;continue}if(inReport||line.includes("\u{1F4AC}"))continue;if(dropToolLines&&TRANSCRIPT_MARKER.test(stripProgressPrefix(line)))continue;out.push(line)}return out.join("\n")}var UNTRUSTED_PATTERNS=[/has not been trusted/i,/Ignoring [0-9]+ permissions\.allow entries/i];function isUntrusted(raw){const text=stripTranscript(raw);return UNTRUSTED_PATTERNS.some(p=>p.test(text))}var CLI_FATAL_TEXT_PATTERNS=[
|
|
5
|
-
/^api error\b/i,/^failed to authenticate\b/i];function isCliFatalText(text){const head=text.trim();return CLI_FATAL_TEXT_PATTERNS.some(p=>p.test(head))}var CODEX_PLAIN_LIMIT_PATTERNS=[/^(?:error\s*:\s*)?you(?:'ve| have) hit (?:your|the) (?:usage|session|weekly|rate|quota) limit\b.*$/i,/^(?:error\s*:\s*)?(?:your|the) (?:usage|rate|session|quota) limit (?:has been )?(?:reached|exceeded)\b.*$/i,/^(?:error\s*:\s*)?(?:usage|rate|session|quota) limit (?:reached|exceeded)\b.*$/i,/^try again at\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+\d{1,2}(?:st|nd|rd|th)?\b.*$/i];
|
|
6
|
-
var CODEX_RUST_LIMIT_PATTERN=/^(?:\d{4}-\d{2}-\d{2}T\S+\s+)?(?:ERROR|WARN)\s+codex(?:[_:][a-z0-9_:-]+)*\s*:\s*.*(?:\b(?:429|529)\b|(?:usage|rate|session)[ ._-]*limit|quota[_ -]?(?:exhausted|exceeded))/i;var COMMON_LIMIT_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}429/i,/429[^0-9].{0,15}(?:too many|rate|throttl)/i,/(?:status|code|http)[^a-z0-9]{0,10}529/i,/529[^0-9].{0,15}overloaded/i,/too many requests/i,/max.?spend.?(?:limit|reached|exceeded)/i,/spending.?limit/i,/resets?\s+\d+(?::\d+)?\s*(?:am|pm)/i];
|
|
7
|
-
var GEMINI_LIMIT_PATTERNS=[/terminalquotaerror/i,/retryablequotaerror/i,/quota_exhausted/i,/model_capacity_exhausted/i,/exhausted your capacity/i,/no capacity available/i,/ratelimitexceeded/i];var CLAUDE_LIMIT_PATTERNS=[/rate.?limit/i,/usage.?limit/i,/session.?limit/i,/quota.?(?:exceeded|reached|limit)/i,/(?:api|server|model).{0,20}overloaded/i,/hit.{0,10}(?:your|the).{0,20}limit/i];function isRateLimited(raw,ai){const text=stripTranscript(raw);if(ai==="codex"){for(const line of text.split("\n")){
|
|
8
|
-
const normalized=stripProgressPrefix(line);if(CODEX_RUST_LIMIT_PATTERN.test(normalized))return true;if(CODEX_PLAIN_LIMIT_PATTERNS.some(p=>fullMatch(p,normalized)))return true}return false}const patterns=[...COMMON_LIMIT_PATTERNS,...ai==="gemini"?GEMINI_LIMIT_PATTERNS:[],...ai==="claude"?CLAUDE_LIMIT_PATTERNS:[]];return patterns.some(p=>p.test(text))}function fullMatch(pattern,value){const m=pattern.exec(value);return m!==null&&m[0]===value}var AUTH_ERROR_PATTERNS=[/(?:status|code|http)[^a-z0-9]{0,10}401/i,
|
|
9
|
-
/(?:status|code|http)[^a-z0-9]{0,10}403/i,/401\s+unauthorized/i,/403\s+forbidden/i,/invalid.{0,10}(?:api.?key|token|credential)/i,/authentication.{0,10}(?:failed|error|invalid)/i,/(?:api.?key|token).{0,10}(?:invalid|expired|missing|rejected)/i,/not logged in/i,/please (?:run )?login/i,/(?:codex|gemini|copilot|claude)\s+login/i,/failed to authenticate/i,/oauth (?:session|token).{0,30}(?:expired|invalid|revoked)/i];function isAuthError(raw){const text=stripModelProse(raw);return AUTH_ERROR_PATTERNS.
|
|
10
|
-
some(p=>p.test(text))}function rateLimitWaitSeconds(raw,now=new Date){const claude=/resets?\s+(\d{1,2}(?::\d{2})?)\s*(am|pm)/i.exec(raw);if(claude){const[hourStr,minStr]=(claude[1]??"").split(":");let hour=Number.parseInt(hourStr??"",10);const minute=minStr===void 0?0:Number.parseInt(minStr,10);const ampm=(claude[2]??"").toLowerCase();if(Number.isInteger(hour)&&Number.isInteger(minute)){if(ampm==="pm"&&hour!==12)hour+=12;else if(ampm==="am"&&hour===12)hour=0;const reset=new Date(now);reset.setHours(
|
|
11
|
-
hour,minute,0,0);if(reset.getTime()<=now.getTime())reset.setDate(reset.getDate()+1);const wait=Math.trunc((reset.getTime()-now.getTime())/1e3);if(wait>0&&wait<=21600)return wait+30}}const gemini=/reset\s+after\s+(\d+)h(\d+)m(?:(\d+)s)?/i.exec(raw);if(gemini){const wait=Number(gemini[1])*3600+Number(gemini[2])*60+Number(gemini[3]??0);if(wait>0&&wait<=86400)return wait+30}const codex=/try again at\s+(\w+)\s+(\d+)(?:st|nd|rd|th)?,?\s*(\d{4})?\s+(\d{1,2}):(\d{2})\s*(AM|PM)/i.exec(raw);if(codex){const months={
|
|
12
|
-
jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};const mon=months[(codex[1]??"").slice(0,3).toLowerCase()];if(mon!==void 0){let hour=Number(codex[4]);const ampm=(codex[6]??"").toLowerCase();if(ampm==="pm"&&hour!==12)hour+=12;else if(ampm==="am"&&hour===12)hour=0;const year=codex[3]?Number(codex[3]):now.getFullYear();const reset=new Date(year,mon,Number(codex[2]),hour,Number(codex[5]),0,0);const wait=Math.trunc((reset.getTime()-now.getTime())/1e3);if(wait>0)return wait+30}}
|
|
13
|
-
return null}function maxTurnsReached(raw,maxTurns){if(!Number.isFinite(maxTurns)||maxTurns<=0)return false;const matches=raw.match(/完了 \(turns: (\d+)/g);const last=matches?.[matches.length-1];if(last===void 0)return false;const turns=Number.parseInt(/(\d+)$/.exec(last)?.[1]??"",10);return Number.isInteger(turns)&&turns>=maxTurns}function tailForScan(text){return text.length<=MAX_SCAN_BYTES?text:text.slice(text.length-MAX_SCAN_BYTES)}var FINAL_REPORT_BEGIN2="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END2="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!==
|
|
14
|
-
"object"||Array.isArray(parsed)){return[line]}event=parsed}catch{return[line]}switch(event["type"]){case"rate_limit_event":return this.onRateLimit(event);case"assistant":return this.onAssistant(event);case"user":return this.onUser(event);case"result":return this.onResult(event);default:return event["type"]==="system"?[]:[line]}}sawRateLimit(){return this.result.rateLimited}lastRateLimitNote="";onRateLimit(event){const info=event["rate_limit_info"];if(info===null||typeof info!=="object")return[];
|
|
15
|
-
const rec=info;const status=typeof rec["status"]==="string"?rec["status"]:"";const resets=typeof rec["resetsAt"]==="number"?rec["resetsAt"]:null;if(status==="")return[];const at=isSaneEpochSec(resets)?` resets=${new Date(resets*1e3).toISOString()}`:"";if(status.startsWith("allowed")){if(status==="allowed")return[];const seen=`${status}|${resets??""}`;if(seen===this.lastRateLimitNote)return[];this.lastRateLimitNote=seen;return[this.line(`\u2139\uFE0F \u4E0A\u9650\u306B\u63A5\u8FD1\uFF08status=${status}${at}\
|
|
16
|
-
\uFF09\u2014 \u5B9F\u884C\u306F\u7D99\u7D9A\u3057\u307E\u3059`)]}if(resets!==null)this.result.resetsAt=resets;this.result.rateLimited=true;return[this.line(`\u26A0\uFE0F \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u901A\u77E5: status=${status}${at}`)]}onAssistant(event){const out=[];for(const block of contentBlocks(event)){if(block.type==="tool_use"){const name=typeof block.name==="string"?block.name:"tool";if(typeof block.id==="string")this.toolNames.set(block.id,name);this.toolCount+=1;out.push(
|
|
17
|
-
this.line(`>> ${name}${toolDetail(name,block.input)}`))}else if(block.type==="text"&&typeof block.text==="string"&&block.text.trim()!==""){for(const l of block.text.trim().split("\n"))out.push(this.line(` \u{1F4AC} ${l}`))}}return out}onUser(event){const out=[];for(const block of contentBlocks(event)){if(block.type!=="tool_result")continue;const id=typeof block.id==="string"?block.id:"";const useId=typeof block.tool_use_id==="string"?block.tool_use_id:id;const name=this.toolNames.get(useId)??"\
|
|
18
|
-
tool";this.toolNames.delete(useId);const isError=block.is_error===true;const detail=isError?firstErrorLine(block):"";out.push(this.line(`${isError?"!!":"<<"} ${name}${detail}`))}return out}onResult(event){const r=this.result;r.subtype=typeof event["subtype"]==="string"?event["subtype"]:null;r.isError=typeof event["is_error"]==="boolean"?event["is_error"]:null;r.numTurns=typeof event["num_turns"]==="number"?event["num_turns"]:null;r.costUsd=typeof event["total_cost_usd"]==="number"?event["total_c\
|
|
19
|
-
ost_usd"]:null;r.durationMs=typeof event["duration_ms"]==="number"?event["duration_ms"]:null;const usage=event["usage"];if(usage!==null&&typeof usage==="object"&&!Array.isArray(usage)){const u=usage;const num=key=>typeof u[key]==="number"?u[key]:0;const hasIn=["input_tokens","cache_creation_input_tokens","cache_read_input_tokens"].some(k=>typeof u[k]==="number");r.tokensIn=hasIn?num("input_tokens")+num("cache_creation_input_tokens")+num("cache_read_input_tokens"):null;r.tokensOut=typeof u["outpu\
|
|
20
|
-
t_tokens"]==="number"?u["output_tokens"]:null}const out=[this.line(`\u5B8C\u4E86 (turns: ${r.numTurns??0}, tools: ${this.toolCount}, ${Math.round((r.durationMs??0)/1e3)}s, $${(r.costUsd??0).toFixed(3)})`)];const text=typeof event["result"]==="string"?event["result"]:"";r.finalText=text;if(text!==""){out.push(FINAL_REPORT_BEGIN2,text,FINAL_REPORT_END2)}return out}line(msg){const d=this.now();const ts=`${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;return` [${ts}] ${msg}`}};function firstErrorLine(block){
|
|
21
|
-
const content=block.content;const text=typeof content==="string"?content:Array.isArray(content)?content.map(c=>c!==null&&typeof c==="object"&&typeof c.text==="string"?c.text:"").join(" "):"";const first=text.trim().split("\n")[0]??"";return first===""?"":` | ${first.slice(0,120)}`}function contentBlocks(event){const message=event["message"];if(message===null||typeof message!=="object")return[];const content=message["content"];if(!Array.isArray(content))return[];return content.filter(b=>b!==null&&
|
|
22
|
-
typeof b==="object")}function toolDetail(name,input){if(input===void 0||input===null)return"";const str=k=>typeof input[k]==="string"?input[k]:"";if(name==="Bash"){const cmd=str("command");return cmd===""?"":` $ ${cmd.slice(0,80)}${cmd.length>80?"...":""}`}if(name==="Read"||name==="Write"||name==="Edit"){const p=str("file_path");return p===""?"":` ${p}`}if(name==="Grep"||name==="Glob"){const p=str("pattern");return p===""?"":` '${p}'`}if(name==="Skill"){const s=str("skill");return s===""?"":` /${s}`}
|
|
23
|
-
if(name.includes("mcp__")){const args=[];for(const k of["task_id","project_id","status_id","issue_id"]){const v=str(k);if(v!=="")args.push(`${k}=${v.slice(0,16)}`)}return args.length===0?"":` (${args.slice(0,2).join(", ")})`}return""}function pad(n){return String(n).padStart(2,"0")}function isSaneEpochSec(v){return v!==null&&Number.isFinite(v)&&Math.abs(v)<864e10}var DEFAULT_AI_TIMING={abortGraceMs:5e3,abortReapMs:2e3,pollIntervalMs:5e3};function resolveTiming(over){return{abortGraceMs:over?.abortGraceMs??DEFAULT_AI_TIMING.abortGraceMs,abortReapMs:over?.abortReapMs??DEFAULT_AI_TIMING.abortReapMs,pollIntervalMs:over?.pollIntervalMs??DEFAULT_AI_TIMING.pollIntervalMs}}var MAX_RETAINED_BYTES=4*1024*1024;function closeStream(stream){return new Promise(resolve=>{if(stream===null)return resolve();stream.once("error",()=>resolve());stream.end(()=>resolve())})}function buildArgs(req,cfg,env,workspace){
|
|
24
|
-
const warnings=[];const requested=(req.model??"").trim();const usable=requested!==""&&isUsableModelId(requested);if(requested!==""&&!usable){warnings.push(`ai_model '${requested}' \u306F\u4F7F\u3048\u306A\u3044\u5F62\u3067\u3059 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fitsRoute=!usable||!isClaudeAi(req.ai)||modelFitsRoute(requested,env);if(usable&&!fitsRoute){warnings.push(`ai_model '${requested}' \u306F\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08\u3053\u306E\u6A5F\u4F53\u306F ${usesBedrock(
|
|
25
|
-
env)?"Bedrock":"Anthropic \u76F4"}\uFF09 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fallback=cfg.modelFor(req.ai,req.category,env);const safeFallback=fallback===""||!isClaudeAi(req.ai)||modelFitsRoute(fallback,env)?fallback:"";if(fallback!==""&&safeFallback===""){warnings.push(`CLAUDE_MODEL '${fallback}' \u3082\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093 \u2192 \u30E2\u30C7\u30EB\u3092\u6307\u5B9A\u3057\u307E\u305B\u3093`)}
|
|
26
|
-
const model=usable&&fitsRoute?requested:safeFallback;const maxTurns=cfg.maxTurnsFor(req.category,env);let effort="";switch(req.ai){case"gemini":return{file:"gemini",args:["--yolo",...model?["--model",model]:[]],model,effort,maxTurns,warnings};case"codex":return{file:"codex",args:["exec","-s","danger-full-access",...model?["--model",model]:[]],model,effort,maxTurns,warnings};case"copilot":{const mcp=path.join(workspace,".copilot","mcp-config.json");const args=["--allow-all"];if(fs.existsSync(mcp))
|
|
27
|
-
args.push("--additional-mcp-config",`@${mcp}`);else warnings.push(`${mcp} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002copilot \u306F MCP \u306A\u3057\u3067\u5B9F\u884C\u3055\u308C\u307E\u3059`);if(model)args.push("--model",model);return{file:"copilot",args,model,effort,maxTurns,warnings}}default:{if(req.ai!=="claude")warnings.push(`\u672A\u77E5\u306E AI '${req.ai}'\u3002claude \u3067\u5B9F\u884C\u3057\u307E\u3059`);const e=cfg.effortFor(req.category,req.skill,env,req.effort);if(e.warning!==
|
|
28
|
-
null)warnings.push(e.warning);effort=e.value;const args=["-p","--max-turns",String(maxTurns),"--output-format","stream-json","--verbose","--dangerously-skip-permissions"];if(model)args.push("--model",model);if(effort)args.push("--effort",effort);return{file:"claude",args,model,effort,maxTurns,warnings}}}}async function runOnce(req,deps){let metrics=null;const result=await runOnceCore(req,deps,m=>{metrics=m});return metrics===null?result:{...result,metrics}}async function runOnceCore(req,deps,onMetrics){
|
|
29
|
-
const env=deps.env??process.env;const timing=resolveTiming(deps.timing);const isClaude=isClaudeAi(req.ai);const built=buildArgs(req,deps.config,env,req.cwd);for(const w of built.warnings)deps.log(` \u8B66\u544A: ${w}`);if(built.model)deps.log(` model: ${built.model} (ai_model=${req.model||"default"}, category=${req.category})`);if(built.effort)deps.log(` effort: ${built.effort} (category=${req.category}, skill=${req.skill||"none"})`);if(built.effort&&(req.effort??"").trim()===built.effort){deps.
|
|
30
|
-
log(` effort \u6307\u5B9A\u5143: item (ai_effort=${built.effort})`)}const launch=isClaude?wrapWithAutoSwitch(deps.cas,built.file,built.args):{file:built.file,args:built.args};const slot=req.slot!==void 0?req.slot:isClaude&&deps.cas!==null?activeSlotPath(deps.cas):null;if(slot!==null)deps.log(` claude \u67A0: ${slot}`);deps.log(`${req.ai} \u5B9F\u884C: ${firstLine(req.prompt)}`);deps.log(` \u30ED\u30B0: ${req.logFile}`);const renderer=isClaude?new ClaudeStreamRenderer(deps.now):null;const lines=[];
|
|
31
|
-
let retained=0;let truncated=false;let stream=null;try{fs.mkdirSync(path.dirname(req.logFile),{recursive:true,mode:448});stream=fs.createWriteStream(req.logFile,{flags:"w",mode:384})}catch{}const emit=line=>{const clean=stripTerminalControls(line);stream?.write(`${clean}
|
|
32
|
-
`);deps.log(clean);if(retained<MAX_RETAINED_BYTES){lines.push(clean);retained+=clean.length+1}else if(!truncated){truncated=true;lines.push("\u2026\uFF08\u51FA\u529B\u304C\u4E0A\u9650\u3092\u8D85\u3048\u305F\u305F\u3081\u3001\u4EE5\u964D\u306F\u30B9\u30C6\u30C3\u30D7\u30ED\u30B0\u306B\u306E\u307F\u8A18\u9332\u3057\u307E\u3059\uFF09")}};emit(` \u30D7\u30ED\u30F3\u30D7\u30C8: ${req.prompt.length} \u6587\u5B57\uFF08stdin \u7D4C\u7531\uFF09`);const target=resolveSpawnTarget(launch.file,launch.args,
|
|
33
|
-
{env,platform:deps.platform});if(!target.ok){emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${target.reason}`);deps.onProcess?.(null);await closeStream(stream);return{outcome:"unavailable",output:lines.join("\n"),exitCode:null,cooldownSec:null,slot}}if(target.note!==null)deps.log(` \u8D77\u52D5: ${target.note}`);let spawned;try{spawned=spawn(target.file,target.args,{cwd:req.cwd,env,detached:process.platform!=="win32",stdio:["pipe","pipe","pipe"]})}catch(e){
|
|
34
|
-
const code=e.code??"";if(!["EINVAL","ENOENT","EACCES","ENAMETOOLONG"].includes(code))throw e;const hint=code==="ENAMETOOLONG"?`\uFF08\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u304C\u9577\u3059\u304E\u307E\u3059\u3002\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\uFF0B\u5F15\u6570\u3067 ${[target.file,...target.args].join(" ").length} \u6587\u5B57\u3002Windows \u306E\u4E0A\u9650\u306F 32,767 \u6587\u5B57\u3002\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.prompt.length} \u6587\u5B57\u306F stdin \u7D4C\u7531\u306A\u306E\u3067\u539F\u56E0\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09`:
|
|
35
|
-
"";emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${e.message}${hint}`);deps.onProcess?.(null);await closeStream(stream);return{outcome:"unavailable",output:lines.join("\n"),exitCode:null,cooldownSec:null,slot}}let stdinDelivered=false;let stdinError=null;spawned.stdin.on("error",e=>{if(stdinError===null)stdinError=e.code??e.message});spawned.stdin.on("finish",()=>{stdinDelivered=true});spawned.stdin.end(req.prompt);let killedFor=null;const signalTree=signal=>killProcessTree(
|
|
36
|
-
spawned,signal,{platform:deps.platform});const killTree=()=>{signalTree("SIGKILL")};let exited=false;let markExited=()=>{};const exitedPromise=new Promise(resolve=>{markExited=()=>{exited=true;deps.onProcess?.(null);resolve()}});const waitExit=ms=>Promise.race([exitedPromise,new Promise(resolve=>{const t=setTimeout(resolve,ms);t.unref?.()})]);const abort=async()=>{if(exited||spawned.exitCode!==null||spawned.signalCode!==null)return;if(killedFor===null)killedFor="aborted";if(isForceOnly(deps.platform)){
|
|
37
|
-
deps.log(`\u26A0\uFE0F \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u305F\u305F\u3081 ${req.ai} \u3092\u505C\u6B62\u3057\u307E\u3059\uFF08Windows \u306F\u7336\u4E88\u3092\u7F6E\u3051\u306A\u3044\u305F\u3081 taskkill /T /F \u3067\u6728\u3054\u3068\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3059\uFF09`);const how=signalTree("SIGKILL");await waitExit(timing.abortReapMs);deps.log(!exited?` \u26A0\uFE0F ${req.ai} \u304C ${timing.abortReapMs/1e3}\u79D2 \u4EE5\u5185\u306B\u6D88\u3048\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6B8B\u3063\u3066\u3044\u306A\u3044\u304B taskkill /FI \u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044`:
|
|
38
|
-
how==="taskkill"?` ${req.ai} \u306E\u30D7\u30ED\u30BB\u30B9\u6728\u3092\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08\u5B6B\u307E\u3067 taskkill /T \u304C\u5C4A\u304D\u307E\u3057\u305F\uFF09`:` \u26A0\uFE0F ${req.ai} \u306E\u76F4\u4E0B\u306E\u30D7\u30ED\u30BB\u30B9\u3060\u3051\u3092\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08taskkill \u3092\u6483\u3066\u306A\u304B\u3063\u305F\u305F\u3081\u5B6B\u304C\u6B8B\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09`);return}
|
|
39
|
-
deps.log(`\u26A0\uFE0F \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u305F\u305F\u3081 ${req.ai} \u3092\u505C\u6B62\u3057\u307E\u3059\uFF08SIGTERM \u2192 \u6700\u5927${timing.abortGraceMs/1e3}\u79D2 \u2192 SIGKILL\uFF09`);signalTree("SIGTERM");await waitExit(timing.abortGraceMs);deps.log(exited?` ${req.ai} \u306F\u81EA\u5206\u304B\u3089\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002\u6B8B\u3063\u305F\u5B50\u5B6B\u3092\u30D7\u30ED\u30BB\u30B9\u30B0\u30EB\u30FC\u30D7\u3054\u3068\u6383\u304D\u307E\u3059`:
|
|
40
|
-
` ${req.ai} \u304C\u7336\u4E88\u5185\u306B\u7D42\u4E86\u3057\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u30D7\u30ED\u30BB\u30B9\u30B0\u30EB\u30FC\u30D7\u3092\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3059`);signalTree("SIGKILL");await waitExit(timing.abortReapMs)};deps.onProcess?.(abort);const started=Date.now();const feed=lineFeeder(raw=>{if(renderer===null)emit(raw);else for(const l of renderer.push(raw))emit(l)});spawned.stdout.on("data",c=>feed(c.toString("utf8")));spawned.stderr.on("data",c=>feed(
|
|
41
|
-
c.toString("utf8")));const timer=setInterval(()=>{if((Date.now()-started)/1e3>=req.timeoutSec){deps.log(`\u26A0\uFE0F ${req.ai} \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (${Math.trunc((Date.now()-started)/1e3)}s >= ${req.timeoutSec}s) \u2192 \u30D7\u30ED\u30BB\u30B9\u3092\u5F37\u5236\u7D42\u4E86`);killedFor="timeout";killTree();return}const limited=renderer!==null?renderer.sawRateLimit():isRateLimited(recentTail(lines),req.ai);if(limited){deps.log(`\u26A0\uFE0F ${req.ai} \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u691C\u77E5 \u2192 \u5373\u5EA7\u306B\u30D7\u30ED\u30BB\u30B9\u3092\u7D42\u4E86`);
|
|
42
|
-
killedFor="rate-limited";killTree()}},timing.pollIntervalMs);let notLaunched=false;const exitCode=await new Promise(resolve=>{spawned.on("error",e=>{notLaunched=true;emit(`[twp task-loop] ${launch.file} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: ${e.message}`);markExited();resolve(null)});spawned.on("close",code=>{markExited();resolve(code)})});deps.onProcess?.(null);clearInterval(timer);feed(null);if(stdinError!==null||!stdinDelivered){const cause=killedFor!==null?`\u3053\u3061\u3089\u304C ${killedFor}\
|
|
43
|
-
\u3067\u505C\u6B62\u3055\u305B\u305F\u305F\u3081`:notLaunched?"\u8D77\u52D5\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081":exitCode===null?`AI \u304C signal\uFF08${spawned.signalCode??"\u4E0D\u660E"}\uFF09\u3067\u843D\u3061\u305F\u305F\u3081`:exitCode!==0?`AI \u304C\u7D42\u4E86\u30B3\u30FC\u30C9 ${exitCode} \u3067\u5148\u306B\u7D42\u308F\u3063\u305F\u305F\u3081`:"AI \u304C stdin \u3092\u8AAD\u307F\u5207\u3089\u306A\u304B\u3063\u305F\u305F\u3081";emit(`[twp task-loop] ${req.ai} \u3078\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.
|
|
44
|
-
prompt.length} \u6587\u5B57\u3092\u9001\u308A\u5207\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${cause}${stdinError===null?"":`\u30FB${stdinError}`}\uFF09`)}await closeStream(stream);const output=lines.join("\n");const scan=tailForScan(output);onMetrics({turns:renderer?.result.numTurns??null,tokensIn:renderer?.result.tokensIn??null,tokensOut:renderer?.result.tokensOut??null,costUsd:renderer?.result.costUsd??null,effort:built.effort===""?null:built.effort});const fatalText=exitCode!==0&&isCliFatalText(
|
|
45
|
-
renderer?.result.finalText??"")?renderer?.result.finalText??"":"";if(killedFor==="aborted"){return{outcome:"aborted",output,exitCode,cooldownSec:null,slot}}const untrusted=isClaude&&isUntrusted(scan);if(untrusted){deps.log("\u26A0\uFE0F claude: \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u672A\u30C8\u30E9\u30B9\u30C8\u306E\u8B66\u544A\u304C\u51FA\u3066\u3044\u307E\u3059\uFF08permissions.allow \u306F\u7121\u8996\u3055\u308C\u308B\u304C\u5B9F\u884C\u81EA\u4F53\u306F\u901A\u308B\u3002hasTrustDialogAccepted \u3092\u7ACB\u3066\u308B\u3053\u3068\uFF09")}
|
|
46
|
-
const structuredLimited=renderer?.result.rateLimited===true;const textLimited=renderer!==null?exitCode!==0&&isRateLimited(scan,req.ai):isRateLimited(scan,req.ai);const fatalLimited=fatalText!==""&&isRateLimited(fatalText,req.ai);if(killedFor==="rate-limited"||structuredLimited||textLimited||fatalLimited){return{outcome:"rate-limited",output,exitCode,cooldownSec:cooldownFrom(renderer,`${scan}
|
|
47
|
-
${fatalText}`,deps.now?.()??new Date),slot}}if(killedFor==="timeout")return{outcome:"timeout",output,exitCode,cooldownSec:null,slot};if(exitCode!==0&&(isAuthError(scan)||fatalText!==""&&isAuthError(fatalText))){deps.log(`\u26A0\uFE0F ${req.ai} \u8A8D\u8A3C\u30A8\u30E9\u30FC\u3092\u691C\u77E5\u3057\u307E\u3057\u305F\uFF08\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5BFE\u8C61\uFF09`);return{outcome:"auth-error",output,exitCode,cooldownSec:null,slot}}if(isClaude&&exitCode!==0){const byEvent=renderer?.
|
|
48
|
-
result.subtype==="error_max_turns";if(byEvent||maxTurnsReached(output,built.maxTurns)){deps.log(`\u26A0\uFE0F claude \u30BF\u30FC\u30F3\u4E0A\u9650(${built.maxTurns})\u5230\u9054\u3067\u6253\u3061\u5207\u3089\u308C\u307E\u3057\u305F\uFF08\u672A\u5B8C\u4E86\u306E\u53EF\u80FD\u6027\u304C\u9AD8\u3044\uFF09`);return{outcome:"max-turns",output,exitCode,cooldownSec:null,slot}}}if(notLaunched){deps.log(`\u26D4 ${req.ai} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u672A\u5C0E\u5165\u30FB\u5B9F\u884C\u6A29\u30FB\u30E9\u30C3\u30D1\u306E\u7834\u640D\u306E\u3044\u305A\u308C\u304B\uFF09`);
|
|
49
|
-
return{outcome:"unavailable",output,exitCode,cooldownSec:null,slot}}if(untrusted&&exitCode!==0){deps.log("\u26D4 claude: \u672A\u30C8\u30E9\u30B9\u30C8\u306E\u307E\u307E\u5931\u6557\u3057\u307E\u3057\u305F\uFF08permissions.allow \u7121\u8996\u304C\u539F\u56E0\u306E\u53EF\u80FD\u6027\uFF09");return{outcome:"untrusted",output,exitCode,cooldownSec:null,slot}}if(exitCode===0&&!stdinDelivered){deps.log(`\u26D4 ${req.ai} \u306F\u7D42\u4E86\u30B3\u30FC\u30C90\u3067\u7D42\u308F\u308A\u307E\u3057\u305F\u304C\u3001\u30D7\u30ED\u30F3\u30D7\u30C8 ${req.
|
|
50
|
-
prompt.length} \u6587\u5B57\u3092\u9001\u308A\u5207\u308C\u3066\u3044\u307E\u305B\u3093\uFF08\u5207\u308A\u8A70\u307E\u3063\u305F\u6307\u793A\u3067\u8D70\u3063\u305F\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u6210\u529F\u3068\u3057\u3066\u6271\u3044\u307E\u305B\u3093\uFF09`);return{outcome:"failed",output,exitCode,cooldownSec:null,slot}}return{outcome:exitCode===0?"ok":"failed",output,exitCode,cooldownSec:null,slot}}function cooldownFrom(renderer,scan,now){const resets=renderer?.result.resetsAt??
|
|
51
|
-
null;if(resets!==null){const wait=Math.trunc((resets*1e3-now.getTime())/1e3);if(wait>0)return wait+30}return rateLimitWaitSeconds(scan,now)}function lineFeeder(onLine){let buffer="";return chunk=>{if(chunk===null){if(buffer!=="")onLine(buffer);buffer="";return}buffer+=chunk;const parts=buffer.split("\n");buffer=parts.pop()??"";for(const p of parts)onLine(p)}}function firstLine(prompt){return(prompt.split("\n")[0]??"").slice(0,80)}function recentTail(lines){let size=0;let from=lines.length;while(from>
|
|
52
|
-
0&&size<64*1024){from-=1;size+=(lines[from]??"").length+1}return lines.slice(from).join("\n")}function sleepSync(ms){const shared=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(shared,0,0,ms)}var DEFAULT_CHARTER_PREFIX="===== \u4EE5\u4E0B\u306F\u958B\u767A\u61B2\u7AE0\u3067\u3059\u3002\u5168\u3066\u306E\u5224\u65AD\u306E\u6700\u4E0A\u4F4D\u57FA\u6E96\u3067\u3042\u308A\u3001\u500B\u5225\u30B9\u30AD\u30EB\u306E\u624B\u9806\u3068\u77DB\u76FE\u3059\u308B\u5834\u5408\u306F\u672C\u61B2\u7AE0\u304C\u512A\u5148\u3057\u307E\u3059\u3002\u884C\u52D5\u3059\u308B\u524D\u306B\u3001\u305D\u306E\u884C\u52D5\u304C\u61B2\u7AE0\u306E\u76EE\u7684\u306B\u5BC4\u4E0E\u3059\u308B\u304B\u3092\u81EA\u3089\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 =====";
|
|
53
|
-
var DEFAULT_CHARTER_SUFFIX="===== \u958B\u767A\u61B2\u7AE0\u3053\u3053\u307E\u3067\u3002\u4EE5\u4E0B\u304C\u4ECA\u56DE\u306E\u30BF\u30B9\u30AF\u6307\u793A\u3067\u3059\u3002 =====";var UNKNOWN_SLOT="(unresolved)";var DispatchEngine=class{constructor(cfg,log,opts){this.cfg=cfg;this.log=log;this.opts=opts}cfg;log;opts;name="cli";cas=null;casDetected=false;slotResolved=new Map;lastSlot=new Map;charterWarned=false;unusable=null;activeAbort=null;aborting=false;unusableAt=0;launcherBin(){const v=this.opts.
|
|
54
|
-
launcherBin?.trim();return v===void 0||v===""?DEFAULT_CLAUDE_LAUNCHER.bin:v}async run(req){this.slotResolved.clear();if(this.aborting){this.log("\u26D4 \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081 AI \u3092\u8D77\u52D5\u3057\u307E\u305B\u3093");return{outcome:"aborted",usedAi:"",serverAiType:null,output:"\uFF08\u4E2D\u65AD\u306E\u305F\u3081\u672A\u5B9F\u884C\uFF09"}}const env=this.opts.env??process.env;const skill=req.skill??"";const category=req.category??
|
|
55
|
-
this.cfg.categoryForSkill(skill);if(!this.preflightOk()){this.log("\u26D4 \u30DB\u30B9\u30C8\u5074\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u304C\u5230\u9054\u4E0D\u80FD\u3067\u3059\uFF08\u5168\u30DB\u30B9\u30C8\uFF09\u3002\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u3067\u306F AI \u3092\u8D77\u52D5\u3057\u307E\u305B\u3093");return{outcome:"network-down",usedAi:"",serverAiType:null,output:"\uFF08\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u5230\u9054\u4E0D\u80FD\u306E\u305F\u3081\u672A\u5B9F\u884C\uFF09"}}if(!this.
|
|
56
|
-
casDetected){this.cas=this.opts.detect!==void 0?this.opts.detect():detectClaudeAutoSwitch(this.launcherBin());this.casDetected=true;this.log(this.cas===null?` ${this.launcherBin()}: \u672A\u5C0E\u5165\uFF08claude \u3092\u7D20\u3067\u8D77\u52D5\u3057\u307E\u3059\uFF09`:` ${this.launcherBin()}: \u691C\u51FA\uFF08exec ${this.cas.hasExec?"\u3042\u308A \u2192 \u7D4C\u7531\u3057\u3066\u8D77\u52D5\u3057\u307E\u3059":"\u7121\u3057 \u2192 \u7D20\u3067\u8D77\u52D5\u3057\u307E\u3059\uFF08\u66F4\u65B0\u3092\u63A8\u5968\uFF09"}\
|
|
57
|
-
\uFF09`)}const tried=[];let sawRateLimit=false;let sawTimeout=false;let ranAny=false;let skippedForCooldown=false;let lastOutput="";let lastValidated=true;const requested=this.orderFor(category,skill,req.aiType);const head=requested[0]??"";const order=this.usableOrder(requested,category,skill);for(const ai of order){if(tried.includes(ai))continue;if(!this.cfg.isAllowed(ai,category,skill)){this.log(` ${ai} \u306F category=${category} / skill=${skill||"none"} \u306E\u5B9F\u884C\u5BFE\u8C61\u5916\u306E\u305F\u3081\u30B9\u30AD\u30C3\u30D7`);
|
|
58
|
-
continue}const slotFor=()=>{if(!isClaudeAi(ai))return null;if(this.cas===null)return null;if(this.slotResolved.has(ai))return this.slotResolved.get(ai)??null;const resolved=(this.opts.activeSlot??activeSlotPath)(this.cas);const effective=resolved??this.lastSlot.get(ai)??UNKNOWN_SLOT;if(resolved!==null)this.lastSlot.set(ai,resolved);else this.log(` ${ai} \u306E\u67A0\u3092\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${this.launcherBin()} ${DEFAULT_CLAUDE_LAUNCHER.activeArgs.
|
|
59
|
-
join(" ")}\uFF09\u3002${effective} \u3068\u3057\u3066\u6271\u3044\u307E\u3059`);this.slotResolved.set(ai,effective);return effective};const slotNow=this.cfg.hasCooldownFor(ai,this.now())?slotFor():null;if(this.cfg.isRateLimited(ai,this.now(),slotNow)){skippedForCooldown=true;this.log(` ${ai} \u306F\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u4E2D\u306E\u305F\u3081\u30B9\u30AD\u30C3\u30D7`);continue}const isHead=tried.length===0&&ai===head;this.log(isHead?` AI\u9078\u629E: ${ai} (preferred) [cat\
|
|
60
|
-
egory=${category}]`:` \u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: ${ai} [category=${category}]`);const prompt=this.buildPrompt(req.prompt,req.promptPrefix,ai,tried);const logFile=tried.length===0?req.logFile:req.logFile.replace(/\.log$/,`-fallback-${ai}.log`);if(this.aborting){this.log(` \u4E2D\u65AD\u30B7\u30B0\u30CA\u30EB\u3092\u53D7\u3051\u3066\u3044\u308B\u305F\u3081 ${ai} \u306F\u8D77\u52D5\u3057\u307E\u305B\u3093`);return{outcome:"aborted",usedAi:tried[tried.length-1]??"",serverAiType:null,
|
|
61
|
-
output:lastOutput}}ranAny=true;const result=await(this.opts.runOnce??runOnce)({ai,prompt,logFile,cwd:req.cwd,timeoutSec:req.timeoutSec,category,skill,slot:slotFor(),model:isHead?req.aiModel:void 0,effort:req.aiEffort},{config:this.cfg,cas:this.cas,log:this.log,env,now:this.opts.now,onProcess:abort=>{this.activeAbort=abort;if(abort!==null&&this.aborting)void abort()}});lastOutput=result.output;tried.push(ai);if(!["rate-limited","auth-error","timeout","unavailable"].includes(result.outcome)){if(result.
|
|
62
|
-
outcome==="ok"&&req.validate!==void 0){if(req.validate(result.output)){this.log(` ${ai} \u304B\u3089\u5B9F\u884C\u8A08\u753BJSON\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F`)}else{this.log(` ${ai}: \u5B9F\u884C\u8A08\u753B\u306EJSON\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF`);lastValidated=false;continue}}return this.finish(result.outcome,ai,result.output,result.metrics)}if(result.outcome==="rate-limited"){sawRateLimit=true;
|
|
63
|
-
const seconds=result.cooldownSec??this.cfg.cooldownDefaultSec(ai,env);const slotUsed=slotFor();const capped=this.cfg.markRateLimited(ai,seconds,this.now(),slotUsed);this.log(` ${ai} \u3092\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3068\u3057\u3066\u30DE\u30FC\u30AF (${capped}\u79D2\u9593${slotUsed===null?"":` / \u67A0 ${slotUsed}`})`);await this.waitBeforeFallback(ai,env)}else if(result.outcome==="timeout"){sawTimeout=true;this.log(` ${ai} \u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF`)}else if(result.
|
|
64
|
-
outcome==="unavailable"){const sec=this.cfg.markAiUnusable(ai,this.now());this.log(` ${ai} \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093 \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF08${sec}\u79D2\u9593\u306F\u9396\u304B\u3089\u5916\u3057\u307E\u3059\uFF09`)}else{const sec=this.cfg.markAiUnusable(ai,this.now());this.log(` ${ai} \u306E\u8A8D\u8A3C\u30A8\u30E9\u30FC \u2192 \u6B21\u306EAI\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF08${sec}\u79D2\u9593\u306F\u9396\u304B\u3089\u5916\u3057\u307E\u3059\uFF09`)}}
|
|
65
|
-
if(!lastValidated&&!sawRateLimit&&ranAny){this.log("\u26A0\uFE0F \u3069\u306EAI\u304B\u3089\u3082\u5B9F\u884C\u8A08\u753BJSON\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");return{outcome:"ok",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}if(!ranAny){if(skippedForCooldown){this.log("\u26A0\uFE0F \u5168AI\u304C\u30AF\u30FC\u30EB\u30C0\u30A6\u30F3\u4E2D\u30671\u3064\u3082\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5F85\u6A5F\u3057\u3066\u518D\u8A66\u884C\u3057\u307E\u3059\uFF09");
|
|
66
|
-
return{outcome:"rate-limited",usedAi:"",serverAiType:null,output:lastOutput}}this.log("\u26A0\uFE0F \u5B9F\u884C\u3067\u304D\u308BAI\u304C\u9396\u306B1\u3064\u3082\u3042\u308A\u307E\u305B\u3093\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u30FB\u30AB\u30C6\u30B4\u30EA\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09");return{outcome:"unavailable",usedAi:"",serverAiType:null,output:lastOutput}}if(sawTimeout){this.log("\u26A0\uFE0F \u5168AI\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u307E\u305F\u306F\u8A8D\u8A3C\u30A8\u30E9\u30FC\u3067\u3059\uFF08\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3067\u306F\u306A\u3044\u306E\u3067\u901A\u5E38\u5931\u6557\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09");
|
|
67
|
-
return{outcome:"timeout",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}if(sawRateLimit){this.log("\u26A0\uFE0F \u5168AI\u304C\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3067\u3059");return{outcome:"rate-limited",usedAi:"",serverAiType:null,output:lastOutput}}this.log("\u26A0\uFE0F \u5168AI\u304C\u8A8D\u8A3C\u30A8\u30E9\u30FC\u307E\u305F\u306F\u8D77\u52D5\u4E0D\u80FD\u3067\u3059\uFF081\u884C\u3082\u5B9F\u884C\u3057\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u5931\u6557\u3067\u306F\u306A\u304F\u672A\u5B9F\u884C\u3068\u3057\u3066\u6271\u3044\u307E\u3059\uFF09");
|
|
68
|
-
return{outcome:"unavailable",usedAi:tried[tried.length-1]??"",serverAiType:null,output:lastOutput}}async abort(){this.aborting=true;const abort=this.activeAbort;if(abort===null)return false;await abort();return true}now(){return(this.opts.now??(()=>new Date))().getTime()}usableOrder(order,category,skill){const detected=this.detectUnusable();const unique=[...new Set(order)];const kept=[];const soft=[];const dropped=[];for(const ai of unique){const hit=this.cfg.isAiUnusable(ai,this.now())?{why:"\u76F4\u8FD1\
|
|
69
|
-
\u306E\u8A8D\u8A3C\u30A8\u30E9\u30FC\u30FB\u8D77\u52D5\u5931\u6557",hard:false}:detected.get(ai);if(hit===void 0){kept.push(ai);continue}dropped.push(`${ai}\uFF08${hit.why}\uFF09`);if(!hit.hard)soft.push(ai)}if(dropped.length===0)return unique;const canRun=list=>list.some(ai=>this.cfg.isAllowed(ai,category,skill));if(!canRun(kept)&&canRun(soft)){this.log(` \u26A0\uFE0F \u9396\u306B\u5B9F\u884C\u3067\u304D\u308B AI \u304C\u6B8B\u308A\u307E\u305B\u3093\uFF08\u9664\u5916\u5019\u88DC: ${dropped.join(
|
|
70
|
-
" / ")}\uFF09`);this.log(" \u63A8\u5B9A\u3067\u5916\u3057\u305F\u3082\u306E\u306F\u5224\u5B9A\u304C\u8AA4\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u305F\u3081\u3001\u9396\u3078\u623B\u3057\u307E\u3059\uFF08fail-open\uFF09");return unique.filter(ai=>kept.includes(ai)||soft.includes(ai))}this.log(` \u9396\u304B\u3089\u9664\u5916: ${dropped.join(" / ")}`);if(kept.length===0){this.log(" \u9396\u306B\u8D77\u52D5\u3067\u304D\u308B AI \u304C1\u3064\u3082\u6B8B\u308A\u307E\u305B\u3093\uFF08\u672A\u5C0E\u5165\u306E AI \u3092\u8D77\u52D5\u3057\u3066\u3082\u5FC5\u305A\u5931\u6557\u3057\u307E\u3059\uFF09")}
|
|
71
|
-
return kept}detectUnusable(){const now=this.now();if(this.unusable!==null&&now-this.unusableAt<DETECT_CACHE_MS)return this.unusable;const map=new Map;this.unusable=map;this.unusableAt=now;try{for(const d of(this.opts.detectClis??detectAiClis)({env:this.opts.env??process.env,launcherBin:this.launcherBin()})){if(!d.installed)map.set(d.ai,{why:"PATH \u306B\u7121\u3044\uFF08\u672A\u5C0E\u5165\uFF09",hard:true});else if(d.auth==="unauthenticated")map.set(d.ai,{why:"\u672A\u30ED\u30B0\u30A4\u30F3",hard:false})}}catch(err){
|
|
72
|
-
this.log(` \u26A0\uFE0F AI CLI \u306E\u691C\u51FA\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08${err.message}\uFF09\u3002\u9396\u306F\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059`);map.clear()}return map}orderFor(category,skill,preferred){const chain=this.cfg.chainFor(category);const head=preferred&&preferred.trim()!==""?preferred.trim():this.cfg.selectPrimary(category,skill,"P2","");return head===""?chain:[head,...chain]}finish(outcome,ai,output,metrics){const serverAiType=isServerAiType(
|
|
73
|
-
ai)?ai:null;return metrics===void 0?{outcome,usedAi:ai,serverAiType,output}:{outcome,usedAi:ai,serverAiType,output,metrics}}async waitBeforeFallback(ai,env){const delay=this.cfg.fallbackDelaySec(ai,env);if(delay<=0)return;this.log(` \u23F3 ${ai} \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8 \u2192 \u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u524D\u306B ${delay}\u79D2 \u5F85\u6A5F\uFF08\u4ED6AI\u3078\u306E\u8EE2\u5AC1\u3092\u6291\u5236\uFF09`);const sleep=this.opts.sleep??(ms=>new Promise(r=>setTimeout(
|
|
74
|
-
r,ms)));await sleep(delay*1e3)}buildPrompt(body,promptPrefix,ai,tried){const expanded=this.expandForNonClaude(body,ai);const parts=[];if(tried.length>0)parts.push(fallbackNote(tried));const charter=this.charter();if(charter!==null)parts.push(charter);if(promptPrefix!==void 0&&promptPrefix!=="")parts.push(promptPrefix);parts.push(expanded);return parts.join("\n\n")}expandForNonClaude(prompt,ai){const cmd=this.opts.compileCommand;if(ai==="claude"||cmd===void 0||cmd.length===0)return prompt;const[file,
|
|
75
|
-
...args]=cmd;if(file===void 0)return prompt;const compileEnv={...this.opts.env??process.env};const resolved=process.platform!=="win32"||isWindowsDriveAbsolute(file)?file:findExecutable(file,{env:compileEnv,platform:"win32"});if(resolved===null)return prompt;const r=spawnSync(resolved,[...args,"--provider",ai,"--project-dir",this.opts.workspace],{encoding:"utf8",env:{...this.opts.env??process.env,_AI_PROMPT:prompt},timeout:6e4,maxBuffer:32*1024*1024});const out=(r.stdout??"").trim();if(r.error!==
|
|
76
|
-
void 0||r.status!==0||out===""){this.log(` \u26A0\uFE0F ${ai} \u5411\u3051\u306E\u30B9\u30AD\u30EB\u5C55\u958B\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u672A\u5C55\u958B\u306E\u307E\u307E\u5B9F\u884C\u3057\u307E\u3059\uFF09`);return prompt}return out}charter(){if(this.opts.charterEnabled===false)return null;const file=this.opts.charterFile;if(file===void 0||file.trim()==="")return null;const resolved=path2.isAbsolute(file)?file:path2.resolve(this.opts.workspace,file);let body;try{body=fs2.
|
|
77
|
-
readFileSync(resolved,"utf8")}catch{if(!this.charterWarned){this.charterWarned=true;this.log(` \u26A0\uFE0F\u26A0\uFE0F \u61B2\u7AE0\u3092\u6CE8\u5165\u3067\u304D\u307E\u305B\u3093\uFF08${resolved} \u304C\u8AAD\u3081\u306A\u3044\uFF09\u3002\u4EE5\u5F8C\u306E\u5B9F\u884C\u306F\u61B2\u7AE0\u306A\u3057\u3067\u9032\u307F\u307E\u3059`);this.log(" \u30D5\u30A1\u30A4\u30EB\u306E\u79FB\u52D5\u30FB\u6539\u540D\u30FB\u6A29\u9650\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8A2D\u5B9A: charter_file / CHARTER_FILE\uFF09")}
|
|
78
|
-
return null}const prefix=this.opts.charterPrefix??DEFAULT_CHARTER_PREFIX;const suffix=this.opts.charterSuffix??DEFAULT_CHARTER_SUFFIX;const parts=[];if(prefix!=="")parts.push(prefix);parts.push(body);if(suffix!=="")parts.push(suffix);return parts.join("\n\n")}preflightOk(){const env=this.opts.env??process.env;if((env.PREFLIGHT_ENABLED??"true")!=="true")return true;const hosts=this.opts.preflightHosts??DEFAULT_PREFLIGHT_HOSTS;if(hosts.length===0)return true;const timeout=Number.parseInt(env.PREFLIGHT_TIMEOUT??
|
|
79
|
-
"",10);const sec=Number.isInteger(timeout)&&timeout>0?timeout:5;for(let attempt=0;attempt<2;attempt+=1){if(attempt>0)sleepSync(2e3);for(const host of hosts){const nul=process.platform==="win32"?"NUL":"/dev/null";const curl=process.platform==="win32"?system32(process.env,"curl.exe"):"curl";if(curl===null)return false;const r=spawnSync(curl,["-sS","--max-time",String(sec),"-o",nul,`https://${host}/`],{encoding:"utf8",timeout:(sec+5)*1e3});if(r.error===void 0&&r.status===0)return true}}return false}};
|
|
80
|
-
var DETECT_CACHE_MS=1800*1e3;var DEFAULT_PREFLIGHT_HOSTS=["api.anthropic.com","github.com"];function fallbackNote(tried){return["\u3010\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u5B9F\u884C\u306B\u3064\u3044\u3066\u306E\u6CE8\u610F\u3011",`\u3053\u306E\u30BF\u30B9\u30AF\u306F\u5225\u306EAI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\uFF08${tried.join(", ")}\uFF09\u304C\u5148\u306B\u8A66\u884C\u3057\u307E\u3057\u305F\u304C\u3001\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u3001\u8A8D\u8A3C\u30A8\u30E9\u30FC\u3001\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306B\u3088\u308A\u5B8C\u4E86\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002`,
|
|
81
|
-
"\u524D\u306EAI\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u30BF\u30B9\u30AF\u306E\u9014\u4E2D\u307E\u3067\u4F5C\u696D\u3092\u9032\u3081\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u7279\u306B\u4EE5\u4E0B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044:","- TWP\u30BF\u30B9\u30AF\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u9032\u884C\u4E2D\u300D\u306B\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u304B\uFF08\u5909\u66F4\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u7D99\u7D9A\uFF09",
|
|
82
|
-
"- \u30B3\u30E1\u30F3\u30C8\u304C\u9014\u4E2D\u307E\u3067\u6295\u7A3F\u3055\u308C\u3066\u3044\u306A\u3044\u304B","- \u30D6\u30E9\u30F3\u30C1\u3084PR\u304C\u4F5C\u6210\u9014\u4E2D\u3067\u306A\u3044\u304B","\u307E\u305A\u73FE\u72B6\u3092\u78BA\u8A8D\u3057\u3066\u304B\u3089\u3001\u4E2D\u65AD\u3055\u308C\u305F\u7B87\u6240\u304B\u3089\u4F5C\u696D\u3092\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"].join("\n")}export{DEFAULT_CHARTER_PREFIX,DEFAULT_CHARTER_SUFFIX,DEFAULT_PREFLIGHT_HOSTS,DispatchEngine};
|
package/dist/chunk-4QI5NX4C.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
-
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
function isAiUnavailable(outcome){return outcome==="unavailable"||outcome==="rate-limited"||outcome==="network-down"}function needsHumanToRestoreAi(outcome){return outcome==="unavailable"}function aiUnavailableLabel(outcome){if(outcome==="rate-limited")return"\u5168AI\u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8";if(outcome==="network-down")return"\u30DB\u30B9\u30C8\u5074\u306E\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u969C\u5BB3";return"AI \u304C1\u3064\u3082\u4F7F\u3048\u306A\u3044\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\u7B49\uFF09"}
|
|
4
|
-
var SERVER_AI_TYPES=["claude","gemini","codex","copilot"];function isServerAiType(value){return SERVER_AI_TYPES.includes(value)}var NoopEngine=class{constructor(note="\uFF08noop \u30A8\u30F3\u30B8\u30F3: AI \u306F\u8D77\u52D5\u3057\u3066\u3044\u307E\u305B\u3093\uFF09"){this.note=note}note;name="noop";run(req){const output=[`[noop] prompt: ${req.prompt.split("\n").slice(-1)[0]??""}`,`[noop] cwd: ${req.cwd}`,`[noop] ai_type=${req.aiType??"(\u672A\u6307\u5B9A)"} ai_model=${req.aiModel??"(\u672A\u6307\u5B9A)"}`,
|
|
5
|
-
this.note].join("\n");return Promise.resolve({outcome:"ok",usedAi:"noop",serverAiType:null,output})}};var UnknownEngineError=class extends Error{constructor(name,available){super(`\u672A\u77E5\u306E\u30A8\u30F3\u30B8\u30F3\u3067\u3059: ${name}\uFF08\u5229\u7528\u3067\u304D\u308B\u306E\u306F ${available.join(" / ")}\uFF09`)}};var ENGINE_NAMES=["cli","noop"];function assertKnownEngine(name){if(!ENGINE_NAMES.includes(name)){throw new UnknownEngineError(name,ENGINE_NAMES)}}var EngineNotConfiguredError=class extends Error{constructor(){
|
|
6
|
-
super('\u5B9F\u884C\u30A8\u30F3\u30B8\u30F3\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\n \u5B9F AI \u3092\u8D77\u52D5\u3059\u308B\u306A\u3089 --engine cli\uFF08\u8A2D\u5B9A\u306A\u3089 "engine": "cli"\uFF09\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u9AA8\u683C\u3060\u3051\u3092\u691C\u8A3C\u3057\u305F\u3044\u5834\u5408\u306F --engine noop \u3092**\u660E\u793A**\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n \u26A0\uFE0F noop \u306F AI \u30921\u3064\u3082\u8D77\u52D5\u305B\u305A\u30A2\u30A4\u30C6\u30E0\u3092 completed \u306B\u3057\u307E\u3059\u3002**\u5B9F\u30AD\u30E5\u30FC\uFF08\u672C\u756A\u306E TWP \u7B49\uFF09\u3078\u5411\u3051\u306A\u3044\u3053\u3068**\n \u5B9A\u671F\u7531\u6765\u306E\u30A2\u30A4\u30C6\u30E0\u306A\u3089\u67A0\u307E\u3067\u6D88\u5316\u3055\u308C\u3001\u305D\u306E\u7A93\u306E release-deploy / develop-merge \u304C\u767A\u706B\u3057\u306A\u304F\u306A\u308A\u307E\u3059\u3002')}};export{isAiUnavailable,needsHumanToRestoreAi,aiUnavailableLabel,isServerAiType,NoopEngine,UnknownEngineError,assertKnownEngine,EngineNotConfiguredError};
|