omp-onlyne 0.0.0-stage → 0.2.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.
@@ -0,0 +1,438 @@
1
+ import { createTranslator } from "@onlyne/node-host/i18n";
2
+
3
+ /**
4
+ * Every string the judge model or the calling model reads from the decider. Choice keys,
5
+ * question ids and cue lists are identifiers, not prose, and stay untranslated.
6
+ */
7
+ const en = {
8
+ "judge.o1.instructions":
9
+ "Choose the one action the model's message asks for. communicate: deliver a message, reply or progress note to another agent. inspect: look up local or network state. manage_thread: create, close, describe or change members of a local thread. manage_domain: manage this node's domain membership. operate_resource: operate a resource the message names explicitly.",
10
+ "judge.o1.communicate": "The message is meant for another agent or node: delivering, replying, asking, reporting, or starting a new task or topic with one. Work another agent should carry out is this intent even when the action sounds physical (deploy, archive, clean up).",
11
+ "judge.o1.inspect":
12
+ "The message asks to see node-level state: who is online, the neighbors or contacts list, the inbox, a thread's messages, one message, or delivery evidence. Listing or reading any of these is inspect. The thread registry and a thread's members are not this.",
13
+ "judge.o1.manage_thread":
14
+ "The message works on threads themselves: list the threads, describe one thread's members, create, close, add or remove a member. Reading a thread's messages is inspect. Starting a new task or conversation with a peer is communicate, not this.",
15
+ "judge.o1.manage_domain":
16
+ "The message changes or reads this node's domain membership: join, leave, list or describe the membership, or discover a domain's members.",
17
+ "judge.o1.operate_resource":
18
+ "meta.resource names an external resource to operate. Without meta.resource this intent cannot execute, so a message that merely mentions a directory or a file is not this.",
19
+
20
+ "judge.relation.instructions":
21
+ "The message references an earlier message. Is it a final reply or a progress supplement?",
22
+ "judge.relation.reply": "A final answer that may release the original sender's wait.",
23
+ "judge.relation.followup": "A supplement or progress note that does not release a wait. A courtesy acknowledgement of a message that asked for nothing (收到、感谢同步) is this, or a plain new message — not a reply that releases an expectation nobody holds.",
24
+
25
+ "judge.target.instructions":
26
+ "Choose the node that should receive this message. Each candidate is named by its node id; the alias is its short name. none: no candidate is named or implied by this call — refusing beats a random guess.",
27
+ "judge.target.peer":
28
+ "Discovered peer {node} at {base_url} (instance {instance}, last seen {last_seen}).",
29
+ "judge.target.none":
30
+ "No candidate is named or implied by this call; sending would be a guess.",
31
+
32
+ "judge.response.instructions":
33
+ "Two facts decide: does the receiver have to act, and can the sender continue without the answer?",
34
+ "judge.response.none": "The receiver need not act at all: a notice, a status update, '不用回'.",
35
+ "judge.response.async":
36
+ "The receiver must act, but the sender keeps working and picks the answer up later: a background dispatch, a supplement to running work, '有空再做', '结果稍后贴我'.",
37
+ "judge.response.await":
38
+ "The receiver must act and the sender's next step cannot start without the answer: it is blocked on a question, a number it must have, or a conclusion it ships (等你回、数完回我、我要据此发版).",
39
+
40
+ "judge.execution.instructions":
41
+ "Should the receiver handle this in one of its published execution contexts or in a new one?",
42
+ "judge.execution.existing.reply":
43
+ "The message continues work the receiver already knows from the referenced message.",
44
+ "judge.execution.existing.new":
45
+ "The message belongs to work already running in one of the target's published contexts.",
46
+ "judge.execution.new": "The message starts independent work and needs a new context the receiver creates.",
47
+
48
+ "judge.context.instructions":
49
+ "Choose the execution context the target should continue in, or none when this message does not continue one.",
50
+ "judge.context.published": "{summary} ({state})",
51
+ "judge.context.none":
52
+ "The message does not continue any published context and starts fresh work instead.",
53
+
54
+ "judge.inbound.instructions":
55
+ "Choose where this inbound message is handled. main_agent: the main session takes it — a message that needs no answer and is not a self-contained work item always lands here, however clearly it says no follow-up is wanted. A context alias: the named execution context continues the work it was created for. new_subagent: fresh independent work in a new subagent.",
56
+ "judge.inbound.main_agent": "The message needs an answer, or no registered context's work matches it.",
57
+ "judge.inbound.context": "{summary} (state: {state}, agent: {agent})",
58
+ "judge.inbound.context_same_thread":
59
+ "{summary} (state: {state}, agent: {agent}, same thread as this message)",
60
+ "judge.inbound.new_subagent":
61
+ "The message is a self-contained work item with its own background, and needs no answer. A status note, greeting, relay or summary is not this.",
62
+
63
+ "judge.needs_answer.instructions":
64
+ "Does the sender expect this node to answer? A reference to an earlier message does not by itself create that expectation, and a message that explicitly says no reply is needed (不用回、不用发给我、报告直接入库即可) is always no, however much work it requests.",
65
+ "judge.needs_answer.yes":
66
+ "The sender asks a question, greets and waits for an answer, requests work whose result must be reported back, or otherwise needs a reply from this node. plan.response await or async is consistent with this.",
67
+ "judge.needs_answer.no":
68
+ "The sender expects nothing back: it completes a reply this node asked for, reports status, records a fact, or explicitly says no reply is needed. plan.response none is consistent with this.",
69
+
70
+ "judge.insertion.instructions":
71
+ "The message goes to the main session. Choose when it should enter the agent's work.",
72
+ "judge.insertion.steer":
73
+ "Inject immediately after the current tool call: an urgent correction the running work must follow before it continues.",
74
+ "judge.insertion.follow_up":
75
+ "Add when the current turn finishes and start a new turn: the session is expected to act on it, answer it, or use its result.",
76
+ "judge.insertion.fragment":
77
+ "Record without starting a turn and expect nothing back: status syncs, log asides, version records and environment facts that say no action is needed (状态同步、日志旁路、版本记录、暂时不用管).",
78
+
79
+ "judge.todo.action.instructions": "Decide what this message should do to the session's todo list.",
80
+ "judge.todo.action.none":
81
+ "The message needs no persistent work item: it is informational, duplicate, or already covered.",
82
+ "judge.todo.action.associate": "The message continues or supplements an existing item.",
83
+ "judge.todo.action.append":
84
+ "The message needs a new persistent work item that no existing item covers.",
85
+ "judge.todo.associate.instructions": "Choose the existing todo item this message continues.",
86
+ "judge.todo.associate.item": "An existing todo item.",
87
+ "judge.todo.title.instructions": "Choose the title for the new item from the message's own text.",
88
+ "judge.todo.title.item": "A title taken from the message.",
89
+ "judge.todo.explanation.instructions":
90
+ "Choose the explanation for the new item from the message's own text, or none to leave it unwritten.",
91
+ "judge.todo.explanation.item": "An explanation taken from the message.",
92
+ "judge.todo.explanation.none": "Leave the explanation unwritten.",
93
+
94
+ "judge.read_scope.instructions": "Choose what this message asks to read.",
95
+ "judge.read_scope.peers":
96
+ "The nodes that are online and reachable: 'who is online', 'which nodes can I reach', 'list the nodes', 'show the participants', the contact list, or the neighbour/adjacency view.",
97
+ "judge.read_scope.inbox": "The attention items waiting to be processed.",
98
+ "judge.read_scope.messages": "The message history inside one thread.",
99
+ "judge.read_scope.evidence": "This node's delivery and receipt evidence for one outbound message.",
100
+ "judge.read_scope.resources":
101
+ "Resource inventory, binding, description, event log, events, operation history or operation status. meta.op names the query, default list.",
102
+ "judge.read_scope.none": "The message asks to read none of these channels.",
103
+
104
+ "judge.thread.instructions": "Choose the local thread the message asks about.",
105
+ "judge.thread.item": "{title} ({owner}/{id}, {state})",
106
+
107
+ "judge.thread_op.instructions": "Choose the local thread operation the message asks for.",
108
+ "judge.thread_op.create": "Create a new local thread.",
109
+ "judge.thread_op.close": "Close an existing local thread.",
110
+ "judge.thread_op.list": "List the local threads.",
111
+ "judge.thread_op.describe": "Describe one local thread.",
112
+ "judge.thread_op.member_add": "Add a member to a local thread.",
113
+ "judge.thread_op.member_remove": "Remove a member from a local thread.",
114
+
115
+ "judge.domain_op.instructions": "Choose the domain operation the message asks for.",
116
+ "judge.domain_op.create": "Create this node's domain membership.",
117
+ "judge.domain_op.join": "Join a domain.",
118
+ "judge.domain_op.leave": "Leave the current domain.",
119
+ "judge.domain_op.list": "List this node's domain membership.",
120
+ "judge.domain_op.describe": "Describe this node's membership.",
121
+ "judge.domain_op.discover": "Discover a domain's declared members.",
122
+
123
+ "judge.original.instructions":
124
+ "This call states neither an in_reply_to reference nor a relation. Decide whether it answers one of the listed inbound messages — records this context can see that nobody has answered yet — or starts a new message. Decide from what the call is for; recency or being the only candidate never makes a call an answer.",
125
+ "judge.original.new": "Not an answer to any of them; a new message on its own topic.",
126
+ "judge.original.candidate": "Answer the inbound message from {from} ({kind}) at thread {thread} seq {seq}: {body}",
127
+
128
+ "error.outbound_intent": "The decision did not choose an outbound intent.",
129
+ "error.relation_needs_reference": "A relation needs an in_reply_to reference.",
130
+ "error.reply_authority":
131
+ "The reply must go to its original reply authority {authority}, not {target}.",
132
+ "error.reply_reference_conflict":
133
+ "The referenced message id belongs to {actual}, not to the sender you named ({named}). Answer that message, or name its sender.",
134
+ "error.delivery_target": "The decision did not choose a delivery target.",
135
+ "error.execution_context_missing":
136
+ '{to} publishes no execution context this message continues. Send it with execution "new" to start one.',
137
+ "error.reply_relation": "The decision did not choose a reply relation.",
138
+ "error.target_unresolved": "The target cannot be resolved: {reason}",
139
+ "error.no_receiver": "No discovered node can receive this message.",
140
+ "error.target_not_published":
141
+ "The decision named {chosen}, which discovery does not publish.",
142
+ "error.response_mode": "The judge did not choose a valid response mode.",
143
+ "error.execution_mode": "The judge did not choose a valid execution mode.",
144
+ "error.meta_mode": "meta.{key} must be await, async, none, existing or new.",
145
+ "error.contexts_unreadable": "The target's published contexts cannot be read: {reason}",
146
+ "error.context_not_published": "The target does not publish an execution context named {alias}.",
147
+ "error.thread_reference_shape": "meta.thread must be a thread alias or {owner,id}.",
148
+ "error.ambiguous_local_thread": "More than one local thread is named {value}.",
149
+ "error.routing_target": "The decision did not choose a routing target.",
150
+ "error.needs_answer": "The decision did not say whether this message needs an answer.",
151
+ "error.registry_unreadable": "The context registry could not be read: {error}",
152
+ "error.context_lost": "{alias} is no longer bound; it needs an explicit new decision",
153
+ "error.insertion_mode": "The decision did not choose an insertion mode.",
154
+ "error.todo_associate":
155
+ "The decision chose to associate without naming an existing todo item.",
156
+ "error.todo_append":
157
+ "The decision chose to append without naming one of the message's title candidates.",
158
+ "error.todo_action": "The decision did not choose a todo action.",
159
+ "error.state_budget":
160
+ "The decision state needs {chars} characters; the judge prompt is capped near {cap}.",
161
+ "error.judge_failed":
162
+ "The judge role could not decide this Onlyne message: {error}",
163
+ "error.thread_title_required": "thread create needs a title.",
164
+ "error.thread_reference_required": "thread {op} needs a thread reference.",
165
+ "error.thread_target_required": "thread {op} needs a target.",
166
+ "error.resource_fields": "resource needs owner, id and operation.",
167
+ "error.read_thread_required": "read {name} needs a thread reference.",
168
+ "error.read_message_required":
169
+ "read {name} needs a message reference: meta.message {sender,id} or {thread,seq}.",
170
+ "error.resources_main_only": "Resource reads belong to the main OMP session.",
171
+ "error.resource_host_unavailable": "The resource query host is unavailable.",
172
+ "error.read_scope_missing":
173
+ "The decision named no read scope; the readable channels are peers, inbox, messages and evidence.",
174
+ "error.read_scope_unknown":
175
+ "No readable channel exists for {scope}; the readable channels are peers, inbox, messages and evidence.",
176
+ "error.no_local_thread": "This node has no local thread to name.",
177
+ "error.local_thread_choice": "The decision did not choose a local thread.",
178
+ "error.thread_op": "The judge did not choose a thread operation.",
179
+ "error.thread_op_target": "The judge chose thread {op} without a target.",
180
+ "error.domain_op": "The judge did not choose a domain operation.",
181
+ "error.domain_id": "domain {op} needs domain_id.",
182
+ "error.resource_action_fields":
183
+ "A resource action needs meta.resource {owner,id} and meta.operation.",
184
+ "error.meta_to_single":
185
+ "meta.to names one target; pass an array to the tool for several, or send one call per peer.",
186
+ "error.meta_to_empty": "meta.to must be a non-empty string.",
187
+ "error.alias_ambiguous": "The alias {alias} names more than one node: {matches}.",
188
+ "error.alias_not_found": "No discovered node is named {alias}.",
189
+ "error.mentions_array": "meta.mentions must be an array.",
190
+ "error.mention_empty": "Each mention must be a non-empty string.",
191
+ "error.in_reply_to_object": "meta.in_reply_to must be an object.",
192
+ "error.in_reply_to_shape": "meta.in_reply_to needs {thread,seq} or {sender,id}.",
193
+ "error.in_reply_to_seq": "meta.in_reply_to.seq must be a string or a number.",
194
+ "error.message_not_found": "No message at {thread}/{seq}.",
195
+ "error.message_thread_conflict":
196
+ "meta.thread names {thread} but meta.message names {embedded}; a message read names one thread.",
197
+ "error.guard_write":
198
+ "A subagent session reads Onlyne state, it does not write it. Read your own slice through onlyne://threads, onlyne://inbox and onlyne://contexts, then return the result so the main agent can send it.",
199
+ "error.guard_node_listing":
200
+ "A subagent reads its own slice through onlyne://threads and onlyne://inbox; the whole node listing belongs to the main session.",
201
+ "error.guard_evidence":
202
+ "A subagent may read outbound evidence only for a message its own context received.",
203
+ "error.guard_message": "A subagent may read one message only when its own context received it.",
204
+ "error.guard_thread_required":
205
+ "A subagent may read only a thread its own context record authorizes.",
206
+ "error.guard_no_slice": "This subagent holds no read slice for thread {thread}.",
207
+ "error.ambiguous_thread": "More than one thread is named {alias}.",
208
+ "error.thread_not_found": "No local thread is named {alias}.",
209
+ "error.page_size": "meta.page_size must be an integer from 1 to 100.",
210
+ "error.attention": "meta.attention must be inbox or thread.",
211
+ "error.relation_value": "meta.relation must be reply or followup.",
212
+
213
+ "reason.registry_unreadable": "The context registry could not be read: {error}",
214
+ "reason.discovery_unreadable": "Discovery records could not be read: {error}",
215
+ "reason.receiver_contexts_unreadable":
216
+ "The target's published contexts could not be read: {error}",
217
+ "reason.todo_no_data": "The newest todo-more snapshot has no readable data.",
218
+ "reason.todo_no_phases": "The newest todo-more snapshot has no phase list.",
219
+ "reason.todo_absent": "No todo-more snapshot is on the active branch.",
220
+ "reason.todo_missing": "No todo snapshot was provided.",
221
+ "reason.todo_not_object": "The todo snapshot is not an object.",
222
+ "reason.todo_source_absent": "The todo source is absent.",
223
+ "reason.todo_phases_missing": "The todo snapshot has no phase list.",
224
+ "reason.todo_phase_invalid": "A todo phase has no readable name or item list.",
225
+ "reason.todo_item_title_missing": "A todo item has no readable title.",
226
+
227
+ "prose.cut": "… [{more} more characters]",
228
+ "prose.image_omitted": "omitted: image bytes are not decision input",
229
+ };
230
+
231
+ const zh: Record<keyof typeof en, string> = {
232
+ "judge.o1.instructions":
233
+ "选择模型这条消息要求执行的那一个动作。communicate:向另一个 agent 投递消息、回复或进度说明。inspect:查询本地或网络状态。manage_thread:创建、关闭、描述本地 thread 或变更其成员。manage_domain:管理本节点的域成员身份。operate_resource:操作消息明确点名的资源。",
234
+ "judge.o1.communicate": "这条消息是发给另一个 agent 或节点的:投递、回复、提问、汇报,或与对端开启一项新任务、新话题。交给另一个 agent 去做的操作也属此类,即使动作听起来像物理操作(部署、归档、清理)。",
235
+ "judge.o1.inspect":
236
+ "这条消息要求查看节点级状态:谁在线、邻居或联系人列表、inbox、某个 thread 的消息、单条消息或投递凭据。列出或读取其中任何一项都属 inspect。thread 注册表和某个 thread 的成员不属于此。",
237
+ "judge.o1.manage_thread":
238
+ "这条消息作用于 thread 本身:列出 thread、描述某个 thread 的成员、创建、关闭、添加或移除成员。读取 thread 内的消息属于 inspect。与对端开启一项新任务或新对话属于 communicate,不属于此。",
239
+ "judge.o1.manage_domain":
240
+ "这条消息改变或读取本节点的域成员身份:加入、离开、列出或描述成员身份,或发现某个域的成员。",
241
+ "judge.o1.operate_resource":
242
+ "meta.resource 点名了一个要操作的外部资源。没有 meta.resource 时该意图无法执行,因此只是提到某个目录或文件的消息不属于此。",
243
+
244
+ "judge.relation.instructions": "这条消息引用了更早的一条消息。它是最终回复还是进度补充?",
245
+ "judge.relation.reply": "一个最终答复,可以解除原发送方的等待。",
246
+ "judge.relation.followup": "一个补充或进度说明,不解除任何等待。对并未索取回答的消息致意确认(收到、感谢同步)属此,或干脆作为新消息——而不是解除无人持有的等待的 reply。",
247
+
248
+ "judge.original.instructions":
249
+ "这次调用既没有 in_reply_to 引用,也没有 relation。请判断它是否在回答下面列出的某条入站消息(本上下文可见、且尚无人答复的记录),还是一条独立的新消息。按调用的目的判断;最新或唯一候选本身不能说明它就是回答。",
250
+ "judge.original.new": "都不是;这是一条独立话题的新消息。",
251
+ "judge.original.candidate": "回答来自 {from} 的入站消息({kind}),位于 thread {thread} seq {seq}:{body}",
252
+
253
+ "judge.target.instructions":
254
+ "选择应当接收这条消息的节点。每个候选以其 node id 命名,alias 是它的短名。none:这次调用没有点名或暗示任何候选——宁可拒绝也不随机猜测。",
255
+ "judge.target.peer":
256
+ "已发现的 peer {node},位于 {base_url}(实例 {instance},最后出现于 {last_seen})。",
257
+ "judge.target.none":
258
+ "这次调用没有点名或暗示任何候选;强行发送只是猜测。",
259
+
260
+ "judge.response.instructions":
261
+ "两个事实决定:接收方是否必须动手,以及发送方能否在没有答复的情况下继续。",
262
+ "judge.response.none": "接收方完全不必动手:通知、状态更新、'不用回'。",
263
+ "judge.response.async":
264
+ "接收方必须动手,但发送方继续工作、稍后再取答复:后台派活、对进行中工作的补充、'有空再做'、'结果稍后贴我'。",
265
+ "judge.response.await":
266
+ "接收方必须动手,且没有答复发送方的下一步就无法开始:卡在一个问题上、必须拿到的数字上,或要据此交付的结论上(等你回、数完回我、我要据此发版)。",
267
+
268
+ "judge.execution.instructions":
269
+ "接收方应当在其已发布的某个执行上下文中处理这条消息,还是新建一个?",
270
+ "judge.execution.existing.reply": "这条消息延续接收方从被引用消息中已经知道的工作。",
271
+ "judge.execution.existing.new": "这条消息属于目标已发布的某个上下文中正在进行的工作。",
272
+ "judge.execution.new": "这条消息开启独立工作,需要一个由接收方新建的上下文。",
273
+
274
+ "judge.context.instructions":
275
+ "选择目标应当延续的执行上下文;当这条消息不延续任何上下文时选 none。",
276
+ "judge.context.published": "{summary}({state})",
277
+ "judge.context.none": "这条消息不延续任何已发布的上下文,而是开启新工作。",
278
+
279
+ "judge.inbound.instructions":
280
+ "选择这条入站消息在哪里处理。main_agent:由主会话处理——不需要答复、也不是自成一体工作项的消息一律落在这里,无论它把「不用后续处理」说得多明确。上下文别名:由该执行上下文延续它当初被创建来处理的工作。new_subagent:在新的 subagent 中处理独立的新工作。",
281
+ "judge.inbound.main_agent": "这条消息需要答复,或没有任何已注册上下文的工作与之匹配。",
282
+ "judge.inbound.context": "{summary}(state: {state}, agent: {agent})",
283
+ "judge.inbound.context_same_thread":
284
+ "{summary}(state: {state}, agent: {agent},与本消息同一 thread)",
285
+ "judge.inbound.new_subagent":
286
+ "这条消息是一个自带背景、自成一体的工作项,且无需答复。状态说明、问候、转达或汇总不属于此。",
287
+
288
+ "judge.needs_answer.instructions":
289
+ "发送方是否期待本节点答复?仅引用更早的消息本身并不构成这种期待;明说不必回复(不用回、不用发给我、报告直接入库即可)的消息,无论请求多少工作,一律为 no。",
290
+ "judge.needs_answer.yes":
291
+ "发送方提出问题、问候并等待答复、请求必须回报结果的工作,或以其他方式需要本节点回复。plan.response 为 await 或 async 与此一致。",
292
+ "judge.needs_answer.no":
293
+ "发送方不期待任何回应:它在完成本节点先前请求的回复、报告状态、记录事实,或明说不必回复。plan.response 为 none 与此一致。",
294
+
295
+ "judge.insertion.instructions":
296
+ "这条消息要进入主会话。选择它应当在何时进入 agent 的工作。",
297
+ "judge.insertion.steer": "在当前工具调用之后立即注入:运行中的工作必须先遵循的紧急修正。",
298
+ "judge.insertion.follow_up":
299
+ "在当前轮次结束后加入并开启新一轮:会话预期要据此行动、答复或使用其结果。",
300
+ "judge.insertion.fragment":
301
+ "只记录、不开启轮次,也不期待任何回应:状态同步、日志旁路、版本记录和无需动作的环境事实(如状态同步、日志旁路、版本记录、暂时不用管)。",
302
+
303
+ "judge.todo.action.instructions": "判断这条消息应当对会话的 todo 列表做什么。",
304
+ "judge.todo.action.none": "这条消息不需要持久工作项:它只是信息、重复内容,或已被覆盖。",
305
+ "judge.todo.action.associate": "这条消息延续或补充一个已有的工作项。",
306
+ "judge.todo.action.append": "这条消息需要一个现有工作项都未覆盖的新持久工作项。",
307
+ "judge.todo.associate.instructions": "选择这条消息延续的那个已有 todo 项。",
308
+ "judge.todo.associate.item": "一个已有的 todo 项。",
309
+ "judge.todo.title.instructions": "从消息自身的文本中选择新项的标题。",
310
+ "judge.todo.title.item": "取自消息的标题。",
311
+ "judge.todo.explanation.instructions":
312
+ "从消息自身的文本中选择新项的说明,或选 none 不写说明。",
313
+ "judge.todo.explanation.item": "取自消息的说明。",
314
+ "judge.todo.explanation.none": "不写说明。",
315
+
316
+ "judge.read_scope.instructions": "选择这条消息要求读取的内容。",
317
+ "judge.read_scope.peers":
318
+ "在线且可达的节点:'谁在线'、'我能连到哪些节点'、'列出节点'、'显示参与者'、联系人列表,或邻居/邻接视图。",
319
+ "judge.read_scope.inbox": "等待处理的注意项。",
320
+ "judge.read_scope.messages": "某个 thread 内的消息历史。",
321
+ "judge.read_scope.evidence": "本节点对某条出站消息的投递与回执凭据。",
322
+ "judge.read_scope.resources":
323
+ "资源清单、绑定、描述、事件日志、事件、操作历史或操作状态。meta.op 指定查询,默认 list。",
324
+ "judge.read_scope.none": "这条消息不要求读取以上任何通道。",
325
+
326
+ "judge.thread.instructions": "选择消息所指的本地 thread。",
327
+ "judge.thread.item": "{title}({owner}/{id},{state})",
328
+
329
+ "judge.thread_op.instructions": "选择消息要求的本地 thread 操作。",
330
+ "judge.thread_op.create": "创建一个新的本地 thread。",
331
+ "judge.thread_op.close": "关闭一个已有的本地 thread。",
332
+ "judge.thread_op.list": "列出本地 thread。",
333
+ "judge.thread_op.describe": "描述一个本地 thread。",
334
+ "judge.thread_op.member_add": "向本地 thread 添加成员。",
335
+ "judge.thread_op.member_remove": "从本地 thread 移除成员。",
336
+
337
+ "judge.domain_op.instructions": "选择消息要求的域操作。",
338
+ "judge.domain_op.create": "创建本节点的域成员身份。",
339
+ "judge.domain_op.join": "加入一个域。",
340
+ "judge.domain_op.leave": "离开当前域。",
341
+ "judge.domain_op.list": "列出本节点的域成员身份。",
342
+ "judge.domain_op.describe": "描述本节点的成员身份。",
343
+ "judge.domain_op.discover": "发现某个域声明的成员。",
344
+
345
+ "error.outbound_intent": "决策没有选择出站意图。",
346
+ "error.relation_needs_reference": "relation 需要 in_reply_to 引用。",
347
+ "error.reply_authority": "回复必须发往其原始回复权威 {authority},而不是 {target}。",
348
+ "error.reply_reference_conflict":
349
+ "引用的消息 id 属于 {actual},而不是你指名的发送方({named})。请回答那条消息,或改用它的发送方。",
350
+ "error.delivery_target": "决策没有选择投递目标。",
351
+ "error.execution_context_missing":
352
+ '{to} 未发布这条消息所延续的执行上下文。要以 execution "new" 发送以新建一个。',
353
+ "error.reply_relation": "决策没有选择回复关系。",
354
+ "error.target_unresolved": "无法解析目标:{reason}",
355
+ "error.no_receiver": "没有已发现的节点可以接收这条消息。",
356
+ "error.target_not_published": "决策指定了 {chosen},但发现记录中没有发布它。",
357
+ "error.response_mode": "judge 没有选择有效的 response 模式。",
358
+ "error.execution_mode": "judge 没有选择有效的 execution 模式。",
359
+ "error.meta_mode": "meta.{key} 必须是 await、async、none、existing 或 new。",
360
+ "error.contexts_unreadable": "无法读取目标已发布的上下文:{reason}",
361
+ "error.context_not_published": "目标未发布名为 {alias} 的执行上下文。",
362
+ "error.thread_reference_shape": "meta.thread 必须是 thread 别名或 {owner,id}。",
363
+ "error.ambiguous_local_thread": "有多个本地 thread 名为 {value}。",
364
+ "error.routing_target": "决策没有选择路由目标。",
365
+ "error.needs_answer": "决策没有说明这条消息是否需要答复。",
366
+ "error.registry_unreadable": "无法读取上下文注册表:{error}",
367
+ "error.context_lost": "{alias} 已不再绑定;需要一次显式的新决策",
368
+ "error.insertion_mode": "决策没有选择插入模式。",
369
+ "error.todo_associate": "决策选择了关联,却没有点名已有的 todo 项。",
370
+ "error.todo_append": "决策选择了追加,却没有从消息的标题候选中点名一个。",
371
+ "error.todo_action": "决策没有选择 todo 动作。",
372
+ "error.state_budget": "决策状态需要 {chars} 个字符;judge prompt 的上限约为 {cap}。",
373
+ "error.judge_failed": "judge 角色无法裁决这条 Onlyne 消息:{error}",
374
+ "error.thread_title_required": "thread create 需要一个 title。",
375
+ "error.thread_reference_required": "thread {op} 需要一个 thread 引用。",
376
+ "error.thread_target_required": "thread {op} 需要一个目标。",
377
+ "error.resource_fields": "resource 需要 owner、id 和 operation。",
378
+ "error.read_thread_required": "read {name} 需要一个 thread 引用。",
379
+ "error.read_message_required":
380
+ "read {name} 需要一条消息引用:meta.message {sender,id} 或 {thread,seq}。",
381
+ "error.resources_main_only": "资源读取属于主 OMP 会话。",
382
+ "error.resource_host_unavailable": "资源查询宿主不可用。",
383
+ "error.read_scope_missing":
384
+ "决策没有点名读取范围;可读通道为 peers、inbox、messages 和 evidence。",
385
+ "error.read_scope_unknown":
386
+ "不存在 {scope} 对应的可读通道;可读通道为 peers、inbox、messages 和 evidence。",
387
+ "error.no_local_thread": "本节点没有可点名的本地 thread。",
388
+ "error.local_thread_choice": "决策没有选择本地 thread。",
389
+ "error.thread_op": "judge 没有选择 thread 操作。",
390
+ "error.thread_op_target": "judge 选择了 thread {op},但没有目标。",
391
+ "error.domain_op": "judge 没有选择域操作。",
392
+ "error.domain_id": "domain {op} 需要 domain_id。",
393
+ "error.resource_action_fields": "资源动作需要 meta.resource {owner,id} 和 meta.operation。",
394
+ "error.meta_to_single":
395
+ "meta.to 只能点名一个目标;要发给多个,请向工具传数组,或每个 peer 发一次调用。",
396
+ "error.meta_to_empty": "meta.to 必须是非空字符串。",
397
+ "error.alias_ambiguous": "别名 {alias} 指向多个节点:{matches}。",
398
+ "error.alias_not_found": "没有已发现的节点名为 {alias}。",
399
+ "error.mentions_array": "meta.mentions 必须是数组。",
400
+ "error.mention_empty": "每个 mention 必须是非空字符串。",
401
+ "error.in_reply_to_object": "meta.in_reply_to 必须是对象。",
402
+ "error.in_reply_to_shape": "meta.in_reply_to 需要 {thread,seq} 或 {sender,id}。",
403
+ "error.in_reply_to_seq": "meta.in_reply_to.seq 必须是字符串或数字。",
404
+ "error.message_not_found": "{thread}/{seq} 处没有消息。",
405
+ "error.message_thread_conflict":
406
+ "meta.thread 指定 {thread},而 meta.message 指定 {embedded};一次消息读取只能指定一个 thread。",
407
+ "error.guard_write":
408
+ "subagent 会话只读取 Onlyne 状态,不写入。请通过 onlyne://threads、onlyne://inbox 和 onlyne://contexts 读取你自己的分片,然后返回结果由主 agent 发送。",
409
+ "error.guard_node_listing":
410
+ "subagent 通过 onlyne://threads 和 onlyne://inbox 读取自己的分片;整节点的列表属于主会话。",
411
+ "error.guard_evidence": "subagent 只能读取其自身上下文收到的消息的出站凭据。",
412
+ "error.guard_message": "只有自身上下文收到过某条消息时,subagent 才能读取该消息。",
413
+ "error.guard_thread_required": "subagent 只能读取其自身上下文记录授权的 thread。",
414
+ "error.guard_no_slice": "该 subagent 没有 thread {thread} 的读取分片。",
415
+ "error.ambiguous_thread": "有多个 thread 名为 {alias}。",
416
+ "error.thread_not_found": "没有名为 {alias} 的本地 thread。",
417
+ "error.page_size": "meta.page_size 必须是 1 到 100 的整数。",
418
+ "error.attention": "meta.attention 必须是 inbox 或 thread。",
419
+ "error.relation_value": "meta.relation 必须是 reply 或 followup。",
420
+
421
+ "reason.registry_unreadable": "无法读取上下文注册表:{error}",
422
+ "reason.discovery_unreadable": "无法读取发现记录:{error}",
423
+ "reason.receiver_contexts_unreadable": "无法读取目标已发布的上下文:{error}",
424
+ "reason.todo_no_data": "最新的 todo-more 快照没有可读数据。",
425
+ "reason.todo_no_phases": "最新的 todo-more 快照没有阶段列表。",
426
+ "reason.todo_absent": "活动分支上没有 todo-more 快照。",
427
+ "reason.todo_missing": "没有提供 todo 快照。",
428
+ "reason.todo_not_object": "todo 快照不是对象。",
429
+ "reason.todo_source_absent": "todo 来源不存在。",
430
+ "reason.todo_phases_missing": "todo 快照没有阶段列表。",
431
+ "reason.todo_phase_invalid": "某个 todo 阶段没有可读的名称或条目列表。",
432
+ "reason.todo_item_title_missing": "某个 todo 条目没有可读的标题。",
433
+
434
+ "prose.cut": "… [另有 {more} 个字符]",
435
+ "prose.image_omitted": "已省略:图像字节不是决策输入",
436
+ };
437
+
438
+ export const text = createTranslator({ en, "zh-CN": zh });