@te-river/opencode-team-mode 1.5.15 → 1.6.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 (196) hide show
  1. package/README.md +853 -690
  2. package/README.zh-CN.md +761 -631
  3. package/dist/agents.d.ts +5 -3
  4. package/dist/agents.d.ts.map +1 -1
  5. package/dist/agents.js +19 -8
  6. package/dist/agents.js.map +1 -1
  7. package/dist/capabilities.d.ts +1 -1
  8. package/dist/capabilities.js +2 -2
  9. package/dist/capabilities.js.map +1 -1
  10. package/dist/host/note.d.ts +7 -0
  11. package/dist/host/note.d.ts.map +1 -0
  12. package/dist/host/note.js +28 -0
  13. package/dist/host/note.js.map +1 -0
  14. package/dist/host/v1.d.ts +14 -0
  15. package/dist/host/v1.d.ts.map +1 -0
  16. package/dist/host/v1.js +340 -0
  17. package/dist/host/v1.js.map +1 -0
  18. package/dist/host/v2-browser-gate.d.ts +45 -0
  19. package/dist/host/v2-browser-gate.d.ts.map +1 -0
  20. package/dist/host/v2-browser-gate.js +319 -0
  21. package/dist/host/v2-browser-gate.js.map +1 -0
  22. package/dist/host/v2-capabilities.d.ts +68 -0
  23. package/dist/host/v2-capabilities.d.ts.map +1 -0
  24. package/dist/host/v2-capabilities.js +146 -0
  25. package/dist/host/v2-capabilities.js.map +1 -0
  26. package/dist/host/v2-client.d.ts +53 -0
  27. package/dist/host/v2-client.d.ts.map +1 -0
  28. package/dist/host/v2-client.js +193 -0
  29. package/dist/host/v2-client.js.map +1 -0
  30. package/dist/host/v2-events.d.ts +56 -0
  31. package/dist/host/v2-events.d.ts.map +1 -0
  32. package/dist/host/v2-events.js +158 -0
  33. package/dist/host/v2-events.js.map +1 -0
  34. package/dist/host/v2-guard.d.ts +101 -0
  35. package/dist/host/v2-guard.d.ts.map +1 -0
  36. package/dist/host/v2-guard.js +199 -0
  37. package/dist/host/v2-guard.js.map +1 -0
  38. package/dist/host/v2-offload.d.ts +148 -0
  39. package/dist/host/v2-offload.d.ts.map +1 -0
  40. package/dist/host/v2-offload.js +288 -0
  41. package/dist/host/v2-offload.js.map +1 -0
  42. package/dist/host/v2-permissions.d.ts +123 -0
  43. package/dist/host/v2-permissions.d.ts.map +1 -0
  44. package/dist/host/v2-permissions.js +190 -0
  45. package/dist/host/v2-permissions.js.map +1 -0
  46. package/dist/host/v2-probe.d.ts +85 -0
  47. package/dist/host/v2-probe.d.ts.map +1 -0
  48. package/dist/host/v2-probe.js +268 -0
  49. package/dist/host/v2-probe.js.map +1 -0
  50. package/dist/host/v2-scope.d.ts +51 -0
  51. package/dist/host/v2-scope.d.ts.map +1 -0
  52. package/dist/host/v2-scope.js +58 -0
  53. package/dist/host/v2-scope.js.map +1 -0
  54. package/dist/host/v2-session-client.d.ts +74 -0
  55. package/dist/host/v2-session-client.d.ts.map +1 -0
  56. package/dist/host/v2-session-client.js +171 -0
  57. package/dist/host/v2-session-client.js.map +1 -0
  58. package/dist/host/v2-session.d.ts +85 -0
  59. package/dist/host/v2-session.d.ts.map +1 -0
  60. package/dist/host/v2-session.js +171 -0
  61. package/dist/host/v2-session.js.map +1 -0
  62. package/dist/host/v2-subagent.d.ts +157 -0
  63. package/dist/host/v2-subagent.d.ts.map +1 -0
  64. package/dist/host/v2-subagent.js +286 -0
  65. package/dist/host/v2-subagent.js.map +1 -0
  66. package/dist/host/v2-tool.d.ts +67 -0
  67. package/dist/host/v2-tool.d.ts.map +1 -0
  68. package/dist/host/v2-tool.js +209 -0
  69. package/dist/host/v2-tool.js.map +1 -0
  70. package/dist/host/v2-transcript.d.ts +73 -0
  71. package/dist/host/v2-transcript.d.ts.map +1 -0
  72. package/dist/host/v2-transcript.js +151 -0
  73. package/dist/host/v2-transcript.js.map +1 -0
  74. package/dist/host/v2-types.d.ts +229 -0
  75. package/dist/host/v2-types.d.ts.map +1 -0
  76. package/dist/host/v2-types.js +17 -0
  77. package/dist/host/v2-types.js.map +1 -0
  78. package/dist/host/v2.d.ts +42 -0
  79. package/dist/host/v2.d.ts.map +1 -0
  80. package/dist/host/v2.js +706 -0
  81. package/dist/host/v2.js.map +1 -0
  82. package/dist/host-hooks.d.ts +13 -2
  83. package/dist/host-hooks.d.ts.map +1 -1
  84. package/dist/host-hooks.js +18 -5
  85. package/dist/host-hooks.js.map +1 -1
  86. package/dist/index.d.ts +23 -17
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +29 -326
  89. package/dist/index.js.map +1 -1
  90. package/dist/prompts/lead.d.ts +1 -1
  91. package/dist/prompts/lead.d.ts.map +1 -1
  92. package/dist/prompts/lead.js +452 -359
  93. package/dist/prompts/lead.js.map +1 -1
  94. package/dist/prompts/shared.d.ts +2 -2
  95. package/dist/prompts/shared.d.ts.map +1 -1
  96. package/dist/prompts/shared.js +89 -17
  97. package/dist/prompts/shared.js.map +1 -1
  98. package/dist/prompts/specialists.d.ts +2 -2
  99. package/dist/prompts/specialists.d.ts.map +1 -1
  100. package/dist/prompts/specialists.js +44 -10
  101. package/dist/prompts/specialists.js.map +1 -1
  102. package/dist/task-offload.d.ts +83 -0
  103. package/dist/task-offload.d.ts.map +1 -0
  104. package/dist/task-offload.js +174 -0
  105. package/dist/task-offload.js.map +1 -0
  106. package/dist/tm/args-schema.d.ts +4 -0
  107. package/dist/tm/args-schema.d.ts.map +1 -1
  108. package/dist/tm/args-schema.js +36 -3
  109. package/dist/tm/args-schema.js.map +1 -1
  110. package/dist/tm/board.d.ts +113 -0
  111. package/dist/tm/board.d.ts.map +1 -0
  112. package/dist/tm/board.js +275 -0
  113. package/dist/tm/board.js.map +1 -0
  114. package/dist/tm/browser.d.ts +325 -6
  115. package/dist/tm/browser.d.ts.map +1 -1
  116. package/dist/tm/browser.js +1360 -135
  117. package/dist/tm/browser.js.map +1 -1
  118. package/dist/tm/config.d.ts +36 -25
  119. package/dist/tm/config.d.ts.map +1 -1
  120. package/dist/tm/config.js +29 -7
  121. package/dist/tm/config.js.map +1 -1
  122. package/dist/tm/dispatch.d.ts +133 -53
  123. package/dist/tm/dispatch.d.ts.map +1 -1
  124. package/dist/tm/dispatch.js +481 -279
  125. package/dist/tm/dispatch.js.map +1 -1
  126. package/dist/tm/dupe-guard.d.ts +16 -3
  127. package/dist/tm/dupe-guard.d.ts.map +1 -1
  128. package/dist/tm/dupe-guard.js +27 -7
  129. package/dist/tm/dupe-guard.js.map +1 -1
  130. package/dist/tm/egress.d.ts +44 -0
  131. package/dist/tm/egress.d.ts.map +1 -0
  132. package/dist/tm/egress.js +191 -0
  133. package/dist/tm/egress.js.map +1 -0
  134. package/dist/tm/guard.js +1 -1
  135. package/dist/tm/guard.js.map +1 -1
  136. package/dist/tm/index.d.ts +67 -2
  137. package/dist/tm/index.d.ts.map +1 -1
  138. package/dist/tm/index.js +228 -20
  139. package/dist/tm/index.js.map +1 -1
  140. package/dist/tm/ledger.d.ts +114 -0
  141. package/dist/tm/ledger.d.ts.map +1 -0
  142. package/dist/tm/ledger.js +308 -0
  143. package/dist/tm/ledger.js.map +1 -0
  144. package/dist/tm/perm-ask.d.ts +45 -5
  145. package/dist/tm/perm-ask.d.ts.map +1 -1
  146. package/dist/tm/perm-ask.js +107 -7
  147. package/dist/tm/perm-ask.js.map +1 -1
  148. package/dist/tm/pipelines.d.ts.map +1 -1
  149. package/dist/tm/pipelines.js +24 -2
  150. package/dist/tm/pipelines.js.map +1 -1
  151. package/dist/tm/preview.d.ts +55 -0
  152. package/dist/tm/preview.d.ts.map +1 -1
  153. package/dist/tm/preview.js +225 -0
  154. package/dist/tm/preview.js.map +1 -1
  155. package/dist/tm/ptc/tool.d.ts.map +1 -1
  156. package/dist/tm/ptc/tool.js +2 -4
  157. package/dist/tm/ptc/tool.js.map +1 -1
  158. package/dist/tm/pty.d.ts.map +1 -1
  159. package/dist/tm/pty.js +6 -3
  160. package/dist/tm/pty.js.map +1 -1
  161. package/dist/tm/search.d.ts +5 -0
  162. package/dist/tm/search.d.ts.map +1 -1
  163. package/dist/tm/search.js +40 -8
  164. package/dist/tm/search.js.map +1 -1
  165. package/dist/tm/serp-loop.d.ts +45 -0
  166. package/dist/tm/serp-loop.d.ts.map +1 -0
  167. package/dist/tm/serp-loop.js +80 -0
  168. package/dist/tm/serp-loop.js.map +1 -0
  169. package/dist/tm/stats.d.ts +26 -0
  170. package/dist/tm/stats.d.ts.map +1 -1
  171. package/dist/tm/stats.js +194 -4
  172. package/dist/tm/stats.js.map +1 -1
  173. package/dist/tm/webfetch.d.ts +56 -0
  174. package/dist/tm/webfetch.d.ts.map +1 -1
  175. package/dist/tm/webfetch.js +187 -19
  176. package/dist/tm/webfetch.js.map +1 -1
  177. package/dist/tool-coerce.d.ts +24 -0
  178. package/dist/tool-coerce.d.ts.map +1 -0
  179. package/dist/tool-coerce.js +63 -0
  180. package/dist/tool-coerce.js.map +1 -0
  181. package/dist/types.d.ts +7 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/docs/installation-v2.md +436 -0
  184. package/docs/installation.md +81 -2
  185. package/docs/research/agent-data-exchange.md +117 -0
  186. package/docs/research/browser-pane.md +89 -0
  187. package/docs/research/host-http-api.md +132 -0
  188. package/docs/research/host-subagent-injection.md +187 -0
  189. package/docs/research/plugin-loader-contract.md +261 -0
  190. package/docs/research/v2-builtin-tools.md +447 -0
  191. package/docs/v2-port-notes.md +315 -0
  192. package/index.js +7 -0
  193. package/package.json +4 -1
  194. package/scripts/gen-v2-config.mjs +304 -0
  195. package/scripts/lib/config-surgery.cjs +239 -0
  196. package/scripts/lib/fake-ctx.mjs +146 -0
@@ -0,0 +1,146 @@
1
+ // A fake OpenCode v2 plugin context for the adapter tests.
2
+ //
3
+ // There was no such thing before the v2 port: every existing suite builds a v1
4
+ // tool ctx as an inline literal ({directory, sessionID, agent, ask}), because
5
+ // v1 hands tools a plain object. v2 hands the PLUGIN a context of domains with
6
+ // transform()/hook() registrars, so testing the v2 personality needs a host
7
+ // double that records what was registered and can replay a hook.
8
+ //
9
+ // Deliberately faithful on the three points that matter:
10
+ // - transform(cb) runs the callback SYNCHRONOUSLY against a live editor and
11
+ // returns a disposable (a fake that defers would let a plugin pass tests
12
+ // against an API shape the host does not have);
13
+ // - hook callbacks are callable by the test so a hook body can be exercised
14
+ // with a real payload;
15
+ // - nothing here touches the filesystem or the network.
16
+
17
+ export function makeFakeCtx({
18
+ directory = process.cwd(),
19
+ options = {},
20
+ agents: seedAgents = [],
21
+ tools: seedTools = [],
22
+ sessionData = null,
23
+ } = {}) {
24
+ const registrations = []
25
+ const hooks = new Map()
26
+
27
+ const disposable = (label) => {
28
+ const rec = { label, disposed: false, dispose: async () => { rec.disposed = true } }
29
+ registrations.push(rec)
30
+ return rec
31
+ }
32
+
33
+ const toolMap = new Map()
34
+ for (const t of seedTools) toolMap.set(t.name ?? t.id, { ...t, id: t.id ?? t.name })
35
+ const toolEditor = {
36
+ list: () => [...toolMap.values()],
37
+ get: (id) => toolMap.get(id),
38
+ add: (tool) => { toolMap.set(tool.name, { ...tool, id: tool.name }) },
39
+ update: (id, fn) => { const cur = toolMap.get(id); if (cur) fn(cur) },
40
+ remove: (id) => { toolMap.delete(id) },
41
+ namespace: () => {},
42
+ }
43
+
44
+ const agentMap = new Map()
45
+ for (const a of seedAgents) agentMap.set(a.id, { ...a })
46
+ const agentEditor = {
47
+ list: () => [...agentMap.values()],
48
+ get: (id) => agentMap.get(id),
49
+ default: (id) => { agentEditor.__default = id },
50
+ update: (id, fn) => { const cur = agentMap.get(id); if (cur) fn(cur) },
51
+ remove: (id) => { agentMap.delete(id) },
52
+ }
53
+
54
+ const hookHandle = (domain, name) => {
55
+ const key = `${domain}.${name}`
56
+ const entry = hooks.get(key) ?? { key, calls: [], fire: async (input) => {
57
+ for (const cb of entry.handlers) await cb(input)
58
+ return input
59
+ }, handlers: [] }
60
+ hooks.set(key, entry)
61
+ return entry
62
+ }
63
+
64
+ const mkHook = (domain) => async (name, callback) => {
65
+ hookHandle(domain, name).handlers.push(callback)
66
+ return disposable(`${domain}.hook(${name})`)
67
+ }
68
+
69
+ const warnLines = []
70
+ const errorLines = []
71
+
72
+ return {
73
+ ctx: {
74
+ location: { directory, project: { directory } },
75
+ options,
76
+ tool: {
77
+ transform: async (cb) => { cb(toolEditor); return disposable("tool.transform") },
78
+ list: async () => [...toolMap.values()],
79
+ hook: mkHook("tool"),
80
+ reload: async () => {},
81
+ },
82
+ agent: {
83
+ transform: async (cb) => { cb(agentEditor); return disposable("agent.transform") },
84
+ list: async () => [...agentMap.values()],
85
+ },
86
+ permission: { hook: mkHook("permission"), list: async () => [], get: async () => ({}), reply: async () => ({}) },
87
+ // `session.get` / `session.context` exist ONLY when a test seeds them, because a fake
88
+ // that always answers would let a plugin pass while the real host refuses — and the
89
+ // shapes below are the ones measured on 2.0.18 (`get` → {id,parentID,…}, `context` →
90
+ // an array of {id,time,text,type}), not a guess. See src/host/v2-transcript.ts.
91
+ session: sessionData
92
+ ? {
93
+ hook: mkHook("session"),
94
+ async get({ sessionID } = {}) {
95
+ const s = sessionData.sessions?.[sessionID]
96
+ if (!s) throw new Error(`Session not found: ${sessionID}`)
97
+ return { id: sessionID, ...s }
98
+ },
99
+ async context({ sessionID } = {}) {
100
+ return sessionData.messages?.[sessionID] ?? []
101
+ },
102
+ }
103
+ : { hook: mkHook("session") },
104
+ shell: { hook: mkHook("shell") },
105
+ storage: {
106
+ _map: new Map(),
107
+ async get(k) { return this._map.get(k) },
108
+ async set(k, v) { this._map.set(k, v) },
109
+ async remove(k) { this._map.delete(k) },
110
+ async scan() { return { entries: [] } },
111
+ },
112
+ event: { subscribe: () => ({ async [Symbol.asyncIterator]() { return { done: true, value: undefined } } }) },
113
+ app: { name: "opencode-fake", version: "2.0.16", channel: "test" },
114
+ },
115
+ /** Introspection for assertions. */
116
+ registrations,
117
+ tools: toolEditor,
118
+ agents: agentEditor,
119
+ /** Introspection for assertions. Only the FIRST dot separates the domain
120
+ * from the hook name — `tool.execute.before` is domain "tool" + hook
121
+ * "execute.before", and splitting on every dot would look up a key that
122
+ * nothing ever registered, so a working hook would read as an absent one. */
123
+ hook: (name) => {
124
+ const [domain, ...rest] = name.split(".")
125
+ return hookHandle(domain, rest.join("."))
126
+ },
127
+ hookNames: () => [...hooks.keys()],
128
+ consoleWarn: warnLines,
129
+ consoleError: errorLines,
130
+ }
131
+ }
132
+
133
+ /** Capture what the personality logs during setup — a v2 plugin has no toast,
134
+ * so the server log IS the user-visible channel for these gaps. */
135
+ export function withCapturedConsole(fn) {
136
+ const warns = []
137
+ const errors = []
138
+ const w = console.warn
139
+ const e = console.error
140
+ console.warn = (...a) => { warns.push(a.join(" ")) }
141
+ console.error = (...a) => { errors.push(a.join(" ")) }
142
+ return Promise.resolve()
143
+ .then(fn)
144
+ .finally(() => { console.warn = w; console.error = e })
145
+ .then((value) => ({ value, warns, errors }))
146
+ }