agent-control-plane 0.4.9 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +109 -13
  2. package/npm/bin/agent-control-plane.js +1 -1
  3. package/package.json +39 -33
  4. package/tools/bin/debug-session.sh +106 -0
  5. package/tools/bin/flow-config-lib.sh +13 -3508
  6. package/tools/bin/flow-execution-lib.sh +243 -0
  7. package/tools/bin/flow-forge-lib.sh +1770 -0
  8. package/tools/bin/flow-profile-lib.sh +335 -0
  9. package/tools/bin/flow-provider-lib.sh +981 -0
  10. package/tools/bin/flow-runtime-doctor-linux.sh +136 -0
  11. package/tools/bin/flow-runtime-doctor.sh +5 -1
  12. package/tools/bin/flow-session-lib.sh +317 -0
  13. package/tools/bin/install-project-systemd.sh +255 -0
  14. package/tools/bin/project-runtimectl.sh +45 -0
  15. package/tools/bin/project-systemd-bootstrap.sh +74 -0
  16. package/tools/bin/uninstall-project-systemd.sh +87 -0
  17. package/tools/dashboard/app.js +238 -8
  18. package/tools/dashboard/issue_queue_state.py +101 -0
  19. package/tools/dashboard/requirements.txt +3 -0
  20. package/tools/dashboard/server.py +250 -30
  21. package/tools/dashboard/styles.css +526 -455
  22. package/tools/bin/agent-cleanup-worktree +0 -247
  23. package/tools/bin/agent-github-update-labels +0 -105
  24. package/tools/bin/agent-init-worktree +0 -216
  25. package/tools/bin/agent-project-archive-run +0 -52
  26. package/tools/bin/agent-project-capture-worker +0 -46
  27. package/tools/bin/agent-project-catch-up-issue-pr-links +0 -118
  28. package/tools/bin/agent-project-catch-up-merged-prs +0 -195
  29. package/tools/bin/agent-project-catch-up-scheduled-issue-retries +0 -123
  30. package/tools/bin/agent-project-cleanup-session +0 -513
  31. package/tools/bin/agent-project-detached-launch +0 -127
  32. package/tools/bin/agent-project-heartbeat-loop +0 -1029
  33. package/tools/bin/agent-project-open-issue-worktree +0 -89
  34. package/tools/bin/agent-project-open-pr-worktree +0 -80
  35. package/tools/bin/agent-project-publish-issue-pr +0 -468
  36. package/tools/bin/agent-project-reconcile-issue-session +0 -1409
  37. package/tools/bin/agent-project-reconcile-pr-session +0 -1288
  38. package/tools/bin/agent-project-retry-state +0 -158
  39. package/tools/bin/agent-project-run-claude-session +0 -805
  40. package/tools/bin/agent-project-run-codex-resilient +0 -963
  41. package/tools/bin/agent-project-run-codex-session +0 -435
  42. package/tools/bin/agent-project-run-kilo-session +0 -369
  43. package/tools/bin/agent-project-run-ollama-session +0 -658
  44. package/tools/bin/agent-project-run-openclaw-session +0 -1309
  45. package/tools/bin/agent-project-run-opencode-session +0 -377
  46. package/tools/bin/agent-project-run-pi-session +0 -479
  47. package/tools/bin/agent-project-sync-anchor-repo +0 -139
  48. package/tools/bin/agent-project-sync-source-repo-main +0 -163
  49. package/tools/bin/agent-project-worker-status +0 -188
  50. package/tools/bin/branch-verification-guard.sh +0 -364
  51. package/tools/bin/capture-worker.sh +0 -18
  52. package/tools/bin/cleanup-worktree.sh +0 -52
  53. package/tools/bin/codex-quota +0 -31
  54. package/tools/bin/create-follow-up-issue.sh +0 -114
  55. package/tools/bin/dashboard-launchd-bootstrap.sh +0 -50
  56. package/tools/bin/issue-publish-localization-guard.sh +0 -142
  57. package/tools/bin/issue-publish-scope-guard.sh +0 -242
  58. package/tools/bin/issue-requires-local-workspace-install.sh +0 -31
  59. package/tools/bin/issue-resource-class.sh +0 -12
  60. package/tools/bin/kick-scheduler.sh +0 -75
  61. package/tools/bin/label-follow-up-issues.sh +0 -14
  62. package/tools/bin/new-pr-worktree.sh +0 -50
  63. package/tools/bin/new-worktree.sh +0 -49
  64. package/tools/bin/pr-risk.sh +0 -12
  65. package/tools/bin/prepare-worktree.sh +0 -142
  66. package/tools/bin/provider-cooldown-state.sh +0 -204
  67. package/tools/bin/publish-issue-worker.sh +0 -31
  68. package/tools/bin/reconcile-bootstrap-lib.sh +0 -113
  69. package/tools/bin/reconcile-issue-worker.sh +0 -34
  70. package/tools/bin/reconcile-pr-worker.sh +0 -34
  71. package/tools/bin/record-verification.sh +0 -71
  72. package/tools/bin/render-flow-config.sh +0 -98
  73. package/tools/bin/resident-issue-controller-lib.sh +0 -448
  74. package/tools/bin/retry-state.sh +0 -31
  75. package/tools/bin/reuse-issue-worktree.sh +0 -121
  76. package/tools/bin/run-codex-bypass.sh +0 -3
  77. package/tools/bin/run-codex-safe.sh +0 -3
  78. package/tools/bin/run-codex-task.sh +0 -280
  79. package/tools/bin/serve-dashboard.sh +0 -5
  80. package/tools/bin/start-issue-worker.sh +0 -943
  81. package/tools/bin/start-pr-fix-worker.sh +0 -528
  82. package/tools/bin/start-pr-merge-repair-worker.sh +0 -8
  83. package/tools/bin/start-pr-review-worker.sh +0 -261
  84. package/tools/bin/start-resident-issue-loop.sh +0 -499
  85. package/tools/bin/update-github-labels.sh +0 -14
  86. package/tools/bin/worker-status.sh +0 -19
  87. package/tools/bin/workflow-catalog.sh +0 -77
@@ -1,369 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'EOF'
6
- Usage:
7
- agent-project-run-kilo-session --mode safe|bypass --session <id> --worktree <path> --prompt-file <path> --runs-root <path> --adapter-id <id> --task-kind <kind> --task-id <id> [options]
8
-
9
- Launch a Kilo Code worker session inside tmux for a project adapter and persist
10
- the standard run artifacts.
11
-
12
- Kilo is a TypeScript/Bun coding agent (kilocode/cli). It executes via
13
- `kilo run --auto --format json` in non-interactive mode.
14
-
15
- Options:
16
- --env-prefix <prefix> Export prefixed runtime/context env vars inside the worker
17
- --context <KEY=VALUE> Extra metadata written to run.env and exported to the worker
18
- --collect-file <name> Copy sandbox artifact file into the host run dir after execution
19
- --reconcile-command <cmd> Host-side command queued after the worker exits
20
- --sandbox-subdir <name> Subdir under the worktree for worker artifacts (default: .kilo-artifacts)
21
- --kilo-model <id> Model in provider/name format (default: anthropic/claude-sonnet-4-20250514)
22
- --kilo-timeout-seconds <secs> Hard timeout in seconds (default: 900)
23
- --help Show this help
24
- EOF
25
- }
26
-
27
- mode=""
28
- session=""
29
- worktree=""
30
- prompt_file=""
31
- runs_root=""
32
- adapter_id=""
33
- task_kind=""
34
- task_id=""
35
- env_prefix=""
36
- sandbox_subdir=".kilo-artifacts"
37
- reconcile_command=""
38
- kilo_model="${ACP_KILO_MODEL:-${F_LOSNING_KILO_MODEL:-anthropic/claude-sonnet-4-20250514}}"
39
- kilo_timeout_seconds="${ACP_KILO_TIMEOUT_SECONDS:-${F_LOSNING_KILO_TIMEOUT_SECONDS:-900}}"
40
- declare -a context_items=()
41
- declare -a collect_files=()
42
-
43
- while [[ $# -gt 0 ]]; do
44
- case "$1" in
45
- --mode) mode="${2:-}"; shift 2 ;;
46
- --session) session="${2:-}"; shift 2 ;;
47
- --worktree) worktree="${2:-}"; shift 2 ;;
48
- --prompt-file) prompt_file="${2:-}"; shift 2 ;;
49
- --runs-root) runs_root="${2:-}"; shift 2 ;;
50
- --adapter-id) adapter_id="${2:-}"; shift 2 ;;
51
- --task-kind) task_kind="${2:-}"; shift 2 ;;
52
- --task-id) task_id="${2:-}"; shift 2 ;;
53
- --env-prefix) env_prefix="${2:-}"; shift 2 ;;
54
- --context) context_items+=("${2:-}"); shift 2 ;;
55
- --collect-file) collect_files+=("${2:-}"); shift 2 ;;
56
- --reconcile-command) reconcile_command="${2:-}"; shift 2 ;;
57
- --sandbox-subdir) sandbox_subdir="${2:-}"; shift 2 ;;
58
- --kilo-model) kilo_model="${2:-}"; shift 2 ;;
59
- --kilo-timeout-seconds) kilo_timeout_seconds="${2:-}"; shift 2 ;;
60
- --help|-h) usage; exit 0 ;;
61
- *) echo "Unknown argument: $1" >&2; usage >&2; exit 1 ;;
62
- esac
63
- done
64
-
65
- if [[ -z "$mode" || -z "$session" || -z "$worktree" || -z "$prompt_file" || -z "$runs_root" || -z "$adapter_id" || -z "$task_kind" || -z "$task_id" ]]; then
66
- usage >&2
67
- exit 1
68
- fi
69
-
70
- case "$mode" in
71
- safe|bypass) ;;
72
- *) echo "--mode must be safe or bypass" >&2; exit 1 ;;
73
- esac
74
-
75
- case "$kilo_timeout_seconds" in
76
- ''|*[!0-9]*|0) echo "--kilo-timeout-seconds must be a positive integer" >&2; exit 1 ;;
77
- esac
78
-
79
- resolve_kilo_bin() {
80
- local configured_bin="${KILO_BIN:-${ACP_KILO_BIN:-}}"
81
- if [[ -n "${configured_bin}" && -x "${configured_bin}" ]]; then
82
- printf '%s\n' "${configured_bin}"
83
- return 0
84
- fi
85
- if command -v kilo >/dev/null 2>&1; then
86
- command -v kilo
87
- return 0
88
- fi
89
- local -a fallback_paths=(
90
- "/opt/homebrew/bin/kilo"
91
- "/usr/local/bin/kilo"
92
- "${HOME}/.local/bin/kilo"
93
- "${HOME}/.bun/bin/kilo"
94
- )
95
- local p
96
- for p in "${fallback_paths[@]}"; do
97
- if [[ -x "${p}" ]]; then
98
- printf '%s\n' "${p}"
99
- return 0
100
- fi
101
- done
102
- return 1
103
- }
104
-
105
- kilo_bin="$(resolve_kilo_bin || true)"
106
- if [[ -z "${kilo_bin}" || ! -x "${kilo_bin}" ]]; then
107
- echo "unable to resolve a runnable kilo binary — install with: npm install -g @kilocode/cli" >&2
108
- exit 1
109
- fi
110
-
111
- artifact_dir="${runs_root}/${session}"
112
- output_file="${artifact_dir}/${session}.log"
113
- inner_script="${artifact_dir}/${session}.sh"
114
- meta_file="${artifact_dir}/run.env"
115
- result_file="${artifact_dir}/result.env"
116
- runner_state_file="${artifact_dir}/runner.env"
117
- sandbox_run_dir="${worktree%/}/${sandbox_subdir}/${session}"
118
- started_at="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
119
-
120
- mkdir -p "$artifact_dir" "$sandbox_run_dir"
121
-
122
- if tmux has-session -t "$session" 2>/dev/null; then
123
- echo "tmux session already exists: $session" >&2
124
- exit 1
125
- fi
126
-
127
- branch_name="$(git -C "$worktree" branch --show-current 2>/dev/null || true)"
128
-
129
- printf -v session_q '%q' "$session"
130
- printf -v task_kind_q '%q' "$task_kind"
131
- printf -v task_id_q '%q' "$task_id"
132
- printf -v mode_q '%q' "$mode"
133
- printf -v worktree_q '%q' "$worktree"
134
- printf -v prompt_q '%q' "$prompt_file"
135
- printf -v output_q '%q' "$output_file"
136
- printf -v artifact_dir_q '%q' "$artifact_dir"
137
- printf -v script_q '%q' "$inner_script"
138
- printf -v result_q '%q' "$result_file"
139
- printf -v meta_file_q '%q' "$meta_file"
140
- printf -v runner_state_q '%q' "$runner_state_file"
141
- printf -v branch_q '%q' "$branch_name"
142
- printf -v sandbox_run_dir_q '%q' "$sandbox_run_dir"
143
- printf -v adapter_id_q '%q' "$adapter_id"
144
- printf -v started_at_q '%q' "$started_at"
145
- printf -v kilo_bin_q '%q' "$kilo_bin"
146
- printf -v kilo_model_q '%q' "$kilo_model"
147
- printf -v kilo_timeout_q '%q' "$kilo_timeout_seconds"
148
-
149
- {
150
- printf 'TASK_KIND=%s\n' "$task_kind_q"
151
- printf 'TASK_ID=%s\n' "$task_id_q"
152
- printf 'SESSION=%s\n' "$session_q"
153
- printf 'MODE=%s\n' "$mode_q"
154
- printf 'WORKTREE=%s\n' "$worktree_q"
155
- printf 'PROMPT_FILE=%s\n' "$prompt_q"
156
- printf 'OUTPUT_FILE=%s\n' "$output_q"
157
- printf 'BRANCH=%s\n' "$branch_q"
158
- printf 'RESULT_FILE=%s\n' "$result_q"
159
- printf 'RUNNER_STATE_FILE=%s\n' "$runner_state_q"
160
- printf 'SANDBOX_RUN_DIR=%s\n' "$sandbox_run_dir_q"
161
- printf 'ADAPTER_ID=%s\n' "$adapter_id_q"
162
- printf 'STARTED_AT=%s\n' "$started_at_q"
163
- printf 'KILO_BIN=%s\n' "$kilo_bin_q"
164
- printf 'KILO_MODEL=%s\n' "$kilo_model_q"
165
- printf 'KILO_TIMEOUT_SECONDS=%s\n' "$kilo_timeout_q"
166
- } >"$meta_file"
167
-
168
- context_exports=""
169
- if ((${#context_items[@]} > 0)); then
170
- for item in "${context_items[@]}"; do
171
- if [[ "$item" != *=* ]]; then
172
- echo "--context must use KEY=VALUE syntax: $item" >&2
173
- exit 1
174
- fi
175
- key="${item%%=*}"
176
- value="${item#*=}"
177
- if [[ ! "$key" =~ ^[A-Z0-9_]+$ ]]; then
178
- echo "Invalid context key: $key" >&2
179
- exit 1
180
- fi
181
- printf -v value_q '%q' "$value"
182
- printf '%s=%s\n' "$key" "$value_q" >>"$meta_file"
183
- if [[ -n "$env_prefix" ]]; then
184
- context_exports+="export ${env_prefix}${key}=${value_q}"$'\n'
185
- fi
186
- context_exports+="export ACP_${key}=${value_q}"$'\n'
187
- if [[ "$env_prefix" != "F_LOSNING_" ]]; then
188
- context_exports+="export F_LOSNING_${key}=${value_q}"$'\n'
189
- fi
190
- done
191
- fi
192
-
193
- runtime_exports=$(
194
- cat <<EOF
195
- export AGENT_PROJECT_SESSION=${session_q}
196
- export AGENT_PROJECT_RUN_DIR=${sandbox_run_dir_q}
197
- export AGENT_PROJECT_HOST_RUN_DIR=${artifact_dir_q}
198
- export AGENT_PROJECT_RESULT_FILE=${sandbox_run_dir_q}/result.env
199
- export ACP_SESSION=${session_q}
200
- export ACP_RUN_DIR=${sandbox_run_dir_q}
201
- export ACP_HOST_RUN_DIR=${artifact_dir_q}
202
- export ACP_RESULT_FILE=${sandbox_run_dir_q}/result.env
203
- export F_LOSNING_SESSION=${session_q}
204
- export F_LOSNING_RUN_DIR=${sandbox_run_dir_q}
205
- export F_LOSNING_HOST_RUN_DIR=${artifact_dir_q}
206
- export F_LOSNING_RESULT_FILE=${sandbox_run_dir_q}/result.env
207
- EOF
208
- )
209
-
210
- if [[ -n "$env_prefix" ]]; then
211
- runtime_exports+=$'\n'
212
- runtime_exports+=$(cat <<EOF
213
- export ${env_prefix}SESSION=${session_q}
214
- export ${env_prefix}RUN_DIR=${sandbox_run_dir_q}
215
- export ${env_prefix}HOST_RUN_DIR=${artifact_dir_q}
216
- export ${env_prefix}RESULT_FILE=${sandbox_run_dir_q}/result.env
217
- EOF
218
- )
219
- fi
220
-
221
- collect_copy_snippet=""
222
- if ((${#collect_files[@]} > 0)); then
223
- for artifact_name in "${collect_files[@]}"; do
224
- [[ -z "$artifact_name" ]] && continue
225
- printf -v artifact_q '%q' "$artifact_name"
226
- collect_copy_snippet+=$(cat <<EOF
227
- if [[ -f ${sandbox_run_dir_q}/${artifact_q} ]]; then
228
- cp ${sandbox_run_dir_q}/${artifact_q} ${artifact_dir_q}/${artifact_q}
229
- fi
230
- EOF
231
- )
232
- collect_copy_snippet+=$'\n'
233
- done
234
- fi
235
-
236
- # Always collect result.env from sandbox to artifact_dir
237
- collect_copy_snippet+=$(
238
- cat <<EOF
239
- if [[ -f ${sandbox_run_dir_q}/result.env ]]; then
240
- cp ${sandbox_run_dir_q}/result.env ${artifact_dir_q}/result.env
241
- fi
242
- EOF
243
- )
244
- collect_copy_snippet+=$'\n'
245
-
246
- reconcile_snippet=""
247
- if [[ -n "$reconcile_command" ]]; then
248
- printf -v delayed_reconcile_q '%q' "export ACP_EXPECTED_RUN_STARTED_AT=${started_at_q}; export F_LOSNING_EXPECTED_RUN_STARTED_AT=${started_at_q}; while tmux has-session -t ${session_q} 2>/dev/null; do sleep 1; done; sleep 2; $reconcile_command"
249
- reconcile_snippet="nohup bash -lc ${delayed_reconcile_q} >> ${output_q} 2>&1 </dev/null &"
250
- fi
251
-
252
- cat >"$inner_script" <<EOF
253
- #!/usr/bin/env bash
254
- set -euo pipefail
255
- ${runtime_exports}
256
- ${context_exports}cd ${worktree_q}
257
-
258
- runner_state_file=${runner_state_q}
259
- output_file=${output_q}
260
- sandbox_run_dir=${sandbox_run_dir_q}
261
- artifact_dir=${artifact_dir_q}
262
- result_file_path=${sandbox_run_dir_q}/result.env
263
- host_result_file=${result_q}
264
- kilo_bin=${kilo_bin_q}
265
- kilo_model=${kilo_model_q}
266
- kilo_timeout=${kilo_timeout_q}
267
- prompt_file=${prompt_q}
268
- worktree=${worktree_q}
269
-
270
- write_state() {
271
- local runner_state="\${1:?runner state required}"
272
- local last_exit_code="\${2:-}"
273
- local failure_reason="\${3:-}"
274
- local updated_at tmp_file
275
-
276
- updated_at="\$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
277
- tmp_file="\${runner_state_file}.tmp.\$\$"
278
- {
279
- printf 'RUNNER_STATE=%q\n' "\${runner_state}"
280
- printf 'ATTEMPT=1\n'
281
- printf 'RESUME_COUNT=0\n'
282
- printf 'LAST_EXIT_CODE=%q\n' "\${last_exit_code}"
283
- printf 'LAST_FAILURE_REASON=%q\n' "\${failure_reason}"
284
- printf 'UPDATED_AT=%q\n' "\${updated_at}"
285
- } >"\${tmp_file}"
286
- mv "\${tmp_file}" "\${runner_state_file}"
287
- }
288
-
289
- record_final_git_state() {
290
- local final_head final_branch tmp_file
291
- final_head="\$(git -C ${worktree_q} rev-parse HEAD 2>/dev/null || true)"
292
- final_branch="\$(git -C ${worktree_q} branch --show-current 2>/dev/null || true)"
293
- tmp_file=${meta_file_q}.tmp.final.\$\$
294
- grep -vE '^(FINAL_HEAD|FINAL_BRANCH)=' ${meta_file_q} >"\${tmp_file}" 2>/dev/null || true
295
- {
296
- printf 'FINAL_HEAD=%q\n' "\${final_head}"
297
- printf 'FINAL_BRANCH=%q\n' "\${final_branch}"
298
- } >>"\${tmp_file}"
299
- mv "\${tmp_file}" ${meta_file_q}
300
- }
301
-
302
- write_state running
303
-
304
- mkdir -p "\${sandbox_run_dir}"
305
-
306
- # Kilo runs via 'kilo run' in non-interactive mode.
307
- # --auto auto-approves all tool permissions (CI mode).
308
- # --format json emits structured JSON events (parseable for result inference).
309
- # --model selects the provider/model, --dir sets the working directory.
310
- # Prompt is passed as the positional argument.
311
- prompt_content="\$(cat "\${prompt_file}")"
312
- kilo_exit_code=0
313
- kilo_args=(run --auto --format json --model "\${kilo_model}" --dir ${worktree_q})
314
-
315
- if command -v timeout >/dev/null 2>&1; then
316
- timeout "\${kilo_timeout}" "\${kilo_bin}" "\${kilo_args[@]}" "\${prompt_content}" 2>&1 | tee -a "\${output_file}" || kilo_exit_code=\$?
317
- elif command -v gtimeout >/dev/null 2>&1; then
318
- gtimeout "\${kilo_timeout}" "\${kilo_bin}" "\${kilo_args[@]}" "\${prompt_content}" 2>&1 | tee -a "\${output_file}" || kilo_exit_code=\$?
319
- else
320
- "\${kilo_bin}" "\${kilo_args[@]}" "\${prompt_content}" 2>&1 | tee -a "\${output_file}" &
321
- _kilo_pid=\$!
322
- ( sleep "\${kilo_timeout}" && kill "\${_kilo_pid}" 2>/dev/null ) &
323
- _wd=\$!
324
- wait "\${_kilo_pid}" || kilo_exit_code=\$?
325
- kill "\${_wd}" 2>/dev/null || true; wait "\${_wd}" 2>/dev/null || true
326
- [[ "\${kilo_exit_code}" -eq 143 ]] && kilo_exit_code=124
327
- fi
328
-
329
- if [[ "\${kilo_exit_code}" -eq 0 ]]; then
330
- write_state succeeded 0
331
- # Kilo has full tool access (bash, write, edit) — it can modify the worktree.
332
- # Infer result from git state if result.env was not written by the agent.
333
- if [[ ! -f "\${result_file_path}" ]]; then
334
- if git -C ${worktree_q} diff --name-only HEAD 2>/dev/null | grep -qvE '\.md$' 2>/dev/null \\
335
- || git -C ${worktree_q} diff --cached --name-only 2>/dev/null | grep -qvE '\.md$' 2>/dev/null \\
336
- || git -C ${worktree_q} diff --name-only origin/main..HEAD 2>/dev/null | grep -qvE '\.md$' 2>/dev/null; then
337
- printf 'OUTCOME=implemented\nACTION=host-publish-issue-pr\n' >"\${result_file_path}"
338
- else
339
- printf 'OUTCOME=blocked\nACTION=host-comment-blocker\nDETAIL=missing-result-contract\n' >"\${result_file_path}"
340
- fi
341
- fi
342
- else
343
- failure_reason="kilo-exit-\${kilo_exit_code}"
344
- [[ "\${kilo_exit_code}" -eq 124 ]] && failure_reason="timeout"
345
- write_state failed "\${kilo_exit_code}" "\${failure_reason}"
346
- if [[ ! -f "\${result_file_path}" ]]; then
347
- printf 'OUTCOME=blocked\nACTION=host-comment-blocker\nDETAIL=%s\n' "\${failure_reason}" >"\${result_file_path}"
348
- fi
349
- fi
350
-
351
- record_final_git_state
352
-
353
- if [[ -f "\${result_file_path}" ]]; then
354
- cp "\${result_file_path}" "\${host_result_file}"
355
- fi
356
- ${collect_copy_snippet}
357
- ${reconcile_snippet}
358
- printf '\n__CODEX_EXIT__:%s\n' "\${kilo_exit_code}" | tee -a "\${output_file}"
359
- exit "\${kilo_exit_code}"
360
- EOF
361
-
362
- chmod +x "$inner_script"
363
- tmux new-session -d -s "$session" "$inner_script"
364
-
365
- printf 'SESSION=%s\n' "$session"
366
- printf 'TASK_KIND=%s\n' "$task_kind"
367
- printf 'TASK_ID=%s\n' "$task_id"
368
- printf 'WORKTREE=%s\n' "$worktree"
369
- printf 'OUTPUT=%s\n' "$output_file"