@made-by-moonlight/athene-core 0.9.1

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 (285) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +241 -0
  3. package/dist/activity-events.d.ts +42 -0
  4. package/dist/activity-events.d.ts.map +1 -0
  5. package/dist/activity-events.js +192 -0
  6. package/dist/activity-events.js.map +1 -0
  7. package/dist/activity-log.d.ts +71 -0
  8. package/dist/activity-log.d.ts.map +1 -0
  9. package/dist/activity-log.js +203 -0
  10. package/dist/activity-log.js.map +1 -0
  11. package/dist/activity-signal.d.ts +20 -0
  12. package/dist/activity-signal.d.ts.map +1 -0
  13. package/dist/activity-signal.js +91 -0
  14. package/dist/activity-signal.js.map +1 -0
  15. package/dist/agent-report.d.ts +148 -0
  16. package/dist/agent-report.d.ts.map +1 -0
  17. package/dist/agent-report.js +516 -0
  18. package/dist/agent-report.js.map +1 -0
  19. package/dist/agent-selection.d.ts +31 -0
  20. package/dist/agent-selection.d.ts.map +1 -0
  21. package/dist/agent-selection.js +69 -0
  22. package/dist/agent-selection.js.map +1 -0
  23. package/dist/agent-workspace-hooks.d.ts +74 -0
  24. package/dist/agent-workspace-hooks.d.ts.map +1 -0
  25. package/dist/agent-workspace-hooks.js +988 -0
  26. package/dist/agent-workspace-hooks.js.map +1 -0
  27. package/dist/atomic-write.d.ts +6 -0
  28. package/dist/atomic-write.d.ts.map +1 -0
  29. package/dist/atomic-write.js +49 -0
  30. package/dist/atomic-write.js.map +1 -0
  31. package/dist/cleanup-stack.d.ts +37 -0
  32. package/dist/cleanup-stack.d.ts.map +1 -0
  33. package/dist/cleanup-stack.js +45 -0
  34. package/dist/cleanup-stack.js.map +1 -0
  35. package/dist/code-review-manager.d.ts +118 -0
  36. package/dist/code-review-manager.d.ts.map +1 -0
  37. package/dist/code-review-manager.js +719 -0
  38. package/dist/code-review-manager.js.map +1 -0
  39. package/dist/code-review-store.d.ts +114 -0
  40. package/dist/code-review-store.d.ts.map +1 -0
  41. package/dist/code-review-store.js +346 -0
  42. package/dist/code-review-store.js.map +1 -0
  43. package/dist/config-generator.d.ts +84 -0
  44. package/dist/config-generator.d.ts.map +1 -0
  45. package/dist/config-generator.js +295 -0
  46. package/dist/config-generator.js.map +1 -0
  47. package/dist/config.d.ts +55 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +852 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/daemon-children.d.ts +55 -0
  52. package/dist/daemon-children.d.ts.map +1 -0
  53. package/dist/daemon-children.js +435 -0
  54. package/dist/daemon-children.js.map +1 -0
  55. package/dist/dashboard-notifications.d.ts +42 -0
  56. package/dist/dashboard-notifications.d.ts.map +1 -0
  57. package/dist/dashboard-notifications.js +123 -0
  58. package/dist/dashboard-notifications.js.map +1 -0
  59. package/dist/events-db.d.ts +39 -0
  60. package/dist/events-db.d.ts.map +1 -0
  61. package/dist/events-db.js +185 -0
  62. package/dist/events-db.js.map +1 -0
  63. package/dist/feature-flags.d.ts +2 -0
  64. package/dist/feature-flags.d.ts.map +1 -0
  65. package/dist/feature-flags.js +9 -0
  66. package/dist/feature-flags.js.map +1 -0
  67. package/dist/feedback-tools.d.ts +97 -0
  68. package/dist/feedback-tools.d.ts.map +1 -0
  69. package/dist/feedback-tools.js +161 -0
  70. package/dist/feedback-tools.js.map +1 -0
  71. package/dist/file-lock.d.ts +5 -0
  72. package/dist/file-lock.d.ts.map +1 -0
  73. package/dist/file-lock.js +59 -0
  74. package/dist/file-lock.js.map +1 -0
  75. package/dist/format-automated-comments.d.ts +18 -0
  76. package/dist/format-automated-comments.d.ts.map +1 -0
  77. package/dist/gh-trace.d.ts +57 -0
  78. package/dist/gh-trace.d.ts.map +1 -0
  79. package/dist/gh-trace.js +320 -0
  80. package/dist/gh-trace.js.map +1 -0
  81. package/dist/git-activity.d.ts +10 -0
  82. package/dist/git-activity.d.ts.map +1 -0
  83. package/dist/git-activity.js +30 -0
  84. package/dist/git-activity.js.map +1 -0
  85. package/dist/global-config.d.ts +1085 -0
  86. package/dist/global-config.d.ts.map +1 -0
  87. package/dist/global-config.js +1067 -0
  88. package/dist/global-config.js.map +1 -0
  89. package/dist/index.d.ts +91 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +59 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/key-value.d.ts +7 -0
  94. package/dist/key-value.d.ts.map +1 -0
  95. package/dist/key-value.js +24 -0
  96. package/dist/key-value.js.map +1 -0
  97. package/dist/lifecycle-manager.d.ts +22 -0
  98. package/dist/lifecycle-manager.d.ts.map +1 -0
  99. package/dist/lifecycle-manager.js +2813 -0
  100. package/dist/lifecycle-manager.js.map +1 -0
  101. package/dist/lifecycle-state.d.ts +28 -0
  102. package/dist/lifecycle-state.d.ts.map +1 -0
  103. package/dist/lifecycle-state.js +446 -0
  104. package/dist/lifecycle-state.js.map +1 -0
  105. package/dist/lifecycle-status-decisions.d.ts +85 -0
  106. package/dist/lifecycle-status-decisions.d.ts.map +1 -0
  107. package/dist/lifecycle-status-decisions.js +262 -0
  108. package/dist/lifecycle-status-decisions.js.map +1 -0
  109. package/dist/lifecycle-transition.d.ts +81 -0
  110. package/dist/lifecycle-transition.d.ts.map +1 -0
  111. package/dist/lifecycle-transition.js +207 -0
  112. package/dist/lifecycle-transition.js.map +1 -0
  113. package/dist/metadata.d.ts +54 -0
  114. package/dist/metadata.d.ts.map +1 -0
  115. package/dist/metadata.js +484 -0
  116. package/dist/metadata.js.map +1 -0
  117. package/dist/migration/storage-v2.d.ts +76 -0
  118. package/dist/migration/storage-v2.d.ts.map +1 -0
  119. package/dist/migration/storage-v2.js +1614 -0
  120. package/dist/migration/storage-v2.js.map +1 -0
  121. package/dist/notification-data.d.ts +135 -0
  122. package/dist/notification-data.d.ts.map +1 -0
  123. package/dist/notification-data.js +204 -0
  124. package/dist/notification-data.js.map +1 -0
  125. package/dist/notification-observability.d.ts +21 -0
  126. package/dist/notification-observability.d.ts.map +1 -0
  127. package/dist/notification-observability.js +154 -0
  128. package/dist/notification-observability.js.map +1 -0
  129. package/dist/notifier-resolution.d.ts +14 -0
  130. package/dist/notifier-resolution.d.ts.map +1 -0
  131. package/dist/notifier-resolution.js +23 -0
  132. package/dist/notifier-resolution.js.map +1 -0
  133. package/dist/observability.d.ts +100 -0
  134. package/dist/observability.d.ts.map +1 -0
  135. package/dist/observability.js +535 -0
  136. package/dist/observability.js.map +1 -0
  137. package/dist/opencode-agents-md.d.ts +3 -0
  138. package/dist/opencode-agents-md.d.ts.map +1 -0
  139. package/dist/opencode-agents-md.js +40 -0
  140. package/dist/opencode-agents-md.js.map +1 -0
  141. package/dist/opencode-config.d.ts +2 -0
  142. package/dist/opencode-config.d.ts.map +1 -0
  143. package/dist/opencode-config.js +17 -0
  144. package/dist/opencode-config.js.map +1 -0
  145. package/dist/opencode-session-id.d.ts +2 -0
  146. package/dist/opencode-session-id.d.ts.map +1 -0
  147. package/dist/opencode-session-id.js +12 -0
  148. package/dist/opencode-session-id.js.map +1 -0
  149. package/dist/opencode-shared.d.ts +80 -0
  150. package/dist/opencode-shared.d.ts.map +1 -0
  151. package/dist/opencode-shared.js +202 -0
  152. package/dist/opencode-shared.js.map +1 -0
  153. package/dist/orchestrator-prompt.d.ts +19 -0
  154. package/dist/orchestrator-prompt.d.ts.map +1 -0
  155. package/dist/orchestrator-prompt.js +130 -0
  156. package/dist/orchestrator-prompt.js.map +1 -0
  157. package/dist/orchestrator-session-strategy.d.ts +5 -0
  158. package/dist/orchestrator-session-strategy.d.ts.map +1 -0
  159. package/dist/orchestrator-session-strategy.js +13 -0
  160. package/dist/orchestrator-session-strategy.js.map +1 -0
  161. package/dist/paths.d.ts +145 -0
  162. package/dist/paths.d.ts.map +1 -0
  163. package/dist/paths.js +288 -0
  164. package/dist/paths.js.map +1 -0
  165. package/dist/platform.d.ts +32 -0
  166. package/dist/platform.d.ts.map +1 -0
  167. package/dist/platform.js +211 -0
  168. package/dist/platform.js.map +1 -0
  169. package/dist/plugin-registry.d.ts +15 -0
  170. package/dist/plugin-registry.d.ts.map +1 -0
  171. package/dist/plugin-registry.js +499 -0
  172. package/dist/plugin-registry.js.map +1 -0
  173. package/dist/portfolio-projects.d.ts +7 -0
  174. package/dist/portfolio-projects.d.ts.map +1 -0
  175. package/dist/portfolio-projects.js +65 -0
  176. package/dist/portfolio-projects.js.map +1 -0
  177. package/dist/portfolio-registry.d.ts +42 -0
  178. package/dist/portfolio-registry.d.ts.map +1 -0
  179. package/dist/portfolio-registry.js +311 -0
  180. package/dist/portfolio-registry.js.map +1 -0
  181. package/dist/portfolio-routing.d.ts +5 -0
  182. package/dist/portfolio-routing.d.ts.map +1 -0
  183. package/dist/portfolio-routing.js +24 -0
  184. package/dist/portfolio-routing.js.map +1 -0
  185. package/dist/portfolio-session-service.d.ts +15 -0
  186. package/dist/portfolio-session-service.d.ts.map +1 -0
  187. package/dist/portfolio-session-service.js +206 -0
  188. package/dist/portfolio-session-service.js.map +1 -0
  189. package/dist/process-cache.d.ts +32 -0
  190. package/dist/process-cache.d.ts.map +1 -0
  191. package/dist/process-cache.js +44 -0
  192. package/dist/process-cache.js.map +1 -0
  193. package/dist/project-resolver.d.ts +5 -0
  194. package/dist/project-resolver.d.ts.map +1 -0
  195. package/dist/project-resolver.js +20 -0
  196. package/dist/project-resolver.js.map +1 -0
  197. package/dist/prompt-builder.d.ts +42 -0
  198. package/dist/prompt-builder.d.ts.map +1 -0
  199. package/dist/prompt-builder.js +182 -0
  200. package/dist/prompt-builder.js.map +1 -0
  201. package/dist/prompts/orchestrator.md.js +4 -0
  202. package/dist/prompts/orchestrator.md.js.map +1 -0
  203. package/dist/query-activity-events.d.ts +42 -0
  204. package/dist/query-activity-events.d.ts.map +1 -0
  205. package/dist/query-activity-events.js +170 -0
  206. package/dist/query-activity-events.js.map +1 -0
  207. package/dist/recovery/actions.d.ts +7 -0
  208. package/dist/recovery/actions.d.ts.map +1 -0
  209. package/dist/recovery/index.d.ts +8 -0
  210. package/dist/recovery/index.d.ts.map +1 -0
  211. package/dist/recovery/logger.d.ts +12 -0
  212. package/dist/recovery/logger.d.ts.map +1 -0
  213. package/dist/recovery/manager.d.ts +24 -0
  214. package/dist/recovery/manager.d.ts.map +1 -0
  215. package/dist/recovery/scanner.d.ts +11 -0
  216. package/dist/recovery/scanner.d.ts.map +1 -0
  217. package/dist/recovery/types.d.ts +170 -0
  218. package/dist/recovery/types.d.ts.map +1 -0
  219. package/dist/recovery/validator.d.ts +8 -0
  220. package/dist/recovery/validator.d.ts.map +1 -0
  221. package/dist/report-watcher.d.ts +93 -0
  222. package/dist/report-watcher.d.ts.map +1 -0
  223. package/dist/report-watcher.js +182 -0
  224. package/dist/report-watcher.js.map +1 -0
  225. package/dist/scm-webhook-utils.d.ts +6 -0
  226. package/dist/scm-webhook-utils.d.ts.map +1 -0
  227. package/dist/scm-webhook-utils.js +36 -0
  228. package/dist/scm-webhook-utils.js.map +1 -0
  229. package/dist/session-manager.d.ts +22 -0
  230. package/dist/session-manager.d.ts.map +1 -0
  231. package/dist/session-manager.js +3077 -0
  232. package/dist/session-manager.js.map +1 -0
  233. package/dist/spawn-target.d.ts +23 -0
  234. package/dist/spawn-target.d.ts.map +1 -0
  235. package/dist/spawn-target.js +39 -0
  236. package/dist/spawn-target.js.map +1 -0
  237. package/dist/storage-key.d.ts +9 -0
  238. package/dist/storage-key.d.ts.map +1 -0
  239. package/dist/storage-key.js +59 -0
  240. package/dist/storage-key.js.map +1 -0
  241. package/dist/tmux.d.ts +39 -0
  242. package/dist/tmux.d.ts.map +1 -0
  243. package/dist/tmux.js +141 -0
  244. package/dist/tmux.js.map +1 -0
  245. package/dist/types.d.ts +1496 -0
  246. package/dist/types.d.ts.map +1 -0
  247. package/dist/types.js +215 -0
  248. package/dist/types.js.map +1 -0
  249. package/dist/update-cache.d.ts +59 -0
  250. package/dist/update-cache.d.ts.map +1 -0
  251. package/dist/update-cache.js +77 -0
  252. package/dist/update-cache.js.map +1 -0
  253. package/dist/utils/metadata-flatten.d.ts +3 -0
  254. package/dist/utils/metadata-flatten.d.ts.map +1 -0
  255. package/dist/utils/metadata-flatten.js +18 -0
  256. package/dist/utils/metadata-flatten.js.map +1 -0
  257. package/dist/utils/pr.d.ts +7 -0
  258. package/dist/utils/pr.d.ts.map +1 -0
  259. package/dist/utils/pr.js +97 -0
  260. package/dist/utils/pr.js.map +1 -0
  261. package/dist/utils/session-from-metadata.d.ts +16 -0
  262. package/dist/utils/session-from-metadata.d.ts.map +1 -0
  263. package/dist/utils/session-from-metadata.js +87 -0
  264. package/dist/utils/session-from-metadata.js.map +1 -0
  265. package/dist/utils/session-id.d.ts +4 -0
  266. package/dist/utils/session-id.d.ts.map +1 -0
  267. package/dist/utils/session-id.js +9 -0
  268. package/dist/utils/session-id.js.map +1 -0
  269. package/dist/utils/validation.d.ts +9 -0
  270. package/dist/utils/validation.d.ts.map +1 -0
  271. package/dist/utils/validation.js +45 -0
  272. package/dist/utils/validation.js.map +1 -0
  273. package/dist/utils.d.ts +65 -0
  274. package/dist/utils.d.ts.map +1 -0
  275. package/dist/utils.js +189 -0
  276. package/dist/utils.js.map +1 -0
  277. package/dist/version-compare.d.ts +27 -0
  278. package/dist/version-compare.d.ts.map +1 -0
  279. package/dist/version-compare.js +121 -0
  280. package/dist/version-compare.js.map +1 -0
  281. package/dist/windows-pty-registry.d.ts +27 -0
  282. package/dist/windows-pty-registry.d.ts.map +1 -0
  283. package/dist/windows-pty-registry.js +109 -0
  284. package/dist/windows-pty-registry.js.map +1 -0
  285. package/package.json +110 -0
@@ -0,0 +1,74 @@
1
+ /** Preferred gh binary path for wrapper scripts */
2
+ export declare const PREFERRED_GH_PATH = "/usr/local/bin/gh";
3
+ /**
4
+ * Build a PATH string with ~/.ao/bin prepended for wrapper interception.
5
+ * Deduplicates entries and ensures /usr/local/bin is early for gh resolution.
6
+ */
7
+ export declare function buildAgentPath(basePath: string | undefined): string;
8
+ /**
9
+ * Helper script sourced by both gh and git wrappers.
10
+ * Provides:
11
+ * update_ao_metadata <key> <value> — write key=value to session metadata
12
+ * read_ao_metadata <key> — read a value from session metadata
13
+ * ao_cache_dir — print the per-session gh cache directory
14
+ * ao_cache_fresh <key> <max_age> — test if a cache entry is fresh (0 = infinite)
15
+ * ao_cache_read <key> — print cached stdout
16
+ * ao_cache_write <key> — write stdin to cache atomically
17
+ */
18
+ export declare const AO_METADATA_HELPER = "#!/usr/bin/env bash\n# ao-metadata-helper \u2014 shared by gh/git wrappers\n# Provides: update_ao_metadata, read_ao_metadata, ao_cache_*\n\n# \u2500\u2500 Shared validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n_ao_validate_env() {\n local ao_dir=\"${AO_DATA_DIR:-}\"\n local ao_session=\"${AO_SESSION:-}\"\n [[ -z \"$ao_dir\" || -z \"$ao_session\" ]] && return 1\n case \"$ao_session\" in */* | *..*) return 1 ;; esac\n case \"$ao_dir\" in\n \"$HOME\"/.ao/* | \"$HOME\"/.agent-orchestrator/* | /tmp/*) ;;\n *) return 1 ;;\n esac\n return 0\n}\n\n# \u2500\u2500 Metadata write \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nupdate_ao_metadata() {\n local key=\"$1\" value=\"$2\"\n local ao_dir=\"${AO_DATA_DIR:-}\"\n local ao_session=\"${AO_SESSION:-}\"\n\n [[ -z \"$ao_dir\" || -z \"$ao_session\" ]] && return 0\n\n # Validate: session name must not contain path separators or traversal\n case \"$ao_session\" in\n */* | *..*) return 0 ;;\n esac\n\n # Validate: ao_dir must be an absolute path under known ao directories or /tmp\n case \"$ao_dir\" in\n \"$HOME\"/.ao/* | \"$HOME\"/.agent-orchestrator/* | /tmp/*) ;;\n *) return 0 ;;\n esac\n\n # V2 storage uses .json extension; fallback to bare filename for pre-migration layouts\n local metadata_file=\"$ao_dir/${ao_session}.json\"\n if [[ ! -f \"$metadata_file\" ]]; then\n metadata_file=\"$ao_dir/$ao_session\"\n fi\n\n # Resolve symlinks and verify canonicalized paths are still within trusted roots\n local real_dir real_ao_dir\n real_ao_dir=\"$(cd \"$ao_dir\" 2>/dev/null && pwd -P)\" || return 0\n real_dir=\"$(cd \"$(dirname \"$metadata_file\")\" 2>/dev/null && pwd -P)\" || return 0\n\n # Re-validate real_ao_dir against trusted roots after canonicalization\n # (prevents /tmp/../../home/user from escaping the allowlist)\n case \"$real_ao_dir\" in\n \"$HOME\"/.ao/* | \"$HOME\"/.ao | \"$HOME\"/.agent-orchestrator/* | \"$HOME\"/.agent-orchestrator | /tmp/*) ;;\n *) return 0 ;;\n esac\n\n [[ \"$real_dir\" == \"$real_ao_dir\"* ]] || return 0\n\n [[ -f \"$metadata_file\" ]] || return 0\n\n # Validate key \u2014 only allow alphanumeric, underscore, hyphen (prevents sed/jq injection)\n [[ \"$key\" =~ ^[a-zA-Z0-9_-]+$ ]] || return 0\n\n local temp_file=\"${metadata_file}.tmp.$$\"\n\n # Strip newlines from value to prevent injection\n local clean_value=\"$(printf '%s' \"$value\" | tr -d '\\n')\"\n\n # Detect JSON vs key=value format\n local first_char\n first_char=\"$(head -c1 \"$metadata_file\" 2>/dev/null)\"\n\n if [[ \"$first_char\" == \"{\" ]]; then\n # JSON format\n if command -v jq &>/dev/null; then\n jq --arg k \"$key\" --arg v \"$clean_value\" '.[$k] = $v' \"$metadata_file\" > \"$temp_file\"\n mv \"$temp_file\" \"$metadata_file\"\n else\n # jq unavailable \u2014 use node (hard dep) for safe nested JSON update\n node -e \"\n const fs = require('fs');\n const d = JSON.parse(fs.readFileSync(process.argv[1], 'utf8'));\n d[process.argv[2]] = process.argv[3];\n fs.writeFileSync(process.argv[4], JSON.stringify(d, null, 2));\n \" \"$metadata_file\" \"$key\" \"$clean_value\" \"$temp_file\"\n mv \"$temp_file\" \"$metadata_file\"\n fi\n else\n # Key=value format (legacy)\n local escaped_value=\"$(printf '%s' \"$clean_value\" | sed 's/[&|\\\\]/\\\\&/g')\"\n if grep -q \"^${key}=\" \"$metadata_file\" 2>/dev/null; then\n sed \"s|^${key}=.*|${key}=${escaped_value}|\" \"$metadata_file\" > \"$temp_file\"\n else\n cp \"$metadata_file\" \"$temp_file\"\n printf '%s=%s\\n' \"$key\" \"$clean_value\" >> \"$temp_file\"\n fi\n mv \"$temp_file\" \"$metadata_file\"\n fi\n}\n\n# \u2500\u2500 Metadata read \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nread_ao_metadata() {\n local key=\"$1\"\n _ao_validate_env || return 1\n local metadata_file=\"${AO_DATA_DIR}/${AO_SESSION}\"\n [[ -f \"$metadata_file\" ]] || return 1\n [[ \"$key\" =~ ^[a-zA-Z0-9_-]+$ ]] || return 1\n local line\n line=$(grep \"^${key}=\" \"$metadata_file\" 2>/dev/null | head -1) || return 1\n printf '%s' \"${line#*=}\"\n}\n\n# \u2500\u2500 Cache helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nao_cache_dir() {\n _ao_validate_env || return 1\n local d=\"${AO_DATA_DIR}/.ghcache/${AO_SESSION}\"\n mkdir -p \"$d\" 2>/dev/null || return 1\n printf '%s' \"$d\"\n}\n\nao_cache_fresh() {\n local cache_key=\"$1\" max_age=\"$2\"\n [[ \"$cache_key\" =~ ^[a-zA-Z0-9_.-]+$ ]] || return 1\n local cache_dir\n cache_dir=\"$(ao_cache_dir)\" || return 1\n local ts_file=\"$cache_dir/${cache_key}.ts\"\n local stdout_file=\"$cache_dir/${cache_key}.stdout\"\n [[ -f \"$stdout_file\" && -f \"$ts_file\" ]] || return 1\n local cached_ts now\n cached_ts=$(cat \"$ts_file\" 2>/dev/null) || return 1\n # Sanity check: cached_ts must be a positive integer (epoch seconds)\n [[ \"$cached_ts\" =~ ^[0-9]+$ && \"$cached_ts\" -gt 0 ]] || return 1\n # max_age=0 means infinite TTL\n [[ \"$max_age\" -eq 0 ]] 2>/dev/null && return 0\n now=$(date +%s)\n (( now - cached_ts < max_age ))\n}\n\nao_cache_read() {\n local cache_key=\"$1\"\n [[ \"$cache_key\" =~ ^[a-zA-Z0-9_.-]+$ ]] || return 1\n local cache_dir\n cache_dir=\"$(ao_cache_dir)\" || return 1\n cat \"$cache_dir/${cache_key}.stdout\"\n}\n\nao_cache_write() {\n local cache_key=\"$1\"\n [[ \"$cache_key\" =~ ^[a-zA-Z0-9_.-]+$ ]] || return 1\n local cache_dir\n cache_dir=\"$(ao_cache_dir)\" || return 1\n local tmp=\"$cache_dir/${cache_key}.stdout.tmp.$$\"\n cat > \"$tmp\" && mv \"$tmp\" \"$cache_dir/${cache_key}.stdout\"\n date +%s > \"$cache_dir/${cache_key}.ts\"\n}\n";
19
+ /**
20
+ * gh wrapper — intercepts agent-side gh calls for:
21
+ * 1. Caching repeated read-only commands (PR discovery, issue context)
22
+ * 2. Auto-updating session metadata on PR creation
23
+ *
24
+ * Cache storage: $AO_DATA_DIR/.ghcache/$AO_SESSION/{key}.stdout + {key}.ts
25
+ * See D4-wrapper-cache-plan.md for full design rationale.
26
+ */
27
+ export declare const GH_WRAPPER = "#!/usr/bin/env bash\n# ao gh wrapper \u2014 caches reads + auto-updates metadata on writes\n\n# Find real gh by removing our wrapper directory from PATH\nao_bin_dir=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nclean_path=\"$(echo \"$PATH\" | tr ':' '\\n' | grep -Fxv \"$ao_bin_dir\" | grep . | tr '\\n' ':')\"\nclean_path=\"${clean_path%:}\"\nreal_gh=\"\"\n\n# Prefer explicit gh path when provided by AO environment.\n# Guard against recursive self-reference to the wrapper in ~/.ao/bin.\nif [[ -n \"${GH_PATH:-}\" && -x \"$GH_PATH\" ]]; then\n gh_dir=\"$(cd \"$(dirname \"$GH_PATH\")\" 2>/dev/null && pwd)\"\n if [[ \"$gh_dir\" != \"$ao_bin_dir\" ]]; then\n real_gh=\"$GH_PATH\"\n fi\nfi\n\nif [[ -z \"$real_gh\" ]]; then\n real_gh=\"$(PATH=\"$clean_path\" command -v gh 2>/dev/null)\"\nfi\n\nif [[ -z \"$real_gh\" ]]; then\n echo \"ao-wrapper: gh not found in PATH\" >&2\n exit 127\nfi\n\n# Source the metadata helper (provides update/read_ao_metadata, ao_cache_*)\nsource \"$ao_bin_dir/ao-metadata-helper.sh\" 2>/dev/null || true\n\n# Redact sensitive values from args before tracing.\n# Handles: -H \"Authorization: ...\", token=..., password=..., secret=...\n_ao_redact_args() {\n local prev=\"\"\n local out=()\n for arg in \"$@\"; do\n if [[ \"$prev\" == \"-H\" || \"$prev\" == \"--header\" ]] && [[ \"$arg\" =~ ^[Aa]uthorization: ]]; then\n out+=(\"Authorization: [REDACTED]\")\n elif [[ \"$arg\" =~ ^-H[Aa]uthorization: ]]; then\n out+=(\"-HAuthorization: [REDACTED]\")\n elif [[ \"$arg\" =~ ^[Tt]oken= ]]; then\n out+=(\"token=[REDACTED]\")\n elif [[ \"$arg\" =~ ^[Pp]assword= ]]; then\n out+=(\"password=[REDACTED]\")\n elif [[ \"$arg\" =~ ^[Ss]ecret= ]]; then\n out+=(\"secret=[REDACTED]\")\n else\n out+=(\"$arg\")\n fi\n prev=\"$arg\"\n done\n printf '%s\n' \"${out[@]}\"\n}\n\n# Best-effort JSONL tracing for agent-side gh invocations.\nlog_gh_invocation() {\n local trace_file=\"${AO_AGENT_GH_TRACE:-}\"\n [[ -z \"$trace_file\" ]] && return 0\n command -v jq >/dev/null 2>&1 || return 0\n\n mkdir -p \"$(dirname \"$trace_file\")\" 2>/dev/null || return 0\n\n local args_json\n args_json=\"$(_ao_redact_args \"$@\" | jq -Rsc 'split(\"\n\")[:-1]')\" || return 0\n\n # Compute operation: gh.{arg1}.{arg2} (mirrors AO-side extractOperation)\n local _ao_op=\"gh\"\n [[ $# -ge 1 ]] && _ao_op=\"gh.$1\"\n [[ $# -ge 2 && \"$2\" != -* ]] && _ao_op=\"gh.$1.$2\"\n\n jq -nc --arg timestamp \"$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\" --arg cwd \"$PWD\" --arg operation \"$_ao_op\" --arg aoSession \"${AO_SESSION:-}\" --arg aoSessionName \"${AO_SESSION_NAME:-}\" --arg aoProjectId \"${AO_PROJECT_ID:-}\" --arg aoIssueId \"${AO_ISSUE_ID:-}\" --arg aoCallerType \"${AO_CALLER_TYPE:-}\" --arg pid \"$$\" --arg wrapperVersion \"0.8.0\" --argjson args \"$args_json\" '{\n timestamp: $timestamp,\n cwd: $cwd,\n args: $args,\n operation: $operation,\n aoSession: (if $aoSession == \"\" then null else $aoSession end),\n aoSessionName: (if $aoSessionName == \"\" then null else $aoSessionName end),\n aoProjectId: (if $aoProjectId == \"\" then null else $aoProjectId end),\n aoIssueId: (if $aoIssueId == \"\" then null else $aoIssueId end),\n aoCallerType: (if $aoCallerType == \"\" then null else $aoCallerType end),\n pid: ($pid | tonumber),\n wrapperVersion: $wrapperVersion\n }' >> \"$trace_file\" 2>/dev/null || true\n}\n\nlog_gh_invocation \"$@\"\n\n# Best-effort cache-outcome tracing (appends to same JSONL trace file).\n# result: hit | miss-stored | miss-write-failed | miss-negative | miss-error | passthrough\nlog_ao_cache() {\n local result=\"$1\" cache_key=\"$2\" duration_ms=\"${3:-0}\" exit_code=\"${4:-0}\" ok=\"${5:-true}\"\n local trace_file=\"${AO_AGENT_GH_TRACE:-}\"\n [[ -z \"$trace_file\" ]] && return 0\n printf '{\"timestamp\":\"%s\",\"cacheResult\":\"%s\",\"cacheKey\":\"%s\",\"pid\":%s,\"durationMs\":%s,\"exitCode\":%s,\"ok\":%s}\\n' \"$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\" \"$result\" \"$cache_key\" \"$$\" \"$duration_ms\" \"$exit_code\" \"$ok\" >> \"$trace_file\" 2>/dev/null || true\n}\n\n# =============================================================================\n# Cacheable reads\n# =============================================================================\n\n# \u2500\u2500 1. PR discovery: gh pr list --head <B> --limit 1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n# 120s TTL for positive results (non-empty array). Never caches [].\nif [[ \"$1\" == \"pr\" && \"$2\" == \"list\" ]]; then\n _ao_head=\"\" _ao_limit=\"\" _ao_json=\"\" _ao_repo=\"\" _ao_cacheable=true\n _ao_saved_args=(\"$@\")\n shift 2\n while [[ $# -gt 0 ]]; do\n case \"$1\" in\n --head) _ao_head=\"$2\"; shift 2 ;;\n --head=*) _ao_head=\"${1#--head=}\"; shift ;;\n --limit) _ao_limit=\"$2\"; shift 2 ;;\n --limit=*) _ao_limit=\"${1#--limit=}\"; shift ;;\n --json) _ao_json=\"$2\"; shift 2 ;;\n --json=*) _ao_json=\"${1#--json=}\"; shift ;;\n --repo) _ao_repo=\"$2\"; shift 2 ;;\n --repo=*) _ao_repo=\"${1#--repo=}\"; shift ;;\n --search|--state|--assignee|--label|--jq|--template)\n _ao_cacheable=false; break ;;\n --search=*|--state=*|--assignee=*|--label=*|--jq=*|--template=*)\n _ao_cacheable=false; break ;;\n -*) shift ;; # skip unknown flags\n *) shift ;; # skip positional\n esac\n done\n set -- \"${_ao_saved_args[@]}\"\n\n if [[ \"$_ao_cacheable\" == true && \"$_ao_limit\" == \"1\" && -n \"$_ao_head\" ]]; then\n # Use sha256 hash suffix to avoid collisions from tr-based sanitization\n # (e.g. feat/foo, feat-foo, feat_foo would otherwise map to the same key)\n _ao_raw_key=\"pr-discovery-${_ao_repo}-${_ao_head}\"\n if [[ -n \"$_ao_json\" ]]; then\n _ao_raw_key=\"${_ao_raw_key}-j-${_ao_json}\"\n fi\n _ao_cache_key=$(printf '%s' \"$_ao_raw_key\" | shasum -a 256 | cut -c1-16)\n _ao_cache_key=\"pr-disc-${_ao_cache_key}\"\n\n if ao_cache_fresh \"$_ao_cache_key\" 120 2>/dev/null; then\n log_ao_cache \"hit\" \"$_ao_cache_key\" 0 0 true\n ao_cache_read \"$_ao_cache_key\"\n exit 0\n fi\n\n # Cache miss \u2014 call real gh, cache positive results (stderr passes through)\n _ao_tmpout=\"$(mktemp)\"\n trap 'rm -f \"$_ao_tmpout\"' EXIT\n _ao_start_s=$(date +%s)\n \"$real_gh\" \"$@\" > \"$_ao_tmpout\"\n _ao_exit=$?\n _ao_duration_ms=$(( ($(date +%s) - _ao_start_s) * 1000 ))\n _ao_ok=true; [[ $_ao_exit -ne 0 ]] && _ao_ok=false\n cat \"$_ao_tmpout\"\n if [[ $_ao_exit -eq 0 ]]; then\n _ao_trimmed=$(tr -d '[:space:]' < \"$_ao_tmpout\")\n # Only cache non-empty positive results\n if [[ -n \"$_ao_trimmed\" && \"$_ao_trimmed\" != \"[]\" ]]; then\n if ao_cache_write \"$_ao_cache_key\" < \"$_ao_tmpout\" 2>/dev/null; then\n log_ao_cache \"miss-stored\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n else\n log_ao_cache \"miss-write-failed\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n fi\n else\n log_ao_cache \"miss-negative\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n fi\n else\n log_ao_cache \"miss-error\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n fi\n exit $_ao_exit\n fi\nfi\n\n# \u2500\u2500 2. Issue context: gh issue view <N> \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n# 300-second TTL. Caches any successful response.\nif [[ \"$1\" == \"issue\" && \"$2\" == \"view\" ]]; then\n _ao_issue_id=\"\" _ao_json=\"\" _ao_repo=\"\" _ao_cacheable=true\n _ao_saved_args=(\"$@\")\n shift 2\n # First non-flag arg is the issue identifier\n while [[ $# -gt 0 ]]; do\n case \"$1\" in\n --web|--comments|--jq|--template)\n _ao_cacheable=false; break ;;\n --jq=*|--template=*)\n _ao_cacheable=false; break ;;\n --json) _ao_json=\"$2\"; shift 2 ;;\n --json=*) _ao_json=\"${1#--json=}\"; shift ;;\n --repo) _ao_repo=\"$2\"; shift 2 ;;\n --repo=*) _ao_repo=\"${1#--repo=}\"; shift ;;\n -*) shift ;;\n *)\n if [[ -z \"$_ao_issue_id\" && \"$1\" =~ ^[0-9]+$ ]]; then\n _ao_issue_id=\"$1\"\n fi\n shift ;;\n esac\n done\n set -- \"${_ao_saved_args[@]}\"\n\n if [[ \"$_ao_cacheable\" == true && -n \"$_ao_issue_id\" ]]; then\n _ao_raw_key=\"issue-ctx-${_ao_repo}-${_ao_issue_id}\"\n if [[ -n \"$_ao_json\" ]]; then\n _ao_raw_key=\"${_ao_raw_key}-j-${_ao_json}\"\n fi\n _ao_cache_key=$(printf '%s' \"$_ao_raw_key\" | shasum -a 256 | cut -c1-16)\n _ao_cache_key=\"issue-${_ao_cache_key}\"\n\n if ao_cache_fresh \"$_ao_cache_key\" 300 2>/dev/null; then\n log_ao_cache \"hit\" \"$_ao_cache_key\" 0 0 true\n ao_cache_read \"$_ao_cache_key\"\n exit 0\n fi\n\n _ao_tmpout=\"$(mktemp)\"\n trap 'rm -f \"$_ao_tmpout\"' EXIT\n _ao_start_s=$(date +%s)\n \"$real_gh\" \"$@\" > \"$_ao_tmpout\"\n _ao_exit=$?\n _ao_duration_ms=$(( ($(date +%s) - _ao_start_s) * 1000 ))\n _ao_ok=true; [[ $_ao_exit -ne 0 ]] && _ao_ok=false\n cat \"$_ao_tmpout\"\n if [[ $_ao_exit -eq 0 ]]; then\n if ao_cache_write \"$_ao_cache_key\" < \"$_ao_tmpout\" 2>/dev/null; then\n log_ao_cache \"miss-stored\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n else\n log_ao_cache \"miss-write-failed\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n fi\n else\n log_ao_cache \"miss-error\" \"$_ao_cache_key\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n fi\n exit $_ao_exit\n fi\nfi\n\n# =============================================================================\n# Write intercepts\n# =============================================================================\n\ncase \"$1/$2\" in\n pr/create)\n tmpout=\"$(mktemp)\"\n trap 'rm -f \"$tmpout\"' EXIT\n\n _ao_start_s=$(date +%s)\n \"$real_gh\" \"$@\" 2>&1 | tee \"$tmpout\"\n exit_code=${PIPESTATUS[0]}\n _ao_duration_ms=$(( ($(date +%s) - _ao_start_s) * 1000 ))\n _ao_ok=true; [[ $exit_code -ne 0 ]] && _ao_ok=false\n\n if [[ $exit_code -eq 0 ]]; then\n output=\"$(cat \"$tmpout\")\"\n pr_url=\"$(echo \"$output\" | grep -Eo 'https?://[^/]+/[^/]+/[^/]+/pull/[0-9]+' | head -1)\"\n report_state=\"pr_created\"\n report_draft=\"false\"\n for arg in \"$@\"; do\n if [[ \"$arg\" == \"--draft\" || \"$arg\" == \"-d\" ]]; then\n report_state=\"draft_pr_created\"\n report_draft=\"true\"\n break\n fi\n done\n if [[ -n \"$pr_url\" ]]; then\n update_ao_metadata pr \"$pr_url\"\n update_ao_metadata agentReportedPrUrl \"$pr_url\"\n # Append to prs field (comma-separated list of all PR URLs for this session).\n # Supports multiple PRs per session \u2014 same repo or different repos.\n _ao_meta_f=\"${AO_DATA_DIR}/${AO_SESSION}.json\"\n [[ -f \"$_ao_meta_f\" ]] || _ao_meta_f=\"${AO_DATA_DIR}/${AO_SESSION}\"\n if head -c1 \"$_ao_meta_f\" 2>/dev/null | grep -q '{'; then\n existing_prs=\"$(jq -r '.prs // empty' \"$_ao_meta_f\" 2>/dev/null || echo \"\")\"\n else\n existing_prs=\"$(grep '^prs=' \"$_ao_meta_f\" 2>/dev/null | cut -d'=' -f2- || echo \"\")\"\n fi\n if [[ -z \"$existing_prs\" ]]; then\n new_prs=\"$pr_url\"\n else\n if ! echo \",$existing_prs,\" | grep -qF \",$pr_url,\"; then\n new_prs=\"$existing_prs,$pr_url\"\n else\n new_prs=\"$existing_prs\"\n fi\n fi\n update_ao_metadata prs \"$new_prs\"\n fi\n pr_number=\"$(printf '%s' \"$pr_url\" | grep -Eo '[0-9]+$' | head -1)\"\n if [[ -n \"$pr_number\" ]]; then\n update_ao_metadata agentReportedPrNumber \"$pr_number\"\n fi\n update_ao_metadata agentReportedState \"$report_state\"\n update_ao_metadata agentReportedAt \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n update_ao_metadata agentReportedPrIsDraft \"$report_draft\"\n fi\n\n log_ao_cache \"passthrough\" \"\" \"$_ao_duration_ms\" \"$exit_code\" \"$_ao_ok\"\n exit $exit_code\n ;;\n *)\n _ao_start_s=$(date +%s)\n \"$real_gh\" \"$@\"\n _ao_exit=$?\n _ao_duration_ms=$(( ($(date +%s) - _ao_start_s) * 1000 ))\n _ao_ok=true; [[ $_ao_exit -ne 0 ]] && _ao_ok=false\n log_ao_cache \"passthrough\" \"\" \"$_ao_duration_ms\" \"$_ao_exit\" \"$_ao_ok\"\n exit $_ao_exit\n ;;\nesac\n";
28
+ /**
29
+ * git wrapper — intercepts branch operations to auto-update metadata.
30
+ * All other commands pass through transparently.
31
+ *
32
+ * Detects:
33
+ * - git checkout -b <branch> / git switch -c <branch> (new branch)
34
+ * - git checkout <branch> / git switch <branch> (existing feature branch)
35
+ *
36
+ * For existing branch switches, only updates if the branch name looks like a
37
+ * feature branch (contains / or -) to avoid noise from checkout of commits/tags.
38
+ * Matches the same heuristic as Claude Code's PostToolUse hook.
39
+ */
40
+ export declare const GIT_WRAPPER = "#!/usr/bin/env bash\n# ao git wrapper \u2014 auto-updates session metadata on branch operations\n\n# Find real git by removing our wrapper directory from PATH\nao_bin_dir=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nclean_path=\"$(echo \"$PATH\" | tr ':' '\\n' | grep -Fxv \"$ao_bin_dir\" | grep . | tr '\\n' ':')\"\nclean_path=\"${clean_path%:}\"\nreal_git=\"$(PATH=\"$clean_path\" command -v git 2>/dev/null)\"\n\nif [[ -z \"$real_git\" ]]; then\n echo \"ao-wrapper: git not found in PATH\" >&2\n exit 127\nfi\n\n# Source the metadata helper\nsource \"$ao_bin_dir/ao-metadata-helper.sh\" 2>/dev/null || true\n\n# Run real git\n\"$real_git\" \"$@\"\nexit_code=$?\n\n# Only update metadata on success\nif [[ $exit_code -eq 0 ]]; then\n case \"$1/$2\" in\n checkout/-b)\n update_ao_metadata branch \"$3\"\n ;;\n switch/-c)\n update_ao_metadata branch \"$3\"\n ;;\n checkout/*|switch/*)\n # Existing branch switch \u2014 only track feature-looking branches (contain / or -)\n # Skip flags (e.g. -B), HEAD, tags, commit hashes, and simple names like \"main\"\n branch=\"$2\"\n # If $2 is a flag, the actual branch name is in $3\n if [[ \"$branch\" == -* ]]; then branch=\"$3\"; fi\n if [[ -n \"$branch\" && \"$branch\" != \"HEAD\" && \"$branch\" != -* && \"$branch\" == *[/-]* ]]; then\n update_ao_metadata branch \"$branch\"\n fi\n ;;\n esac\nfi\n\nexit $exit_code\n";
41
+ /**
42
+ * Build a Node.js wrapper script for a given binary (gh or git).
43
+ *
44
+ * On Windows, bash scripts cannot be executed directly, so we generate:
45
+ * - <name>.cjs — the actual interception logic (Node.js, forced CJS mode)
46
+ * - <name>.cmd — a tiny CMD shim: @node "%~dp0<name>.cjs" %*
47
+ *
48
+ * The .js script replicates what the bash wrapper does:
49
+ * - gh: intercepts `gh pr create` and `gh pr merge`
50
+ * - git: intercepts `git checkout -b` and `git switch -c`
51
+ *
52
+ * @param name - "gh" or "git"
53
+ * @param realBinaryPath - Absolute path to the real binary, or empty string to
54
+ * resolve at runtime via PATH (excluding the wrapper dir).
55
+ */
56
+ export declare function buildNodeWrapper(name: "gh" | "git", realBinaryPath: string): string;
57
+ /**
58
+ * Section appended to AGENTS.md as a secondary signal. The PATH-based wrappers
59
+ * handle metadata updates automatically, but AGENTS.md reinforces the intent
60
+ * and helps if the wrappers are bypassed.
61
+ */
62
+ export declare const AO_AGENTS_MD_SECTION = "\n## Athene (ao) Session\n\nYou are running inside an Athene managed workspace.\nSession metadata is updated automatically via shell wrappers.\n\nIf automatic updates fail, you can manually update metadata:\n```bash\n~/.ao/bin/ao-metadata-helper.sh # sourced automatically\n# Then call: update_ao_metadata <key> <value>\n```\n";
63
+ /**
64
+ * Install PATH-based shell wrappers and append an AO section to AGENTS.md.
65
+ *
66
+ * This is the standard workspace setup for agents that don't have native hook
67
+ * systems (Codex, Aider, OpenCode). Call this from both `setupWorkspaceHooks`
68
+ * and `postLaunchSetup`.
69
+ *
70
+ * 1. Creates ~/.ao/bin/ with gh/git wrappers and metadata helper script
71
+ * 2. Appends an "Athene" section to the workspace AGENTS.md
72
+ */
73
+ export declare function setupPathWrapperWorkspace(workspacePath: string): Promise<void>;
74
+ //# sourceMappingURL=agent-workspace-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-workspace-hooks.d.ts","sourceRoot":"","sources":["../src/agent-workspace-hooks.ts"],"names":[],"mappings":"AAwBA,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,sBAA+B,CAAC;AAkB9D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAsBnE;AAQD;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,+vNA6J9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,wrZA+TtB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,o6CA4CvB,CAAC;AAMF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAKnF;AAkQD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,4UAWhC,CAAC;AAkBF;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDpF"}