[{"data":1,"prerenderedAt":2401},["ShallowReactive",2],{"docs:\u002Fguide\u002Fflow":3},{"page":4,"untranslated":2400,"translated":2400},{"id":5,"title":6,"body":7,"description":2391,"extension":2392,"meta":2393,"navigation":77,"path":2394,"publishedAt":2395,"seo":2396,"stem":2397,"updatedAt":2398,"__hash__":2399},"docs_ja\u002Fguide\u002Fflow.md","Flow",{"type":8,"value":9,"toc":2373},"minimark",[10,14,22,26,40,401,419,451,454,491,527,530,565,568,610,625,628,634,788,813,831,834,843,1035,1053,1078,1092,1095,1106,1109,1118,1176,1383,1418,1435,1508,1511,1536,1623,1630,1633,1660,1691,1699,1702,1725,1727,1730,1807,1820,1840,1851,1854,1877,1881,1889,1895,1898,1907,2043,2080,2082,2094,2106,2126,2129,2137,2284,2299,2339,2369],[11,12,6],"h1",{"id":13},"flow",[15,16,17,18,21],"p",{},"Flowは、依存関係を持つ複数のジョブを有向非巡回グラフ(DAG)で定義する仕組みです。",[19,20],"br",{},"\nRunは、Flowを1回実行した単位です。",[23,24,25],"h2",{"id":25},"定義",[15,27,28,32,33,36,37,39],{},[29,30,31],"code",{},"createFlow","は、",[29,34,35],{},"performers","を受け取り、Flowを定義する関数を戻り値とします。",[19,38],{},"\nbinding名とpayloadの型は、単独のジョブと同様に型検査されます。",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-ts shiki shiki-themes github-light github-dark","import { createFlow, defineTsumugi } from 'tsumugi';\n\nconst performers = { ListNames, Greet, Report };\nconst flow = createFlow(performers);\n\nconst flows = {\n  GREETINGS: flow\u003C{ prefix: string }>((f) => {\n    const list = f.node('list', 'ListNames', {\n      input: (i) => ({ prefix: i.prefix }),\n    });\n\n    const each = f.fanOut('greet', 'Greet', {\n      after: { list },\n      over: (_i, d) => d.list.names,\n      input: (name) => ({ name }),\n    });\n\n    f.node('report', 'Report', {\n      after: { each },\n      input: (_i, d) => ({ total: d.each.total, failed: d.each.failed }),\n    });\n  }),\n};\n\nconst tsumugi = defineTsumugi({ performers, flows, auth: \u002F* ... *\u002F });\n","ts","",[29,48,49,72,79,95,112,117,130,165,197,216,222,227,254,260,283,300,305,310,330,336,356,361,367,373,378],{"__ignoreMap":46},[50,51,54,58,62,65,69],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"szBVR","import",[50,59,61],{"class":60},"sVt8B"," { createFlow, defineTsumugi } ",[50,63,64],{"class":56},"from",[50,66,68],{"class":67},"sZZnC"," 'tsumugi'",[50,70,71],{"class":60},";\n",[50,73,75],{"class":52,"line":74},2,[50,76,78],{"emptyLinePlaceholder":77},true,"\n",[50,80,82,85,89,92],{"class":52,"line":81},3,[50,83,84],{"class":56},"const",[50,86,88],{"class":87},"sj4cs"," performers",[50,90,91],{"class":56}," =",[50,93,94],{"class":60}," { ListNames, Greet, Report };\n",[50,96,98,100,103,105,109],{"class":52,"line":97},4,[50,99,84],{"class":56},[50,101,102],{"class":87}," flow",[50,104,91],{"class":56},[50,106,108],{"class":107},"sScJk"," createFlow",[50,110,111],{"class":60},"(performers);\n",[50,113,115],{"class":52,"line":114},5,[50,116,78],{"emptyLinePlaceholder":77},[50,118,120,122,125,127],{"class":52,"line":119},6,[50,121,84],{"class":56},[50,123,124],{"class":87}," flows",[50,126,91],{"class":56},[50,128,129],{"class":60}," {\n",[50,131,133,136,138,141,145,148,151,154,157,160,163],{"class":52,"line":132},7,[50,134,135],{"class":60},"  GREETINGS: ",[50,137,13],{"class":107},[50,139,140],{"class":60},"\u003C{ ",[50,142,144],{"class":143},"s4XuR","prefix",[50,146,147],{"class":56},":",[50,149,150],{"class":87}," string",[50,152,153],{"class":60}," }>((",[50,155,156],{"class":143},"f",[50,158,159],{"class":60},") ",[50,161,162],{"class":56},"=>",[50,164,129],{"class":60},[50,166,168,171,174,176,179,182,185,188,191,194],{"class":52,"line":167},8,[50,169,170],{"class":56},"    const",[50,172,173],{"class":87}," list",[50,175,91],{"class":56},[50,177,178],{"class":60}," f.",[50,180,181],{"class":107},"node",[50,183,184],{"class":60},"(",[50,186,187],{"class":67},"'list'",[50,189,190],{"class":60},", ",[50,192,193],{"class":67},"'ListNames'",[50,195,196],{"class":60},", {\n",[50,198,200,203,206,209,211,213],{"class":52,"line":199},9,[50,201,202],{"class":107},"      input",[50,204,205],{"class":60},": (",[50,207,208],{"class":143},"i",[50,210,159],{"class":60},[50,212,162],{"class":56},[50,214,215],{"class":60}," ({ prefix: i.prefix }),\n",[50,217,219],{"class":52,"line":218},10,[50,220,221],{"class":60},"    });\n",[50,223,225],{"class":52,"line":224},11,[50,226,78],{"emptyLinePlaceholder":77},[50,228,230,232,235,237,239,242,244,247,249,252],{"class":52,"line":229},12,[50,231,170],{"class":56},[50,233,234],{"class":87}," each",[50,236,91],{"class":56},[50,238,178],{"class":60},[50,240,241],{"class":107},"fanOut",[50,243,184],{"class":60},[50,245,246],{"class":67},"'greet'",[50,248,190],{"class":60},[50,250,251],{"class":67},"'Greet'",[50,253,196],{"class":60},[50,255,257],{"class":52,"line":256},13,[50,258,259],{"class":60},"      after: { list },\n",[50,261,263,266,268,271,273,276,278,280],{"class":52,"line":262},14,[50,264,265],{"class":107},"      over",[50,267,205],{"class":60},[50,269,270],{"class":143},"_i",[50,272,190],{"class":60},[50,274,275],{"class":143},"d",[50,277,159],{"class":60},[50,279,162],{"class":56},[50,281,282],{"class":60}," d.list.names,\n",[50,284,286,288,290,293,295,297],{"class":52,"line":285},15,[50,287,202],{"class":107},[50,289,205],{"class":60},[50,291,292],{"class":143},"name",[50,294,159],{"class":60},[50,296,162],{"class":56},[50,298,299],{"class":60}," ({ name }),\n",[50,301,303],{"class":52,"line":302},16,[50,304,221],{"class":60},[50,306,308],{"class":52,"line":307},17,[50,309,78],{"emptyLinePlaceholder":77},[50,311,313,316,318,320,323,325,328],{"class":52,"line":312},18,[50,314,315],{"class":60},"    f.",[50,317,181],{"class":107},[50,319,184],{"class":60},[50,321,322],{"class":67},"'report'",[50,324,190],{"class":60},[50,326,327],{"class":67},"'Report'",[50,329,196],{"class":60},[50,331,333],{"class":52,"line":332},19,[50,334,335],{"class":60},"      after: { each },\n",[50,337,339,341,343,345,347,349,351,353],{"class":52,"line":338},20,[50,340,202],{"class":107},[50,342,205],{"class":60},[50,344,270],{"class":143},[50,346,190],{"class":60},[50,348,275],{"class":143},[50,350,159],{"class":60},[50,352,162],{"class":56},[50,354,355],{"class":60}," ({ total: d.each.total, failed: d.each.failed }),\n",[50,357,359],{"class":52,"line":358},21,[50,360,221],{"class":60},[50,362,364],{"class":52,"line":363},22,[50,365,366],{"class":60},"  }),\n",[50,368,370],{"class":52,"line":369},23,[50,371,372],{"class":60},"};\n",[50,374,376],{"class":52,"line":375},24,[50,377,78],{"emptyLinePlaceholder":77},[50,379,381,383,386,388,391,394,398],{"class":52,"line":380},25,[50,382,84],{"class":56},[50,384,385],{"class":87}," tsumugi",[50,387,91],{"class":56},[50,389,390],{"class":107}," defineTsumugi",[50,392,393],{"class":60},"({ performers, flows, auth: ",[50,395,397],{"class":396},"sJ8bj","\u002F* ... *\u002F",[50,399,400],{"class":60}," });\n",[15,402,403,406,407,409,410,415,416,418],{},[29,404,405],{},"f.node","の第1引数にはノードIDを、第2引数にはbinding名を指定します。",[19,408],{},"\nbinding名は、",[411,412,414],"a",{"href":413},"\u002Fguide\u002Fperformer#binding%E5%90%8D","exportした名前","と一致させてください。",[19,417],{},"\nノードIDは、英数字、ハイフン、アンダースコアで構成します。",[15,420,421,424,425,427,428,431,432,434,435,190,438,190,441,190,444,190,447,450],{},[29,422,423],{},"input","には、Flowの入力と前段の戻り値からpayloadを生成する関数を指定します。",[19,426],{},"\n第2引数は、",[29,429,430],{},"after","に渡したオブジェクトのキーをプロパティ名とするオブジェクトです。",[19,433],{},"\nノードの定義には、ジョブの投入時と同じオプション(",[29,436,437],{},"maxAttempts",[29,439,440],{},"backoff",[29,442,443],{},"timeoutMs",[29,445,446],{},"priority",[29,448,449],{},"concurrencyKey","など)を任意で指定します。",[23,452,453],{"id":453},"開始",[41,455,457],{"className":43,"code":456,"language":45,"meta":46,"style":46},"const runId = await tsumugi.start(env, 'GREETINGS', { prefix: 'hello' });\n",[29,458,459],{"__ignoreMap":46},[50,460,461,463,466,468,471,474,477,480,483,486,489],{"class":52,"line":53},[50,462,84],{"class":56},[50,464,465],{"class":87}," runId",[50,467,91],{"class":56},[50,469,470],{"class":56}," await",[50,472,473],{"class":60}," tsumugi.",[50,475,476],{"class":107},"start",[50,478,479],{"class":60},"(env, ",[50,481,482],{"class":67},"'GREETINGS'",[50,484,485],{"class":60},", { prefix: ",[50,487,488],{"class":67},"'hello'",[50,490,400],{"class":60},[15,492,493,495,496,498,500,501,504,505,508,509,511,512,514,515,517,518,521,522,526],{},[29,494,423],{},"の型は、Flowの型引数から導出されます。",[19,497],{},[29,499,476],{},"の第4引数に",[29,502,503],{},"{ id }","を渡すと、runIdは",[29,506,507],{},"\u003Cflow>:\u003Cid>","に固定されます。",[19,510],{},"\n同じIDで2回目に開始した場合は、新しいRunが作成されず、既存のrunIdが戻り値です。",[19,513],{},"\nリトライされるHTTPハンドラから呼んでも、Runは重複しません。",[19,516],{},"\n第4引数の",[29,519,520],{},"{ deadlineMs }","が、Run全体の",[411,523,525],{"href":524},"#%E6%9C%9F%E9%99%90","期限","です。",[23,528,529],{"id":529},"fan-out",[15,531,532,533,536,537,539,542,543,545,546,190,549,552,553,555,558,559,561,562,564],{},"配列の要素数に応じた並列処理は、",[29,534,535],{},"f.fanOut","で定義します。",[19,538],{},[29,540,541],{},"over","の戻り値の要素ごとに、子ノードが1つずつ作成されます。",[19,544],{},"\n子ノードのIDは、要素の添字です。たとえば",[29,547,548],{},"greet:0",[29,550,551],{},"greet:1","となります。",[19,554],{},[29,556,557],{},"key","を渡した場合は、",[29,560,557],{},"の戻り値が添字の代わりに使われます。",[19,563],{},"\n使える文字は、ノードIDと同様です。",[15,566,567],{},"後続のノードが受け取るのは、次の形式の集計値です。",[41,569,571],{"className":43,"code":570,"language":45,"meta":46,"style":46},"{ total: 3, succeeded: 2, failed: 1 }\n",[29,572,573],{"__ignoreMap":46},[50,574,575,578,581,584,587,589,592,594,597,599,602,604,607],{"class":52,"line":53},[50,576,577],{"class":60},"{ ",[50,579,580],{"class":107},"total",[50,582,583],{"class":60},": ",[50,585,586],{"class":87},"3",[50,588,190],{"class":60},[50,590,591],{"class":107},"succeeded",[50,593,583],{"class":60},[50,595,596],{"class":87},"2",[50,598,190],{"class":60},[50,600,601],{"class":107},"failed",[50,603,583],{"class":60},[50,605,606],{"class":87},"1",[50,608,609],{"class":60}," }\n",[15,611,612,613,615,616,618,619,621,622,624],{},"子ノードごとの戻り値は、後続のノードに渡されません。",[19,614],{},"\n個別の結果が必要な場合は、performerがR2やD1などに書き込み、その参照を戻り値にしてください。",[19,617],{},"\n子ノードが失敗しても、fan-outのノード自体は失敗しません。",[19,620],{},"\n失敗の有無は、後続のノードが受け取る",[29,623,601],{},"の値で判断します。",[23,626,627],{"id":627},"perform内からのノード追加",[15,629,630,633],{},[29,631,632],{},"ctx.spawn","を呼ぶと、実行中のノードに子ノードが追加されます。",[41,635,637],{"className":43,"code":636,"language":45,"meta":46,"style":46},"class Crawl extends Performer\u003C{ url: string }, void, {}, Env> {\n  async perform(payload: { url: string }, ctx: JobContext): Promise\u003Cvoid> {\n    for (const found of await this.discover(payload.url)) {\n      ctx.spawn(found.id, 'CRAWL', { url: found.url });\n    }\n  }\n}\n",[29,638,639,677,726,756,773,778,783],{"__ignoreMap":46},[50,640,641,644,647,650,653,655,658,660,662,665,668,671,674],{"class":52,"line":53},[50,642,643],{"class":56},"class",[50,645,646],{"class":107}," Crawl",[50,648,649],{"class":56}," extends",[50,651,652],{"class":107}," Performer",[50,654,140],{"class":60},[50,656,657],{"class":143},"url",[50,659,147],{"class":56},[50,661,150],{"class":87},[50,663,664],{"class":60}," }, ",[50,666,667],{"class":87},"void",[50,669,670],{"class":60},", {}, ",[50,672,673],{"class":107},"Env",[50,675,676],{"class":60},"> {\n",[50,678,679,682,685,687,690,692,695,697,699,701,703,706,708,711,714,716,719,722,724],{"class":52,"line":74},[50,680,681],{"class":56},"  async",[50,683,684],{"class":107}," perform",[50,686,184],{"class":60},[50,688,689],{"class":143},"payload",[50,691,147],{"class":56},[50,693,694],{"class":60}," { ",[50,696,657],{"class":143},[50,698,147],{"class":56},[50,700,150],{"class":87},[50,702,664],{"class":60},[50,704,705],{"class":143},"ctx",[50,707,147],{"class":56},[50,709,710],{"class":107}," JobContext",[50,712,713],{"class":60},")",[50,715,147],{"class":56},[50,717,718],{"class":107}," Promise",[50,720,721],{"class":60},"\u003C",[50,723,667],{"class":87},[50,725,676],{"class":60},[50,727,728,731,734,736,739,742,744,747,750,753],{"class":52,"line":81},[50,729,730],{"class":56},"    for",[50,732,733],{"class":60}," (",[50,735,84],{"class":56},[50,737,738],{"class":87}," found",[50,740,741],{"class":56}," of",[50,743,470],{"class":56},[50,745,746],{"class":87}," this",[50,748,749],{"class":60},".",[50,751,752],{"class":107},"discover",[50,754,755],{"class":60},"(payload.url)) {\n",[50,757,758,761,764,767,770],{"class":52,"line":97},[50,759,760],{"class":60},"      ctx.",[50,762,763],{"class":107},"spawn",[50,765,766],{"class":60},"(found.id, ",[50,768,769],{"class":67},"'CRAWL'",[50,771,772],{"class":60},", { url: found.url });\n",[50,774,775],{"class":52,"line":114},[50,776,777],{"class":60},"    }\n",[50,779,780],{"class":52,"line":119},[50,781,782],{"class":60},"  }\n",[50,784,785],{"class":52,"line":132},[50,786,787],{"class":60},"}\n",[15,789,790,791,793,794,797,798,800,801,803,806,807,809,810,812],{},"第1引数のIDは必須です。",[19,792],{},"\n子ノードのIDは",[29,795,796],{},"\u003C親のノードID>:\u003C指定したID>","で構成され、使用できる文字はノードIDと同一です。",[19,799],{},"\n同一のIDで複数回呼び出しても、子ノードは重複して作成されません。",[19,802],{},[29,804,805],{},"perform","が失敗した試行で追加された子ノードは、作成されません。",[19,808],{},"\n再実行時の",[29,811,805],{},"で、改めて追加してください。",[15,814,815,817,818,820,821,823,824,526],{},[29,816,763],{},"には、型検査が適用されません。",[19,819],{},"\nbinding名とpayloadは、実行時の値として渡します。",[19,822],{},"\n別Workerのperformerから呼ぶ場合は、",[411,825,827,830],{"href":826},"\u002Fguide\u002Fperformer#%E5%88%A5worker%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%88%B6%E7%B4%84",[29,828,829],{},"await","が必要",[23,832,833],{"id":833},"subflow",[15,835,836,839,840,842],{},[29,837,838],{},"f.subflow","は、別のFlowをRunとして開始します。",[19,841],{},"\nノードは、そのRunが終了した時点で完了します。",[41,844,846],{"className":43,"code":845,"language":45,"meta":46,"style":46},"const REPORTING = flow\u003C{ ids: string[] }>((f) => {\n  \u002F\u002F ...\n});\n\nconst PIPELINE = flow\u003C{ prefix: string }>((f) => {\n  const list = f.node('list', 'LIST', { input: (i) => ({ prefix: i.prefix }) });\n  const reported = f.subflow('report', REPORTING, { input: (_i, d) => ({ ids: d.list.ids }) });\n  f.node('notify', 'NOTIFY', { after: { reported }, input: () => ({}) });\n});\n",[29,847,848,879,884,889,893,922,960,1001,1031],{"__ignoreMap":46},[50,849,850,852,855,857,859,861,864,866,868,871,873,875,877],{"class":52,"line":53},[50,851,84],{"class":56},[50,853,854],{"class":87}," REPORTING",[50,856,91],{"class":56},[50,858,102],{"class":107},[50,860,140],{"class":60},[50,862,863],{"class":143},"ids",[50,865,147],{"class":56},[50,867,150],{"class":87},[50,869,870],{"class":60},"[] }>((",[50,872,156],{"class":143},[50,874,159],{"class":60},[50,876,162],{"class":56},[50,878,129],{"class":60},[50,880,881],{"class":52,"line":74},[50,882,883],{"class":396},"  \u002F\u002F ...\n",[50,885,886],{"class":52,"line":81},[50,887,888],{"class":60},"});\n",[50,890,891],{"class":52,"line":97},[50,892,78],{"emptyLinePlaceholder":77},[50,894,895,897,900,902,904,906,908,910,912,914,916,918,920],{"class":52,"line":114},[50,896,84],{"class":56},[50,898,899],{"class":87}," PIPELINE",[50,901,91],{"class":56},[50,903,102],{"class":107},[50,905,140],{"class":60},[50,907,144],{"class":143},[50,909,147],{"class":56},[50,911,150],{"class":87},[50,913,153],{"class":60},[50,915,156],{"class":143},[50,917,159],{"class":60},[50,919,162],{"class":56},[50,921,129],{"class":60},[50,923,924,927,929,931,933,935,937,939,941,944,947,949,951,953,955,957],{"class":52,"line":119},[50,925,926],{"class":56},"  const",[50,928,173],{"class":87},[50,930,91],{"class":56},[50,932,178],{"class":60},[50,934,181],{"class":107},[50,936,184],{"class":60},[50,938,187],{"class":67},[50,940,190],{"class":60},[50,942,943],{"class":67},"'LIST'",[50,945,946],{"class":60},", { ",[50,948,423],{"class":107},[50,950,205],{"class":60},[50,952,208],{"class":143},[50,954,159],{"class":60},[50,956,162],{"class":56},[50,958,959],{"class":60}," ({ prefix: i.prefix }) });\n",[50,961,962,964,967,969,971,973,975,977,979,982,984,986,988,990,992,994,996,998],{"class":52,"line":132},[50,963,926],{"class":56},[50,965,966],{"class":87}," reported",[50,968,91],{"class":56},[50,970,178],{"class":60},[50,972,833],{"class":107},[50,974,184],{"class":60},[50,976,322],{"class":67},[50,978,190],{"class":60},[50,980,981],{"class":87},"REPORTING",[50,983,946],{"class":60},[50,985,423],{"class":107},[50,987,205],{"class":60},[50,989,270],{"class":143},[50,991,190],{"class":60},[50,993,275],{"class":143},[50,995,159],{"class":60},[50,997,162],{"class":56},[50,999,1000],{"class":60}," ({ ids: d.list.ids }) });\n",[50,1002,1003,1006,1008,1010,1013,1015,1018,1021,1023,1026,1028],{"class":52,"line":167},[50,1004,1005],{"class":60},"  f.",[50,1007,181],{"class":107},[50,1009,184],{"class":60},[50,1011,1012],{"class":67},"'notify'",[50,1014,190],{"class":60},[50,1016,1017],{"class":67},"'NOTIFY'",[50,1019,1020],{"class":60},", { after: { reported }, ",[50,1022,423],{"class":107},[50,1024,1025],{"class":60},": () ",[50,1027,162],{"class":56},[50,1029,1030],{"class":60}," ({}) });\n",[50,1032,1033],{"class":52,"line":199},[50,1034,888],{"class":60},[15,1036,1037,1038,1040,1042,1043,1045,1046,1049,1050,1052],{},"第2引数には、Flowの定義そのものを渡します。",[19,1039],{},[29,1041,423],{},"の型は、渡したFlowの型引数から導出されます。",[19,1044],{},"\n開始するFlowは、",[29,1047,1048],{},"flows","に登録してください。",[19,1051],{},"\n未登録の場合は、開始時にエラーが発生します。",[15,1054,1055,1056,526,1059,1061,1062,1064,1065,190,1068,190,1071,1074,1075,1077],{},"子のRunのrunIdは、",[29,1057,1058],{},"\u003C子のFlow名>:\u003C親のrunIdのローカル部>-\u003CノードID>",[19,1060],{},"\n子のRunの状態が、そのままノードの状態として反映されます。",[19,1063],{},"\n状態は、",[29,1066,1067],{},"COMPLETED",[29,1069,1070],{},"FAILED",[29,1072,1073],{},"CANCELLED","のいずれかです。",[19,1076],{},"\n親のRunを取り消すと、子のRunも取り消されます。",[15,1079,1080,1081,1083,1084,1086,1087,1091],{},"親のノードは、子のRunの戻り値を受け取りません。",[19,1082],{},"\n結果が必要なら、performerがR2やD1などに書き込みます。",[19,1085],{},"\n入れ子の上限は、",[411,1088,1090],{"href":1089},"#%E5%88%B6%E7%B4%84","制約","を参照してください。",[23,1093,1094],{"id":1094},"待ち合わせ",[15,1096,1097,1098,1100,1102,1103,1105],{},"ノードは、自身と子孫のノードがすべて終了した時点で完了します。",[19,1099],{},[29,1101,430],{},"で指定したノードに依存する後続のノードは、fan-outの子ノードと",[29,1104,763],{},"で追加された子孫のノードが終了した後に実行されます。",[23,1107,1108],{"id":1108},"実行条件",[15,1110,1111,1112,1114,1117],{},"既定では、依存するノードがすべて成功したときに限り、ノードが実行されます。",[19,1113],{},[29,1115,1116],{},"trigger","は、依存するノードが失敗した場合の挙動を指定します。",[1119,1120,1121,1134],"table",{},[1122,1123,1124],"thead",{},[1125,1126,1127,1131],"tr",{},[1128,1129,1130],"th",{},"値",[1128,1132,1133],{},"実行される条件",[1135,1136,1137,1148,1166],"tbody",{},[1125,1138,1139,1145],{},[1140,1141,1142],"td",{},[29,1143,1144],{},"'success'",[1140,1146,1147],{},"依存するノードがすべて成功。既定値",[1125,1149,1150,1155],{},[1140,1151,1152],{},[29,1153,1154],{},"'failure'",[1140,1156,1157,1158,190,1160,190,1163,1165],{},"依存するノードのうち1つ以上が",[29,1159,1070],{},[29,1161,1162],{},"STALLED",[29,1164,1073],{},"のいずれか",[1125,1167,1168,1173],{},[1140,1169,1170],{},[29,1171,1172],{},"'always'",[1140,1174,1175],{},"依存するノードがすべて終了。成否は不問",[41,1177,1179],{"className":43,"code":1178,"language":45,"meta":46,"style":46},"const flows = {\n  BACKUP: flow\u003C{ target: string }>((f) => {\n    const dump = f.node('dump', 'DUMP', { input: (i) => ({ target: i.target }) });\n\n    \u002F\u002F 失敗時のみ実行\n    f.node('alert', 'ALERT', {\n      after: { dump },\n      trigger: 'failure',\n      input: (i) => ({ message: `backup failed: ${i.target}` }),\n    });\n\n    \u002F\u002F 成否によらず実行\n    f.node('unlock', 'UNLOCK', { after: { dump }, trigger: 'always', input: (i) => ({ target: i.target }) });\n  }),\n};\n",[29,1180,1181,1191,1217,1255,1259,1264,1282,1287,1297,1327,1331,1335,1340,1375,1379],{"__ignoreMap":46},[50,1182,1183,1185,1187,1189],{"class":52,"line":53},[50,1184,84],{"class":56},[50,1186,124],{"class":87},[50,1188,91],{"class":56},[50,1190,129],{"class":60},[50,1192,1193,1196,1198,1200,1203,1205,1207,1209,1211,1213,1215],{"class":52,"line":74},[50,1194,1195],{"class":60},"  BACKUP: ",[50,1197,13],{"class":107},[50,1199,140],{"class":60},[50,1201,1202],{"class":143},"target",[50,1204,147],{"class":56},[50,1206,150],{"class":87},[50,1208,153],{"class":60},[50,1210,156],{"class":143},[50,1212,159],{"class":60},[50,1214,162],{"class":56},[50,1216,129],{"class":60},[50,1218,1219,1221,1224,1226,1228,1230,1232,1235,1237,1240,1242,1244,1246,1248,1250,1252],{"class":52,"line":81},[50,1220,170],{"class":56},[50,1222,1223],{"class":87}," dump",[50,1225,91],{"class":56},[50,1227,178],{"class":60},[50,1229,181],{"class":107},[50,1231,184],{"class":60},[50,1233,1234],{"class":67},"'dump'",[50,1236,190],{"class":60},[50,1238,1239],{"class":67},"'DUMP'",[50,1241,946],{"class":60},[50,1243,423],{"class":107},[50,1245,205],{"class":60},[50,1247,208],{"class":143},[50,1249,159],{"class":60},[50,1251,162],{"class":56},[50,1253,1254],{"class":60}," ({ target: i.target }) });\n",[50,1256,1257],{"class":52,"line":97},[50,1258,78],{"emptyLinePlaceholder":77},[50,1260,1261],{"class":52,"line":114},[50,1262,1263],{"class":396},"    \u002F\u002F 失敗時のみ実行\n",[50,1265,1266,1268,1270,1272,1275,1277,1280],{"class":52,"line":119},[50,1267,315],{"class":60},[50,1269,181],{"class":107},[50,1271,184],{"class":60},[50,1273,1274],{"class":67},"'alert'",[50,1276,190],{"class":60},[50,1278,1279],{"class":67},"'ALERT'",[50,1281,196],{"class":60},[50,1283,1284],{"class":52,"line":132},[50,1285,1286],{"class":60},"      after: { dump },\n",[50,1288,1289,1292,1294],{"class":52,"line":167},[50,1290,1291],{"class":60},"      trigger: ",[50,1293,1154],{"class":67},[50,1295,1296],{"class":60},",\n",[50,1298,1299,1301,1303,1305,1307,1309,1312,1315,1317,1319,1321,1324],{"class":52,"line":199},[50,1300,202],{"class":107},[50,1302,205],{"class":60},[50,1304,208],{"class":143},[50,1306,159],{"class":60},[50,1308,162],{"class":56},[50,1310,1311],{"class":60}," ({ message: ",[50,1313,1314],{"class":67},"`backup failed: ${",[50,1316,208],{"class":60},[50,1318,749],{"class":67},[50,1320,1202],{"class":60},[50,1322,1323],{"class":67},"}`",[50,1325,1326],{"class":60}," }),\n",[50,1328,1329],{"class":52,"line":218},[50,1330,221],{"class":60},[50,1332,1333],{"class":52,"line":224},[50,1334,78],{"emptyLinePlaceholder":77},[50,1336,1337],{"class":52,"line":229},[50,1338,1339],{"class":396},"    \u002F\u002F 成否によらず実行\n",[50,1341,1342,1344,1346,1348,1351,1353,1356,1359,1361,1363,1365,1367,1369,1371,1373],{"class":52,"line":256},[50,1343,315],{"class":60},[50,1345,181],{"class":107},[50,1347,184],{"class":60},[50,1349,1350],{"class":67},"'unlock'",[50,1352,190],{"class":60},[50,1354,1355],{"class":67},"'UNLOCK'",[50,1357,1358],{"class":60},", { after: { dump }, trigger: ",[50,1360,1172],{"class":67},[50,1362,190],{"class":60},[50,1364,423],{"class":107},[50,1366,205],{"class":60},[50,1368,208],{"class":143},[50,1370,159],{"class":60},[50,1372,162],{"class":56},[50,1374,1254],{"class":60},[50,1376,1377],{"class":52,"line":262},[50,1378,366],{"class":60},[50,1380,1381],{"class":52,"line":285},[50,1382,372],{"class":60},[15,1384,1385,1387,1388,1390,1391,1393,1395,1396,1398,1400,1401,1404,1405,1408,1409,1411,1412,1414,1415,1417],{},[29,1386,430],{},"のないノードに",[29,1389,1116],{},"を指定すると、エラーが発生します。",[19,1392],{},[29,1394,1154],{},"の条件に数えるのは、実際に失敗したノードに限られます。",[19,1397],{},[29,1399,1116],{},"や",[29,1402,1403],{},"when","の条件を満たさず",[29,1406,1407],{},"SKIPPED","になったノードは、失敗に数えません。",[19,1410],{},"\n依存するノードがすべて",[29,1413,1407],{},"の場合、",[29,1416,1154],{},"のノードは実行されません。",[15,1419,1420,1422,1423,1425,1426,1428,1430,1431,1434],{},[29,1421,1154],{},"と",[29,1424,1172],{},"では、失敗したノードの戻り値がありません。",[19,1427],{},[29,1429,423],{},"の第2引数の型は",[29,1432,1433],{},"undefined","を含むため、値がない場合の処理を記述してください。",[41,1436,1438],{"className":43,"code":1437,"language":45,"meta":46,"style":46},"f.node('alert', 'ALERT', {\n  after: { dump },\n  trigger: 'always',\n  \u002F\u002F d.dumpはundefinedの可能性あり\n  input: (_i, d) => ({ size: d.dump?.size ?? 0 }),\n});\n",[29,1439,1440,1457,1462,1471,1476,1504],{"__ignoreMap":46},[50,1441,1442,1445,1447,1449,1451,1453,1455],{"class":52,"line":53},[50,1443,1444],{"class":60},"f.",[50,1446,181],{"class":107},[50,1448,184],{"class":60},[50,1450,1274],{"class":67},[50,1452,190],{"class":60},[50,1454,1279],{"class":67},[50,1456,196],{"class":60},[50,1458,1459],{"class":52,"line":74},[50,1460,1461],{"class":60},"  after: { dump },\n",[50,1463,1464,1467,1469],{"class":52,"line":81},[50,1465,1466],{"class":60},"  trigger: ",[50,1468,1172],{"class":67},[50,1470,1296],{"class":60},[50,1472,1473],{"class":52,"line":97},[50,1474,1475],{"class":396},"  \u002F\u002F d.dumpはundefinedの可能性あり\n",[50,1477,1478,1481,1483,1485,1487,1489,1491,1493,1496,1499,1502],{"class":52,"line":114},[50,1479,1480],{"class":107},"  input",[50,1482,205],{"class":60},[50,1484,270],{"class":143},[50,1486,190],{"class":60},[50,1488,275],{"class":143},[50,1490,159],{"class":60},[50,1492,162],{"class":56},[50,1494,1495],{"class":60}," ({ size: d.dump?.size ",[50,1497,1498],{"class":56},"??",[50,1500,1501],{"class":87}," 0",[50,1503,1326],{"class":60},[50,1505,1506],{"class":52,"line":119},[50,1507,888],{"class":60},[23,1509,1510],{"id":1510},"条件分岐",[15,1512,1513,1515,1516,1518,1520,1521,1524,1525,1527,1528,1530,1532,1533,1535],{},[29,1514,1403],{},"は、Flowの入力や前段の結果に基づき、ノードの実行可否を決定します。",[19,1517],{},[29,1519,1403],{},"が",[29,1522,1523],{},"false","を返した場合、そのノードは",[29,1526,1407],{},"に遷移し、依存する後続のノードも実行されません。",[19,1529],{},[29,1531,1403],{},"内で例外が発生したときは、ノードは",[29,1534,1070],{},"に遷移します。",[41,1537,1539],{"className":43,"code":1538,"language":45,"meta":46,"style":46},"f.node('detail', 'DETAIL', {\n  after: { list },\n  when: (i, d) => i.verbose && d.list.items.length > 0,\n  input: (_i, d) => ({ items: d.list.items }),\n});\n",[29,1540,1541,1559,1564,1600,1619],{"__ignoreMap":46},[50,1542,1543,1545,1547,1549,1552,1554,1557],{"class":52,"line":53},[50,1544,1444],{"class":60},[50,1546,181],{"class":107},[50,1548,184],{"class":60},[50,1550,1551],{"class":67},"'detail'",[50,1553,190],{"class":60},[50,1555,1556],{"class":67},"'DETAIL'",[50,1558,196],{"class":60},[50,1560,1561],{"class":52,"line":74},[50,1562,1563],{"class":60},"  after: { list },\n",[50,1565,1566,1569,1571,1573,1575,1577,1579,1581,1584,1587,1590,1593,1596,1598],{"class":52,"line":81},[50,1567,1568],{"class":107},"  when",[50,1570,205],{"class":60},[50,1572,208],{"class":143},[50,1574,190],{"class":60},[50,1576,275],{"class":143},[50,1578,159],{"class":60},[50,1580,162],{"class":56},[50,1582,1583],{"class":60}," i.verbose ",[50,1585,1586],{"class":56},"&&",[50,1588,1589],{"class":60}," d.list.items.",[50,1591,1592],{"class":87},"length",[50,1594,1595],{"class":56}," >",[50,1597,1501],{"class":87},[50,1599,1296],{"class":60},[50,1601,1602,1604,1606,1608,1610,1612,1614,1616],{"class":52,"line":97},[50,1603,1480],{"class":107},[50,1605,205],{"class":60},[50,1607,270],{"class":143},[50,1609,190],{"class":60},[50,1611,275],{"class":143},[50,1613,159],{"class":60},[50,1615,162],{"class":56},[50,1617,1618],{"class":60}," ({ items: d.list.items }),\n",[50,1620,1621],{"class":52,"line":114},[50,1622,888],{"class":60},[15,1624,1625,1422,1627,1629],{},[29,1626,1403],{},[29,1628,423],{},"の評価では、引数の値のみを使用し、外部への問い合わせは行わないでください。",[23,1631,1632],{"id":1632},"失敗時の動作",[15,1634,1635,1636,1638,1639,1641,1642,1644,1520,1646,1648,1649,1651,1652,1654,1655,1657,1658,1641],{},"ノードが失敗した場合、",[29,1637,1144],{},"で依存する後続のノードは",[29,1640,1407],{},"へ遷移します。",[19,1643],{},[29,1645,1116],{},[29,1647,1154],{},"または",[29,1650,1172],{},"の後続のノードは、実行されます。",[19,1653],{},"\n失敗したノードに依存しないノードは、最後まで実行されます。",[19,1656],{},"\nすべてのノードが終了すると、Runは",[29,1659,1070],{},[15,1661,1662,1663,1665,1666,1668,1400,1670,1672,1673,1675,1678,1679,1681,1682,1684,1686,1687,1690],{},"Runが",[29,1664,1070],{},"になるのは、失敗したノードがある場合に限られます。",[19,1667],{},[29,1669,1116],{},[29,1671,1403],{},"の条件で実行されなかったノードは、失敗に数えません。",[19,1674],{},[29,1676,1677],{},"trigger: 'failure'","のノードが成功しても、前段のノードが失敗していれば、Runは",[29,1680,1070],{},"で終了します。",[19,1683],{},[29,1685,1407],{},"になった理由は、ノードの",[29,1688,1689],{},"error","に記録され、ダッシュボードのRunの詳細に表示されます。",[15,1692,1693,1695,1696,1698],{},[29,1694,1070],{},"のRunは、ダッシュボードまたはREST APIで再開します。",[19,1697],{},"\n成功したノードの結果はそのまま使われ、それ以外のノードは未実行として改めて実行されます。",[23,1700,1701],{"id":1701},"取り消し",[15,1703,1704,1705,1707,1708,1712,1713,1715,1716,1718,1719,1722,1723,1641],{},"Runを取り消すと、未実行のノードは開始されません。",[19,1706],{},"\n実行中のノードには、",[411,1709,1711],{"href":1710},"\u002Fguide\u002Fexecution#%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AE%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97","取り消しの要求","が送信されます。",[19,1714],{},"\n実行中のジョブは停止されません。",[19,1717],{},"\nperformerが要求を確認して終了するか、要求から",[29,1720,1721],{},"reaperGraceMs","(既定30秒)が過ぎても結果が報告されないと、Runは",[29,1724,1073],{},[23,1726,525],{"id":525},[15,1728,1729],{},"Run全体の期限は、Flowの定義の第2引数で指定します。",[41,1731,1733],{"className":43,"code":1732,"language":45,"meta":46,"style":46},"const GREETINGS = flow\u003C{ prefix: string }>(\n  (f) => {\n    \u002F\u002F ...\n  },\n  { deadlineMs: 10 * 60 * 1000 },\n);\n",[29,1734,1735,1757,1770,1775,1780,1802],{"__ignoreMap":46},[50,1736,1737,1739,1742,1744,1746,1748,1750,1752,1754],{"class":52,"line":53},[50,1738,84],{"class":56},[50,1740,1741],{"class":87}," GREETINGS",[50,1743,91],{"class":56},[50,1745,102],{"class":107},[50,1747,140],{"class":60},[50,1749,144],{"class":143},[50,1751,147],{"class":56},[50,1753,150],{"class":87},[50,1755,1756],{"class":60}," }>(\n",[50,1758,1759,1762,1764,1766,1768],{"class":52,"line":74},[50,1760,1761],{"class":60},"  (",[50,1763,156],{"class":143},[50,1765,159],{"class":60},[50,1767,162],{"class":56},[50,1769,129],{"class":60},[50,1771,1772],{"class":52,"line":81},[50,1773,1774],{"class":396},"    \u002F\u002F ...\n",[50,1776,1777],{"class":52,"line":97},[50,1778,1779],{"class":60},"  },\n",[50,1781,1782,1785,1788,1791,1794,1796,1799],{"class":52,"line":114},[50,1783,1784],{"class":60},"  { deadlineMs: ",[50,1786,1787],{"class":87},"10",[50,1789,1790],{"class":56}," *",[50,1792,1793],{"class":87}," 60",[50,1795,1790],{"class":56},[50,1797,1798],{"class":87}," 1000",[50,1800,1801],{"class":60}," },\n",[50,1803,1804],{"class":52,"line":119},[50,1805,1806],{"class":60},");\n",[15,1808,1809,1812,1813,1815,500,1817,1819],{},[29,1810,1811],{},"deadlineMs","は、正の整数(ミリ秒)で指定します。",[19,1814],{},[29,1816,476],{},[29,1818,520],{},"を渡した場合は、その値が優先されます。",[15,1821,1822,1823,1825,1826,1829,1830,1641,1832,1834,1835,1641,1837,1839],{},"期限を過ぎたRunは、取り消しと同じ手順で中断されます。",[19,1824],{},"\n未実行のノードは、",[29,1827,1828],{},"run deadline exceeded","のエラーにより",[29,1831,1070],{},[19,1833],{},"\n実行中のジョブは停止されず、そのジョブが終了した時点でRunは",[29,1836,1070],{},[19,1838],{},"\n実行中の子のRunは、取り消されます。",[15,1841,1842,1843,1641,1845,1847,1848,1850],{},"期限までに終了しなかったRunは、残りのノードがすべて成功しても",[29,1844,1070],{},[19,1846],{},"\nこのRunは、通常の失敗と同様に再開の対象です。",[19,1849],{},"\n再開した場合、期限は再開した時点から改めて計測されます。",[23,1852,1853],{"id":1853},"保持期間",[15,1855,1856,1857,1860,1861,1863,1865,1866,1869,1870,1872,1873,1091],{},"終了したRunは、",[29,1858,1859],{},"runs.sweepAfterMs","(既定5分)の経過後に削除されます。",[19,1862],{},[29,1864,1070],{},"のRunは、",[29,1867,1868],{},"runs.failedRetentionMs","(既定7日)の経過後に削除されます。",[19,1871],{},"\n詳細は",[411,1874,1876],{"href":1875},"\u002Freference\u002Fconfig#runsettings","RunSettings",[23,1878,1880],{"id":1879},"デプロイと実行中のrun","デプロイと実行中のRun",[15,1882,1883,1884,1886,1888],{},"実行中のRunは、開始時点のノード構成で継続されます。",[19,1885],{},[29,1887,423],{},"などの関数を変更しても、反映は次に開始されるノードからです。",[15,1890,1891,1892,1894],{},"定義からノードを削除すると、そのノードを含む実行中のRunは、そのノードで失敗します。",[19,1893],{},"\nノードを削除する場合は、実行中のすべてのRunが終了してからデプロイします。",[23,1896,1897],{"id":1897},"テスト",[15,1899,1900,1903,1904,1906],{},[29,1901,1902],{},"simulateFlow","は、指定された入力に対するノードの実行順序と、各ノードに渡されるpayloadを検証します。",[19,1905],{},"\nperformerの実際の処理は実行されません。",[41,1908,1910],{"className":43,"code":1909,"language":45,"meta":46,"style":46},"import { simulateFlow } from 'tsumugi\u002Ftesting';\n\nconst result = simulateFlow(flows.GREETINGS, { prefix: 'hello' }, { results: { list: { names: ['a', 'b'] } } });\n\nexpect(result.nodes.map((node) => node.id)).toEqual(['list', 'greet:0', 'greet:1', 'greet', 'report']);\nexpect(result.nodes[1].payload).toEqual({ name: 'a' });\n",[29,1911,1912,1926,1930,1966,1970,2022],{"__ignoreMap":46},[50,1913,1914,1916,1919,1921,1924],{"class":52,"line":53},[50,1915,57],{"class":56},[50,1917,1918],{"class":60}," { simulateFlow } ",[50,1920,64],{"class":56},[50,1922,1923],{"class":67}," 'tsumugi\u002Ftesting'",[50,1925,71],{"class":60},[50,1927,1928],{"class":52,"line":74},[50,1929,78],{"emptyLinePlaceholder":77},[50,1931,1932,1934,1937,1939,1942,1945,1948,1950,1952,1955,1958,1960,1963],{"class":52,"line":81},[50,1933,84],{"class":56},[50,1935,1936],{"class":87}," result",[50,1938,91],{"class":56},[50,1940,1941],{"class":107}," simulateFlow",[50,1943,1944],{"class":60},"(flows.",[50,1946,1947],{"class":87},"GREETINGS",[50,1949,485],{"class":60},[50,1951,488],{"class":67},[50,1953,1954],{"class":60}," }, { results: { list: { names: [",[50,1956,1957],{"class":67},"'a'",[50,1959,190],{"class":60},[50,1961,1962],{"class":67},"'b'",[50,1964,1965],{"class":60},"] } } });\n",[50,1967,1968],{"class":52,"line":97},[50,1969,78],{"emptyLinePlaceholder":77},[50,1971,1972,1975,1978,1981,1984,1986,1988,1990,1993,1996,1999,2001,2003,2006,2008,2011,2013,2015,2017,2019],{"class":52,"line":114},[50,1973,1974],{"class":107},"expect",[50,1976,1977],{"class":60},"(result.nodes.",[50,1979,1980],{"class":107},"map",[50,1982,1983],{"class":60},"((",[50,1985,181],{"class":143},[50,1987,159],{"class":60},[50,1989,162],{"class":56},[50,1991,1992],{"class":60}," node.id)).",[50,1994,1995],{"class":107},"toEqual",[50,1997,1998],{"class":60},"([",[50,2000,187],{"class":67},[50,2002,190],{"class":60},[50,2004,2005],{"class":67},"'greet:0'",[50,2007,190],{"class":60},[50,2009,2010],{"class":67},"'greet:1'",[50,2012,190],{"class":60},[50,2014,246],{"class":67},[50,2016,190],{"class":60},[50,2018,322],{"class":67},[50,2020,2021],{"class":60},"]);\n",[50,2023,2024,2026,2029,2031,2034,2036,2039,2041],{"class":52,"line":119},[50,2025,1974],{"class":107},[50,2027,2028],{"class":60},"(result.nodes[",[50,2030,606],{"class":87},[50,2032,2033],{"class":60},"].payload).",[50,2035,1995],{"class":107},[50,2037,2038],{"class":60},"({ name: ",[50,2040,1957],{"class":67},[50,2042,400],{"class":60},[15,2044,2045,2046,2049,2050,2052,2053,2055,2056,526,2058,2060,2063,2064,1641,2066,2068,2069,1641,2071,2073,2074,2076,2077,2079],{},"各ノードの戻り値は、",[29,2047,2048],{},"results","にノードIDをキーとして渡します。",[19,2051],{},"\n値は、戻り値そのものと、戻り値を作る関数のどちらも受け付けます。",[19,2054],{},"\n渡さなかったノードの戻り値は、",[29,2057,1433],{},[19,2059],{},[29,2061,2062],{},"fails","に渡したノードは失敗し、後続のノードは",[29,2065,1407],{},[19,2067],{},"\nRunは",[29,2070,1070],{},[19,2072],{},"\nfan-outの子ノードは",[29,2075,541],{},"の戻り値から作成されますが、",[29,2078,632],{},"で追加される子ノードは含まれません。",[23,2081,1090],{"id":1090},[15,2083,2084,2085,2088,2089,2091,2093],{},"ノードでは",[29,2086,2087],{},"uniqueKey","を使用できません。",[19,2090],{},[29,2092,2087],{},"を必須にしたperformerをノードに指定すると、型エラーが発生します。",[15,2095,2096,2097,2099,2100,2102,2103,2105],{},"ノードの戻り値が8,192文字を超える場合、または直列化できない場合、その試行は失敗として扱われます。",[19,2098],{},"\n失敗後は、",[29,2101,437],{},"まで再試行が行われます。",[19,2104],{},"\n大きな結果はR2などに書き込み、その参照を戻り値にしてください。",[15,2107,2108,2109,2111,2112,2114,2115,2118,2119,1422,2122,2125],{},"1つのRunに含められるノード数は、既定で10,000件です。",[19,2110],{},"\nsubflowの入れ子は、既定で3段です。",[19,2113],{},"\n上限は、",[29,2116,2117],{},"defineTsumugi","の",[29,2120,2121],{},"runs.maxNodes",[29,2123,2124],{},"runs.maxDepth","で変更します。",[23,2127,2128],{"id":2128},"設定",[15,2130,2131,2133,2134,2136],{},[29,2132,1048],{},"を指定する場合は、wranglerの設定に次の2箇所を追記してください。",[19,2135],{},"\n指定しない場合は、これらの設定は不要です。",[41,2138,2142],{"className":2139,"code":2140,"language":2141,"meta":46,"style":46},"language-jsonc shiki shiki-themes github-light github-dark","{\n  \"durable_objects\": {\n    \"bindings\": [\n      { \"name\": \"JOB_SHARD\", \"class_name\": \"TsumugiJobShard\" },\n      { \"name\": \"RUN\", \"class_name\": \"TsumugiRun\" },\n    ],\n  },\n  \"migrations\": [\n    { \"tag\": \"v1\", \"new_sqlite_classes\": [\"TsumugiJobShard\"] },\n    { \"tag\": \"v2\", \"new_sqlite_classes\": [\"TsumugiRun\"] },\n  ],\n}\n","jsonc",[29,2143,2144,2149,2157,2165,2190,2212,2217,2221,2228,2254,2275,2280],{"__ignoreMap":46},[50,2145,2146],{"class":52,"line":53},[50,2147,2148],{"class":60},"{\n",[50,2150,2151,2154],{"class":52,"line":74},[50,2152,2153],{"class":87},"  \"durable_objects\"",[50,2155,2156],{"class":60},": {\n",[50,2158,2159,2162],{"class":52,"line":81},[50,2160,2161],{"class":87},"    \"bindings\"",[50,2163,2164],{"class":60},": [\n",[50,2166,2167,2170,2173,2175,2178,2180,2183,2185,2188],{"class":52,"line":97},[50,2168,2169],{"class":60},"      { ",[50,2171,2172],{"class":87},"\"name\"",[50,2174,583],{"class":60},[50,2176,2177],{"class":67},"\"JOB_SHARD\"",[50,2179,190],{"class":60},[50,2181,2182],{"class":87},"\"class_name\"",[50,2184,583],{"class":60},[50,2186,2187],{"class":67},"\"TsumugiJobShard\"",[50,2189,1801],{"class":60},[50,2191,2192,2194,2196,2198,2201,2203,2205,2207,2210],{"class":52,"line":114},[50,2193,2169],{"class":60},[50,2195,2172],{"class":87},[50,2197,583],{"class":60},[50,2199,2200],{"class":67},"\"RUN\"",[50,2202,190],{"class":60},[50,2204,2182],{"class":87},[50,2206,583],{"class":60},[50,2208,2209],{"class":67},"\"TsumugiRun\"",[50,2211,1801],{"class":60},[50,2213,2214],{"class":52,"line":119},[50,2215,2216],{"class":60},"    ],\n",[50,2218,2219],{"class":52,"line":132},[50,2220,1779],{"class":60},[50,2222,2223,2226],{"class":52,"line":167},[50,2224,2225],{"class":87},"  \"migrations\"",[50,2227,2164],{"class":60},[50,2229,2230,2233,2236,2238,2241,2243,2246,2249,2251],{"class":52,"line":199},[50,2231,2232],{"class":60},"    { ",[50,2234,2235],{"class":87},"\"tag\"",[50,2237,583],{"class":60},[50,2239,2240],{"class":67},"\"v1\"",[50,2242,190],{"class":60},[50,2244,2245],{"class":87},"\"new_sqlite_classes\"",[50,2247,2248],{"class":60},": [",[50,2250,2187],{"class":67},[50,2252,2253],{"class":60},"] },\n",[50,2255,2256,2258,2260,2262,2265,2267,2269,2271,2273],{"class":52,"line":218},[50,2257,2232],{"class":60},[50,2259,2235],{"class":87},[50,2261,583],{"class":60},[50,2263,2264],{"class":67},"\"v2\"",[50,2266,190],{"class":60},[50,2268,2245],{"class":87},[50,2270,2248],{"class":60},[50,2272,2209],{"class":67},[50,2274,2253],{"class":60},[50,2276,2277],{"class":52,"line":224},[50,2278,2279],{"class":60},"  ],\n",[50,2281,2282],{"class":52,"line":229},[50,2283,787],{"class":60},[15,2285,2286,32,2289,2291,2292,2295,2296,2298],{},[29,2287,2288],{},"TsumugiRun",[29,2290,2117],{},"の戻り値に含まれる",[29,2293,2294],{},"runClass","を継承してexportしてください。",[19,2297],{},"\nD1のマイグレーションは、再度適用が必要です。",[41,2300,2302],{"className":43,"code":2301,"language":45,"meta":46,"style":46},"export { TsumugiJobShard } from 'tsumugi';\nexport class TsumugiRun extends tsumugi.runClass {}\n",[29,2303,2304,2318],{"__ignoreMap":46},[50,2305,2306,2309,2312,2314,2316],{"class":52,"line":53},[50,2307,2308],{"class":56},"export",[50,2310,2311],{"class":60}," { TsumugiJobShard } ",[50,2313,64],{"class":56},[50,2315,68],{"class":67},[50,2317,71],{"class":60},[50,2319,2320,2322,2325,2328,2330,2332,2334,2336],{"class":52,"line":74},[50,2321,2308],{"class":56},[50,2323,2324],{"class":56}," class",[50,2326,2327],{"class":107}," TsumugiRun",[50,2329,649],{"class":56},[50,2331,385],{"class":107},[50,2333,749],{"class":60},[50,2335,2294],{"class":107},[50,2337,2338],{"class":60}," {}\n",[41,2340,2344],{"className":2341,"code":2342,"language":2343,"meta":46,"style":46},"language-bash shiki shiki-themes github-light github-dark","pnpm wrangler d1 migrations apply my-jobs --remote\n","bash",[29,2345,2346],{"__ignoreMap":46},[50,2347,2348,2351,2354,2357,2360,2363,2366],{"class":52,"line":53},[50,2349,2350],{"class":107},"pnpm",[50,2352,2353],{"class":67}," wrangler",[50,2355,2356],{"class":67}," d1",[50,2358,2359],{"class":67}," migrations",[50,2361,2362],{"class":67}," apply",[50,2364,2365],{"class":67}," my-jobs",[50,2367,2368],{"class":87}," --remote\n",[2370,2371,2372],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":46,"searchDepth":81,"depth":81,"links":2374},[2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390],{"id":25,"depth":74,"text":25},{"id":453,"depth":74,"text":453},{"id":529,"depth":74,"text":529},{"id":627,"depth":74,"text":627},{"id":833,"depth":74,"text":833},{"id":1094,"depth":74,"text":1094},{"id":1108,"depth":74,"text":1108},{"id":1510,"depth":74,"text":1510},{"id":1632,"depth":74,"text":1632},{"id":1701,"depth":74,"text":1701},{"id":525,"depth":74,"text":525},{"id":1853,"depth":74,"text":1853},{"id":1879,"depth":74,"text":1880},{"id":1897,"depth":74,"text":1897},{"id":1090,"depth":74,"text":1090},{"id":2128,"depth":74,"text":2128},"依存関係を持つ複数のジョブを有向非巡回グラフ(DAG)で定義するFlowの定義, fan-out, 条件分岐, 失敗時の動作について","md",{},"\u002Fguide\u002Fflow","2026-07-22",{"title":6,"description":2391},"guide\u002Fflow","2026-10-25","PqMWcM9n632rkTXYs8-YC7s9Sl1CdjA2KFpzcD27-fM",false,1794027571253]