agent-mockingbird 0.0.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 (227) hide show
  1. package/.agents/skills/btca-cli/SKILL.md +64 -0
  2. package/.agents/skills/btca-cli/agents/openai.yaml +3 -0
  3. package/.agents/skills/frontend-design/SKILL.md +42 -0
  4. package/.agents/skills/frontend-design/agents/openai.yaml +3 -0
  5. package/.env.example +36 -0
  6. package/.githooks/pre-commit +33 -0
  7. package/.github/workflows/ci.yml +309 -0
  8. package/.opencode/bun.lock +18 -0
  9. package/.opencode/package.json +5 -0
  10. package/.opencode/tools/agent_type_manager.ts +100 -0
  11. package/.opencode/tools/config_manager.ts +87 -0
  12. package/.opencode/tools/cron_manager.ts +145 -0
  13. package/.opencode/tools/memory_get.ts +43 -0
  14. package/.opencode/tools/memory_remember.ts +53 -0
  15. package/.opencode/tools/memory_search.ts +48 -0
  16. package/AGENTS.md +126 -0
  17. package/MEMORY.md +2 -0
  18. package/README.md +451 -0
  19. package/THIRD_PARTY_NOTICES.md +11 -0
  20. package/agent-mockingbird.config.example.json +135 -0
  21. package/apps/server/package.json +32 -0
  22. package/apps/server/src/backend/agents/bootstrapContext.ts +362 -0
  23. package/apps/server/src/backend/agents/openclawImport.test.ts +133 -0
  24. package/apps/server/src/backend/agents/openclawImport.ts +797 -0
  25. package/apps/server/src/backend/agents/opencodeConfig.ts +428 -0
  26. package/apps/server/src/backend/agents/service.ts +10 -0
  27. package/apps/server/src/backend/config/example-config.test.ts +20 -0
  28. package/apps/server/src/backend/config/orchestration.ts +243 -0
  29. package/apps/server/src/backend/config/policy.ts +158 -0
  30. package/apps/server/src/backend/config/schema.test.ts +15 -0
  31. package/apps/server/src/backend/config/schema.ts +391 -0
  32. package/apps/server/src/backend/config/semantic.test.ts +34 -0
  33. package/apps/server/src/backend/config/semantic.ts +149 -0
  34. package/apps/server/src/backend/config/service.test.ts +75 -0
  35. package/apps/server/src/backend/config/service.ts +207 -0
  36. package/apps/server/src/backend/config/smoke.ts +77 -0
  37. package/apps/server/src/backend/config/store.test.ts +123 -0
  38. package/apps/server/src/backend/config/store.ts +581 -0
  39. package/apps/server/src/backend/config/testFixtures.ts +5 -0
  40. package/apps/server/src/backend/config/types.ts +56 -0
  41. package/apps/server/src/backend/contracts/events.ts +320 -0
  42. package/apps/server/src/backend/contracts/runtime.ts +111 -0
  43. package/apps/server/src/backend/cron/executor.ts +435 -0
  44. package/apps/server/src/backend/cron/repository.ts +170 -0
  45. package/apps/server/src/backend/cron/service.ts +660 -0
  46. package/apps/server/src/backend/cron/storage.ts +92 -0
  47. package/apps/server/src/backend/cron/types.ts +138 -0
  48. package/apps/server/src/backend/cron/utils.ts +351 -0
  49. package/apps/server/src/backend/db/client.ts +20 -0
  50. package/apps/server/src/backend/db/migrate.ts +40 -0
  51. package/apps/server/src/backend/db/repository.ts +1762 -0
  52. package/apps/server/src/backend/db/schema.ts +113 -0
  53. package/apps/server/src/backend/db/usageDashboard.test.ts +102 -0
  54. package/apps/server/src/backend/db/wipe.ts +13 -0
  55. package/apps/server/src/backend/defaults.ts +32 -0
  56. package/apps/server/src/backend/env.ts +48 -0
  57. package/apps/server/src/backend/heartbeat/activeHours.ts +45 -0
  58. package/apps/server/src/backend/heartbeat/defaultJob.ts +88 -0
  59. package/apps/server/src/backend/heartbeat/heartbeat.test.ts +110 -0
  60. package/apps/server/src/backend/heartbeat/runtimeService.ts +190 -0
  61. package/apps/server/src/backend/heartbeat/service.ts +176 -0
  62. package/apps/server/src/backend/heartbeat/state.test.ts +63 -0
  63. package/apps/server/src/backend/heartbeat/state.ts +167 -0
  64. package/apps/server/src/backend/heartbeat/types.ts +54 -0
  65. package/apps/server/src/backend/http/boundedQueue.test.ts +49 -0
  66. package/apps/server/src/backend/http/boundedQueue.ts +92 -0
  67. package/apps/server/src/backend/http/parsers.ts +40 -0
  68. package/apps/server/src/backend/http/router.ts +61 -0
  69. package/apps/server/src/backend/http/routes/agentRoutes.ts +67 -0
  70. package/apps/server/src/backend/http/routes/backgroundRoutes.ts +203 -0
  71. package/apps/server/src/backend/http/routes/chatRoutes.ts +107 -0
  72. package/apps/server/src/backend/http/routes/configRoutes.ts +602 -0
  73. package/apps/server/src/backend/http/routes/cronRoutes.ts +221 -0
  74. package/apps/server/src/backend/http/routes/dashboardRoutes.ts +308 -0
  75. package/apps/server/src/backend/http/routes/eventRoutes.ts +7 -0
  76. package/apps/server/src/backend/http/routes/heartbeatRoutes.test.ts +41 -0
  77. package/apps/server/src/backend/http/routes/heartbeatRoutes.ts +28 -0
  78. package/apps/server/src/backend/http/routes/index.ts +101 -0
  79. package/apps/server/src/backend/http/routes/mcpRoutes.ts +213 -0
  80. package/apps/server/src/backend/http/routes/memoryRoutes.ts +154 -0
  81. package/apps/server/src/backend/http/routes/runRoutes.ts +310 -0
  82. package/apps/server/src/backend/http/routes/runtimeRoutes.ts +197 -0
  83. package/apps/server/src/backend/http/routes/skillRoutes.ts +112 -0
  84. package/apps/server/src/backend/http/routes/uiRoutes.test.ts +161 -0
  85. package/apps/server/src/backend/http/routes/uiRoutes.ts +177 -0
  86. package/apps/server/src/backend/http/routes/usageRoutes.test.ts +104 -0
  87. package/apps/server/src/backend/http/routes/usageRoutes.ts +767 -0
  88. package/apps/server/src/backend/http/schemas.ts +64 -0
  89. package/apps/server/src/backend/http/sse.ts +144 -0
  90. package/apps/server/src/backend/integration/backend-core.test.ts +2316 -0
  91. package/apps/server/src/backend/logging/logger.ts +64 -0
  92. package/apps/server/src/backend/mcp/service.ts +326 -0
  93. package/apps/server/src/backend/memory/cli.ts +170 -0
  94. package/apps/server/src/backend/memory/conceptExpansion.test.ts +28 -0
  95. package/apps/server/src/backend/memory/conceptExpansion.ts +80 -0
  96. package/apps/server/src/backend/memory/qmdPort.test.ts +54 -0
  97. package/apps/server/src/backend/memory/qmdPort.ts +61 -0
  98. package/apps/server/src/backend/memory/records.test.ts +66 -0
  99. package/apps/server/src/backend/memory/records.ts +229 -0
  100. package/apps/server/src/backend/memory/service.ts +2012 -0
  101. package/apps/server/src/backend/memory/sqliteVec.ts +58 -0
  102. package/apps/server/src/backend/memory/types.ts +104 -0
  103. package/apps/server/src/backend/opencode/agentMockingbirdPlugin.test.ts +396 -0
  104. package/apps/server/src/backend/opencode/client.ts +98 -0
  105. package/apps/server/src/backend/opencode/models.ts +41 -0
  106. package/apps/server/src/backend/opencode/systemPrompt.test.ts +146 -0
  107. package/apps/server/src/backend/opencode/systemPrompt.ts +284 -0
  108. package/apps/server/src/backend/paths.ts +57 -0
  109. package/apps/server/src/backend/prompts/service.ts +100 -0
  110. package/apps/server/src/backend/queue/queue.test.ts +189 -0
  111. package/apps/server/src/backend/queue/service.ts +177 -0
  112. package/apps/server/src/backend/queue/types.ts +39 -0
  113. package/apps/server/src/backend/run/service.ts +576 -0
  114. package/apps/server/src/backend/run/storage.ts +47 -0
  115. package/apps/server/src/backend/run/types.ts +44 -0
  116. package/apps/server/src/backend/runtime/errors.ts +61 -0
  117. package/apps/server/src/backend/runtime/index.ts +72 -0
  118. package/apps/server/src/backend/runtime/memoryPromptDedup.test.ts +153 -0
  119. package/apps/server/src/backend/runtime/memoryPromptDedup.ts +76 -0
  120. package/apps/server/src/backend/runtime/opencodeRuntime/backgroundMethods.ts +765 -0
  121. package/apps/server/src/backend/runtime/opencodeRuntime/coreMethods.ts +705 -0
  122. package/apps/server/src/backend/runtime/opencodeRuntime/eventMethods.ts +503 -0
  123. package/apps/server/src/backend/runtime/opencodeRuntime/memoryMethods.ts +462 -0
  124. package/apps/server/src/backend/runtime/opencodeRuntime/promptMethods.ts +1167 -0
  125. package/apps/server/src/backend/runtime/opencodeRuntime/shared.ts +254 -0
  126. package/apps/server/src/backend/runtime/opencodeRuntime.test.ts +2899 -0
  127. package/apps/server/src/backend/runtime/opencodeRuntime.ts +135 -0
  128. package/apps/server/src/backend/runtime/sessionScope.ts +45 -0
  129. package/apps/server/src/backend/skills/service.ts +442 -0
  130. package/apps/server/src/backend/workspace/resolve.ts +27 -0
  131. package/apps/server/src/cli/agent-mockingbird.mjs +2522 -0
  132. package/apps/server/src/cli/agent-mockingbird.test.ts +68 -0
  133. package/apps/server/src/cli/runtime-assets.mjs +269 -0
  134. package/apps/server/src/cli/runtime-assets.test.ts +52 -0
  135. package/apps/server/src/cli/runtime-layout.mjs +75 -0
  136. package/apps/server/src/cli/standaloneBuild.test.ts +19 -0
  137. package/apps/server/src/cli/standaloneBuild.ts +19 -0
  138. package/apps/server/src/cli/standaloneCronBinary.test.ts +187 -0
  139. package/apps/server/src/index.ts +178 -0
  140. package/apps/server/tsconfig.json +12 -0
  141. package/backlog.md +5 -0
  142. package/bin/agent-mockingbird +2522 -0
  143. package/bin/runtime-layout.mjs +75 -0
  144. package/build-bin.ts +34 -0
  145. package/build-cli.mjs +37 -0
  146. package/build.ts +40 -0
  147. package/bun-env.d.ts +11 -0
  148. package/bun.lock +888 -0
  149. package/bunfig.toml +2 -0
  150. package/components.json +21 -0
  151. package/config.json +130 -0
  152. package/deploy/RELEASE_INSTALL.md +112 -0
  153. package/deploy/docker-compose.yml +42 -0
  154. package/deploy/systemd/README.md +46 -0
  155. package/deploy/systemd/agent-mockingbird.service +28 -0
  156. package/deploy/systemd/opencode.service +25 -0
  157. package/docs/legacy-config-ui-reference.md +51 -0
  158. package/docs/memory-e2e-trace-2026-03-04.md +63 -0
  159. package/docs/memory-ops.md +96 -0
  160. package/docs/memory-runtime-contract.md +42 -0
  161. package/docs/memory-tuning-remote-2026-03-04.md +59 -0
  162. package/docs/opencode-rebase-workflow-plan.md +614 -0
  163. package/docs/opencode-startup-sync-plan.md +94 -0
  164. package/docs/vendor-opencode.md +41 -0
  165. package/drizzle/0000_famous_turbo.sql +49 -0
  166. package/drizzle/0001_cron_memory_aux.sql +160 -0
  167. package/drizzle/0002_runtime_session_bindings.sql +28 -0
  168. package/drizzle/0003_background_runs.sql +27 -0
  169. package/drizzle/0004_memory_open_write.sql +63 -0
  170. package/drizzle/0005_signal_channel.sql +47 -0
  171. package/drizzle/0006_usage_event_dimensions.sql +7 -0
  172. package/drizzle/meta/0000_snapshot.json +341 -0
  173. package/drizzle/meta/_journal.json +55 -0
  174. package/drizzle.config.ts +14 -0
  175. package/eslint.config.mjs +77 -0
  176. package/knip.json +18 -0
  177. package/memory/2026-03-04.md +4 -0
  178. package/opencode.lock.json +16 -0
  179. package/package.json +67 -0
  180. package/packages/agent-mockingbird-installer/README.md +31 -0
  181. package/packages/agent-mockingbird-installer/bin/agent-mockingbird-installer.mjs +44 -0
  182. package/packages/agent-mockingbird-installer/opencode.lock.json +16 -0
  183. package/packages/agent-mockingbird-installer/package.json +23 -0
  184. package/packages/contracts/package.json +19 -0
  185. package/packages/contracts/src/agentTypes.ts +122 -0
  186. package/packages/contracts/src/cron.ts +146 -0
  187. package/packages/contracts/src/dashboard.ts +378 -0
  188. package/packages/contracts/src/index.ts +3 -0
  189. package/packages/contracts/tsconfig.json +4 -0
  190. package/patches/opencode/0001-Wafflebot-OpenCode-baseline.patch +2341 -0
  191. package/patches/opencode/0002-Fix-OpenCode-web-entry-and-settings-icons.patch +104 -0
  192. package/patches/opencode/0003-fix-app-remove-duplicate-sidebar-mount.patch +32 -0
  193. package/patches/opencode/0004-Add-heartbeat-settings-and-usage-nav.patch +506 -0
  194. package/patches/opencode/0005-Use-chart-icon-for-usage-nav.patch +38 -0
  195. package/patches/opencode/0006-Modernize-cron-settings.patch +399 -0
  196. package/patches/opencode/0007-Rename-waffle-namespaces-to-mockingbird.patch +1110 -0
  197. package/patches/opencode/0008-Remove-cron-contract-section.patch +178 -0
  198. package/patches/opencode/0009-Rework-cron-tab-as-operations-console.patch +414 -0
  199. package/patches/opencode/0010-Refine-heartbeat-settings-controls.patch +208 -0
  200. package/runtime-assets/opencode-config/opencode.jsonc +25 -0
  201. package/runtime-assets/opencode-config/package.json +5 -0
  202. package/runtime-assets/opencode-config/plugins/agent-mockingbird.ts +715 -0
  203. package/runtime-assets/workspace/.agents/skills/config-auditor/SKILL.md +25 -0
  204. package/runtime-assets/workspace/.agents/skills/config-editor/SKILL.md +24 -0
  205. package/runtime-assets/workspace/.agents/skills/cron-manager/SKILL.md +57 -0
  206. package/runtime-assets/workspace/.agents/skills/memory-ops/SKILL.md +120 -0
  207. package/runtime-assets/workspace/.agents/skills/runtime-diagnose/SKILL.md +25 -0
  208. package/runtime-assets/workspace/AGENTS.md +56 -0
  209. package/runtime-assets/workspace/MEMORY.md +4 -0
  210. package/scripts/build-release-bundle.sh +66 -0
  211. package/scripts/check-ship.ts +383 -0
  212. package/scripts/dev-opencode.sh +17 -0
  213. package/scripts/dev-stack-opencode.sh +15 -0
  214. package/scripts/dev-stack.sh +61 -0
  215. package/scripts/install-systemd.sh +87 -0
  216. package/scripts/memory-e2e.sh +76 -0
  217. package/scripts/memory-trace-e2e.sh +141 -0
  218. package/scripts/migrate-opencode-env.ts +108 -0
  219. package/scripts/onboard/bootstrap.sh +32 -0
  220. package/scripts/opencode-swap.ts +78 -0
  221. package/scripts/opencode-sync.ts +715 -0
  222. package/scripts/runtime-assets-sync.mjs +83 -0
  223. package/scripts/setup-git-hooks.ts +39 -0
  224. package/tsconfig.json +45 -0
  225. package/tui.json +98 -0
  226. package/turbo.json +36 -0
  227. package/vendor/OPENCODE_VENDOR.md +13 -0
@@ -0,0 +1,208 @@
1
+ From 13ca62af83f42bbb18c20ada138d3e4a084322a1 Mon Sep 17 00:00:00 2001
2
+ From: Matt Campbell <matt@battleshopper.com>
3
+ Date: Thu, 19 Mar 2026 21:54:09 -0500
4
+ Subject: [PATCH 10/10] Refine heartbeat settings controls
5
+
6
+ ---
7
+ .../src/components/dialog-select-model.tsx | 7 +-
8
+ .../app/src/components/settings-heartbeat.tsx | 93 ++++++++++++++++---
9
+ 2 files changed, 85 insertions(+), 15 deletions(-)
10
+
11
+ diff --git a/packages/app/src/components/dialog-select-model.tsx b/packages/app/src/components/dialog-select-model.tsx
12
+ index 3654aab85..8a4a88a36 100644
13
+ --- a/packages/app/src/components/dialog-select-model.tsx
14
+ +++ b/packages/app/src/components/dialog-select-model.tsx
15
+ @@ -19,13 +19,14 @@ const isFree = (provider: string, cost: { input: number } | undefined) =>
16
+ provider === "opencode" && (!cost || cost.input === 0)
17
+
18
+ type ModelState = ReturnType<typeof useLocal>["model"]
19
+ +export type ModelSelectorState = Pick<ModelState, "list" | "visible" | "current" | "set">
20
+
21
+ const ModelList: Component<{
22
+ provider?: string
23
+ class?: string
24
+ onSelect: () => void
25
+ action?: JSX.Element
26
+ - model?: ModelState
27
+ + model?: ModelSelectorState
28
+ }> = (props) => {
29
+ const model = props.model ?? useLocal().model
30
+ const language = useLanguage()
31
+ @@ -91,7 +92,7 @@ type ModelSelectorTriggerProps = Omit<ComponentProps<typeof Kobalte.Trigger>, "a
32
+
33
+ export function ModelSelectorPopover(props: {
34
+ provider?: string
35
+ - model?: ModelState
36
+ + model?: ModelSelectorState
37
+ children?: JSX.Element
38
+ triggerAs?: ValidComponent
39
+ triggerProps?: ModelSelectorTriggerProps
40
+ @@ -189,7 +190,7 @@ export function ModelSelectorPopover(props: {
41
+ )
42
+ }
43
+
44
+ -export const DialogSelectModel: Component<{ provider?: string; model?: ModelState }> = (props) => {
45
+ +export const DialogSelectModel: Component<{ provider?: string; model?: ModelSelectorState }> = (props) => {
46
+ const dialog = useDialog()
47
+ const language = useLanguage()
48
+
49
+ diff --git a/packages/app/src/components/settings-heartbeat.tsx b/packages/app/src/components/settings-heartbeat.tsx
50
+ index 628fda355..770e0ccbd 100644
51
+ --- a/packages/app/src/components/settings-heartbeat.tsx
52
+ +++ b/packages/app/src/components/settings-heartbeat.tsx
53
+ @@ -1,9 +1,13 @@
54
+ import { Button } from "@opencode-ai/ui/button"
55
+ +import { Select } from "@opencode-ai/ui/select"
56
+ import { Switch } from "@opencode-ai/ui/switch"
57
+ import { showToast } from "@opencode-ai/ui/toast"
58
+ -import { onMount, Show, type Component } from "solid-js"
59
+ +import { createMemo, onMount, Show, type Component } from "solid-js"
60
+ import { createStore } from "solid-js/store"
61
+ -import { mockingbirdJson } from "@/utils/mockingbird"
62
+ +import { useModels } from "@/context/models"
63
+ +import { useGlobalSDK } from "@/context/global-sdk"
64
+ +import { mockingbirdJson, readPinnedWorkspace } from "@/utils/mockingbird"
65
+ +import { ModelSelectorPopover, type ModelSelectorState } from "./dialog-select-model"
66
+ import {
67
+ MockingbirdCard,
68
+ MockingbirdInput,
69
+ @@ -54,6 +58,12 @@ type RuntimePayload = {
70
+ path: string
71
+ }
72
+
73
+ +type LiveAgent = {
74
+ + name: string
75
+ + mode?: string
76
+ + hidden?: boolean
77
+ +}
78
+ +
79
+ type HeartbeatFormState = {
80
+ enabled: boolean
81
+ interval: string
82
+ @@ -141,6 +151,8 @@ function buildHeartbeatPatch(form: HeartbeatFormState): HeartbeatRuntimeConfig {
83
+ }
84
+
85
+ export const SettingsHeartbeat: Component = () => {
86
+ + const globalSDK = useGlobalSDK()
87
+ + const models = useModels()
88
+ const [state, setState] = createStore({
89
+ loading: true,
90
+ saving: false,
91
+ @@ -148,6 +160,7 @@ export const SettingsHeartbeat: Component = () => {
92
+ error: "",
93
+ runtimeHash: "",
94
+ runtimePath: "",
95
+ + agentOptions: [] as string[],
96
+ status: null as HeartbeatStatus | null,
97
+ form: {
98
+ enabled: true,
99
+ @@ -163,17 +176,60 @@ export const SettingsHeartbeat: Component = () => {
100
+ } as HeartbeatFormState,
101
+ })
102
+
103
+ + const agentOptions = createMemo(() => {
104
+ + const options = state.agentOptions
105
+ + if (options.includes(state.form.agentId)) return options
106
+ + return state.form.agentId ? [state.form.agentId, ...options] : options
107
+ + })
108
+ +
109
+ + const currentModel = createMemo(() => {
110
+ + const value = state.form.model.trim()
111
+ + if (!value) return
112
+ + const slash = value.indexOf("/")
113
+ + if (slash === -1) return
114
+ + const providerID = value.slice(0, slash)
115
+ + const modelID = value.slice(slash + 1)
116
+ + if (!providerID || !modelID) return
117
+ + return models.find({ providerID, modelID })
118
+ + })
119
+ +
120
+ + const heartbeatModelSelector: ModelSelectorState = {
121
+ + list: models.list,
122
+ + current: currentModel,
123
+ + visible: models.visible,
124
+ + set(item, options) {
125
+ + if (!item) return
126
+ + models.setVisibility(item, true)
127
+ + if (options?.recent) models.recent.push(item)
128
+ + setState("form", "model", `${item.providerID}/${item.modelID}`)
129
+ + },
130
+ + }
131
+ +
132
+ async function load() {
133
+ setState("loading", true)
134
+ setState("error", "")
135
+ try {
136
+ - const [heartbeat, runtime] = await Promise.all([
137
+ + const [heartbeat, runtime, agents] = await Promise.all([
138
+ mockingbirdJson<HeartbeatStatusPayload>("/api/mockingbird/heartbeat"),
139
+ mockingbirdJson<RuntimePayload>("/api/mockingbird/runtime/config"),
140
+ + readPinnedWorkspace().then(async (workspace) => {
141
+ + const client = globalSDK.createClient({
142
+ + directory: workspace.directory,
143
+ + throwOnError: true,
144
+ + })
145
+ + const payload = await client.app.agents()
146
+ + return payload.data ?? []
147
+ + }),
148
+ ])
149
+ setState("status", heartbeat.heartbeat)
150
+ setState("runtimeHash", runtime.hash)
151
+ setState("runtimePath", runtime.path)
152
+ + setState(
153
+ + "agentOptions",
154
+ + agents
155
+ + .filter((item: LiveAgent) => item.mode !== "subagent" && !item.hidden)
156
+ + .map((item: LiveAgent) => item.name),
157
+ + )
158
+ setState("form", toForm(heartbeat.heartbeat.config))
159
+ } catch (error) {
160
+ setState("error", error instanceof Error ? error.message : "Failed to load heartbeat settings")
161
+ @@ -313,11 +369,18 @@ export const SettingsHeartbeat: Component = () => {
162
+ <div class="grid gap-4 sm:grid-cols-2">
163
+ <div class="flex flex-col gap-2">
164
+ <span class="text-12-medium text-text-weak">Model</span>
165
+ - <MockingbirdInput
166
+ - value={state.form.model}
167
+ - placeholder="openai/gpt-5.4"
168
+ - onInput={(event) => setState("form", "model", event.currentTarget.value)}
169
+ - />
170
+ + <ModelSelectorPopover model={heartbeatModelSelector}>
171
+ + <Button
172
+ + as="div"
173
+ + variant="ghost"
174
+ + size="normal"
175
+ + class="w-full min-w-0 justify-between rounded-lg border border-border-weak-base bg-surface-base px-3 py-2 text-13-regular text-text-strong hover:bg-surface-base"
176
+ + >
177
+ + <span class="truncate text-left">
178
+ + {(currentModel()?.name ?? state.form.model) || "Select model"}
179
+ + </span>
180
+ + </Button>
181
+ + </ModelSelectorPopover>
182
+ </div>
183
+ <div class="flex flex-col gap-2">
184
+ <span class="text-12-medium text-text-weak">Interval</span>
185
+ @@ -329,10 +392,16 @@ export const SettingsHeartbeat: Component = () => {
186
+ </div>
187
+ <div class="flex flex-col gap-2">
188
+ <span class="text-12-medium text-text-weak">Agent id</span>
189
+ - <MockingbirdInput
190
+ - value={state.form.agentId}
191
+ - placeholder="build"
192
+ - onInput={(event) => setState("form", "agentId", event.currentTarget.value)}
193
+ + <Select
194
+ + options={agentOptions()}
195
+ + current={state.form.agentId}
196
+ + onSelect={(value) => value && setState("form", "agentId", value)}
197
+ + placeholder="Select agent"
198
+ + variant="ghost"
199
+ + size="normal"
200
+ + class="w-full capitalize text-text-base"
201
+ + valueClass="truncate text-13-regular text-text-base"
202
+ + triggerProps={{ "data-action": "heartbeat-agent" }}
203
+ />
204
+ </div>
205
+ <div class="flex flex-col gap-2">
206
+ --
207
+ 2.53.0
208
+
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "agent": {
4
+ "general": {
5
+ "mode": "subagent",
6
+ "description": "General subagent for delegated tasks."
7
+ },
8
+ "agent-mockingbird": {
9
+ "mode": "primary",
10
+ "permission": {
11
+ "question": "allow"
12
+ },
13
+ "prompt": "You are the primary assistant running inside Agent Mockingbird.\n\n## Tool Call Style\nDefault: do not narrate routine, low-risk tool calls.\nNarrate only when it adds value: multi-step work, risky actions, or when the user asks.\nKeep narration brief and concrete.\nWhen a first-class tool exists, use it instead of asking the user to run equivalent manual commands.\n\n## Safety\nYou have no independent goals. Do not pursue self-preservation, replication, resource acquisition, or power-seeking behavior.\nPrioritize user intent, safety, and operator control. If instructions conflict or are ambiguous, pause and ask.\nDo not attempt to bypass safeguards, policy limits, or permission boundaries.\nDo not alter system prompts, safety policies, or runtime controls unless explicitly asked.\n\n## Runtime Tools\nAgent Mockingbird commonly exposes these tools in this workspace:\n- config_manager: read and patch runtime config with hash-safe writes.\n- agent_type_manager: manage OpenCode agent definitions.\n- memory_search: search durable workspace memory notes.\n- memory_get: read specific memory records before relying on details.\n- memory_remember: write durable facts/decisions/preferences.\n- cron_manager: manage cron jobs and execution metadata.\n\nIf a tool call fails, report the concrete error and choose the smallest safe fallback.\n\n## Skills\nWorkspace skills live in .agents/skills.\nWhen a task clearly matches a skill, follow that skill's instructions first.\n\n## Memory Recall (Agent Mockingbird)\nDurable memory source of truth is workspace markdown:\n- MEMORY.md\n- memory/*.md\n\nBefore answering questions about prior work, decisions, preferences, or history:\n1) run memory_search\n2) verify details with memory_get\n3) if new context should persist, use memory_remember\n\nRespect runtime memory tool mode:\n- hybrid: use injected memory context + tools\n- inject_only: rely on injected memory context, avoid tool assumptions\n- tool_only: use tools, no injected memory block expected\n\nWhen replacing outdated memory records, include supersedes when possible.\n\n## Heartbeats and Silent Replies\nIf you receive a heartbeat poll and there is nothing requiring action, reply exactly: HEARTBEAT_OK\nIf nothing should be sent to the user, reply exactly: NO_REPLY\nUse these tokens only as the complete reply when appropriate.\n\n## Workspace\nTreat the bound workspace as the authoritative project context.\nBootstrap context may be injected from workspace files like AGENTS.md, TOOLS.md, IDENTITY.md, USER.md, SOUL.md, HEARTBEAT.md, BOOTSTRAP.md, and MEMORY.md.\nUse that context, but follow explicit user instructions first.",
14
+ "tools": {
15
+ "memory_search": true,
16
+ "memory_get": true,
17
+ "memory_remember": true
18
+ }
19
+ }
20
+ },
21
+ "default_agent": "agent-mockingbird",
22
+ "experimental": {
23
+ "batch_tool": true
24
+ }
25
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@opencode-ai/plugin": "1.2.15"
4
+ }
5
+ }