@ycodium-ai/plugin-team 0.2.3060 → 0.2.3072
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.
- package/assets/ui.js +21 -11
- package/dist/index.js +115 -22
- package/locales/en.json +29 -3
- package/locales/zh-CN.json +29 -3
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -6776,19 +6776,29 @@ function toCodecJsonBase(ast, recur) {
|
|
|
6776
6776
|
var MEMBER_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
6777
6777
|
var MAX_NAME_LENGTH = 40;
|
|
6778
6778
|
var MAX_MEMBERS = 8;
|
|
6779
|
-
var TeamMember = Struct({
|
|
6779
|
+
var TeamMember = Struct({
|
|
6780
|
+
memberId: String4,
|
|
6781
|
+
name: String4,
|
|
6782
|
+
principal: optionalKey2(
|
|
6783
|
+
Struct({ kind: Literal2("remote-agent"), principalId: String4 })
|
|
6784
|
+
)
|
|
6785
|
+
});
|
|
6780
6786
|
var RosterRuleCode = Literals([
|
|
6781
6787
|
"member-count",
|
|
6782
6788
|
"invalid-member-id",
|
|
6783
6789
|
"invalid-name",
|
|
6784
6790
|
"duplicate-member-id",
|
|
6785
6791
|
"duplicate-name",
|
|
6786
|
-
"lead-not-member"
|
|
6792
|
+
"lead-not-member",
|
|
6793
|
+
"lead-remote",
|
|
6794
|
+
"duplicate-principal",
|
|
6795
|
+
"invalid-principal"
|
|
6787
6796
|
]);
|
|
6788
6797
|
function rosterRuleError(input) {
|
|
6789
6798
|
if (input.members.length < 1 || input.members.length > MAX_MEMBERS) return "member-count";
|
|
6790
6799
|
const ids = /* @__PURE__ */ new Set();
|
|
6791
6800
|
const names = /* @__PURE__ */ new Set();
|
|
6801
|
+
const principals = /* @__PURE__ */ new Set();
|
|
6792
6802
|
for (const member of input.members) {
|
|
6793
6803
|
if (!MEMBER_ID_PATTERN.test(member.memberId)) return "invalid-member-id";
|
|
6794
6804
|
const name = member.name.trim();
|
|
@@ -6796,6 +6806,13 @@ function rosterRuleError(input) {
|
|
|
6796
6806
|
if (ids.has(member.memberId)) return "duplicate-member-id";
|
|
6797
6807
|
const foldedName = name.toLowerCase();
|
|
6798
6808
|
if (names.has(foldedName)) return "duplicate-name";
|
|
6809
|
+
if (member.principal !== void 0) {
|
|
6810
|
+
const { principalId } = member.principal;
|
|
6811
|
+
if (principalId.trim().length === 0) return "invalid-principal";
|
|
6812
|
+
if (principals.has(principalId)) return "duplicate-principal";
|
|
6813
|
+
principals.add(principalId);
|
|
6814
|
+
if (member.memberId === input.leadMemberId) return "lead-remote";
|
|
6815
|
+
}
|
|
6799
6816
|
ids.add(member.memberId);
|
|
6800
6817
|
names.add(foldedName);
|
|
6801
6818
|
}
|
|
@@ -6848,19 +6865,31 @@ var factTime = () => runPromise2(nowIso);
|
|
|
6848
6865
|
var PERSON_MESSAGE_RULE = "Send a message to the person only when you need their answer; put progress and updates in work item comments with work_post_comment instead.";
|
|
6849
6866
|
var tableCell = (value) => value.replace(/\|/g, "\\|").replace(/[\r\n]/g, " ");
|
|
6850
6867
|
function leadBrief(goal, roster) {
|
|
6851
|
-
const
|
|
6868
|
+
const localMembers = goal.threads.filter((thread) => thread.memberId !== goal.leadMemberId).map((thread) => {
|
|
6852
6869
|
const name = roster.members.find((member) => member.memberId === thread.memberId)?.name ?? thread.memberId;
|
|
6853
6870
|
return `| ${tableCell(name)} | ${tableCell(thread.threadId)} |`;
|
|
6854
6871
|
});
|
|
6872
|
+
const remoteMembers = (goal.remoteMembers ?? []).map((member) => {
|
|
6873
|
+
const name = roster.members.find((row) => row.memberId === member.memberId)?.name ?? member.memberId;
|
|
6874
|
+
return `| ${tableCell(name)} | remote-agent: ${tableCell(member.principalId)} |`;
|
|
6875
|
+
});
|
|
6855
6876
|
return [
|
|
6856
6877
|
"You are the lead of this project's team. Your goal is:",
|
|
6857
6878
|
goal.goal,
|
|
6858
|
-
"Team members and their
|
|
6859
|
-
[
|
|
6879
|
+
"Team members and their assignment identities (your own conversation is omitted):",
|
|
6880
|
+
[
|
|
6881
|
+
"| Member | threadId / remote principalId |",
|
|
6882
|
+
"| --- | --- |",
|
|
6883
|
+
...localMembers,
|
|
6884
|
+
...remoteMembers
|
|
6885
|
+
].join("\n"),
|
|
6860
6886
|
"Use work_create_item to split the goal into a few work items: one item per task, with a clear action in the title and the deliverable in the description. Create them without assignees.",
|
|
6861
6887
|
'Then use work_add_relation with type "blocked_by" to record dependencies: the dependent workItemId is blocked by the prerequisite relatedWorkItemId.',
|
|
6862
6888
|
"If a work item for this goal is assigned to you, also record it as blocked by every item you create. When they are all done you will be told; then check the results and mark that item done with work_update_item.",
|
|
6863
|
-
`Only after all dependencies are recorded, assign each item to exactly one member
|
|
6889
|
+
`Only after all dependencies are recorded, assign each item to exactly one member with work_update_item. For local members use assignees: [{ "kind": "agent", "threadId": "<threadId from the table>" }]. A local member is told about an item as soon as it is assigned, so assigning before the dependencies exist starts blocked work early. Do not do members' tasks yourself.`,
|
|
6890
|
+
...remoteMembers.length === 0 ? [] : [
|
|
6891
|
+
'Remote members are on another machine. To give them work, assign the work item to them with work_update_item and assignees: [{ "kind": "remote-agent", "principalId": "<principalId from the table>" }]; they pick it up from their own machine. Do not create conversations, start turns, or send wake-up signals for them on this machine.'
|
|
6892
|
+
],
|
|
6864
6893
|
"Use work_list_items to check progress. When all work is complete, summarize the results here in one or two sentences.",
|
|
6865
6894
|
PERSON_MESSAGE_RULE,
|
|
6866
6895
|
"If the work item tools are unavailable, tell the user directly that this project needs the board and project memory switches turned on first."
|
|
@@ -6880,6 +6909,9 @@ var TeamGoal = Struct({
|
|
|
6880
6909
|
goal: String4.check(isMinLength(1), isMaxLength(GOAL_MAX_LENGTH)),
|
|
6881
6910
|
leadMemberId: String4,
|
|
6882
6911
|
threads: ArraySchema(Struct({ memberId: String4, threadId: String4 })),
|
|
6912
|
+
remoteMembers: optionalKey2(
|
|
6913
|
+
ArraySchema(Struct({ memberId: String4, principalId: String4 }))
|
|
6914
|
+
),
|
|
6883
6915
|
startedAt: String4
|
|
6884
6916
|
});
|
|
6885
6917
|
var teamThreadId = (projectId, goalId, memberId) => memberId === null ? `team-lead:${projectId}:${goalId}` : `team-member:${projectId}:${goalId}:${memberId}`;
|
|
@@ -6892,7 +6924,8 @@ var ReadGoalResult = NullOr(
|
|
|
6892
6924
|
Struct({
|
|
6893
6925
|
memberId: String4,
|
|
6894
6926
|
name: NullOr(String4),
|
|
6895
|
-
threadId: String4
|
|
6927
|
+
threadId: optionalKey2(String4),
|
|
6928
|
+
principalId: optionalKey2(String4)
|
|
6896
6929
|
})
|
|
6897
6930
|
)
|
|
6898
6931
|
})
|
|
@@ -6956,9 +6989,9 @@ function createGoalService(ctx, rosterService, options = {}) {
|
|
|
6956
6989
|
const roster = await rosterService.read(projectId);
|
|
6957
6990
|
return {
|
|
6958
6991
|
...goal,
|
|
6959
|
-
members: goal.threads.map((
|
|
6960
|
-
...
|
|
6961
|
-
name: roster?.members.find((
|
|
6992
|
+
members: [...goal.threads, ...goal.remoteMembers ?? []].map((member) => ({
|
|
6993
|
+
...member,
|
|
6994
|
+
name: roster?.members.find((row) => row.memberId === member.memberId)?.name ?? null
|
|
6962
6995
|
}))
|
|
6963
6996
|
};
|
|
6964
6997
|
};
|
|
@@ -6973,15 +7006,19 @@ function createGoalService(ctx, rosterService, options = {}) {
|
|
|
6973
7006
|
if (roster === null) return rejectGoal("no-roster");
|
|
6974
7007
|
const key = requestKey(input.projectId, input.requestId);
|
|
6975
7008
|
const leadThreadId = teamThreadId(input.projectId, input.requestId, null);
|
|
7009
|
+
const remoteMembers = roster.members.flatMap(
|
|
7010
|
+
(member) => member.principal === void 0 ? [] : [{ memberId: member.memberId, principalId: member.principal.principalId }]
|
|
7011
|
+
);
|
|
6976
7012
|
let goal = readFact(await requests.get(), key) ?? {
|
|
6977
7013
|
projectId: input.projectId,
|
|
6978
7014
|
goalId: input.requestId,
|
|
6979
7015
|
goal: text,
|
|
6980
7016
|
leadMemberId: roster.leadMemberId,
|
|
6981
|
-
threads: roster.members.map((member) => ({
|
|
7017
|
+
threads: roster.members.filter((member) => member.principal === void 0).map((member) => ({
|
|
6982
7018
|
memberId: member.memberId,
|
|
6983
7019
|
threadId: member.memberId === roster.leadMemberId ? leadThreadId : teamThreadId(input.projectId, input.requestId, member.memberId)
|
|
6984
7020
|
})),
|
|
7021
|
+
...remoteMembers.length === 0 ? {} : { remoteMembers },
|
|
6985
7022
|
startedAt: await now3()
|
|
6986
7023
|
};
|
|
6987
7024
|
const receipt = await ctx.events.append({
|
|
@@ -7156,6 +7193,7 @@ var BoardState = Struct({
|
|
|
7156
7193
|
});
|
|
7157
7194
|
var WorkIdentity = Struct({
|
|
7158
7195
|
kind: String4,
|
|
7196
|
+
principalId: optionalKey2(String4),
|
|
7159
7197
|
threadId: optionalKey2(String4),
|
|
7160
7198
|
pluginId: optionalKey2(String4),
|
|
7161
7199
|
/** 人的稳定键(见 personKey),界面拿它到快照的人名表里找名字。 */
|
|
@@ -7164,11 +7202,27 @@ var WorkIdentity = Struct({
|
|
|
7164
7202
|
var personKey = (principal) => principal.kind === "account" ? `account:${principal.userId}` : `local-owner:${principal.environmentId}`;
|
|
7165
7203
|
var workIdentity = (value) => ({
|
|
7166
7204
|
kind: value.kind,
|
|
7205
|
+
...value.principalId === void 0 ? {} : { principalId: value.principalId },
|
|
7167
7206
|
...value.threadId === void 0 ? {} : { threadId: value.threadId },
|
|
7168
7207
|
...value.pluginId === void 0 ? {} : { pluginId: value.pluginId },
|
|
7169
7208
|
...value.principal === void 0 ? {} : { personKey: personKey(value.principal) }
|
|
7170
7209
|
});
|
|
7171
7210
|
var BoardPerson = Struct({ key: String4, displayName: String4 });
|
|
7211
|
+
var BoardRemoteAgent = Struct({
|
|
7212
|
+
principalId: String4,
|
|
7213
|
+
label: String4,
|
|
7214
|
+
state: Literals(["active", "disabled", "revoked"]),
|
|
7215
|
+
lastUsedAt: optionalKey2(String4)
|
|
7216
|
+
});
|
|
7217
|
+
var BoardRemoteWork = Struct({
|
|
7218
|
+
principalId: String4,
|
|
7219
|
+
pending: NullOr(
|
|
7220
|
+
Struct({
|
|
7221
|
+
count: Number5,
|
|
7222
|
+
items: ArraySchema(Struct({ workItemId: String4, blocked: Boolean2 }))
|
|
7223
|
+
})
|
|
7224
|
+
)
|
|
7225
|
+
});
|
|
7172
7226
|
var BoardItem = Struct({
|
|
7173
7227
|
workItemId: String4,
|
|
7174
7228
|
sequenceId: Number5,
|
|
@@ -7184,6 +7238,12 @@ var BoardSnapshot = Struct({
|
|
|
7184
7238
|
// 当前目标与 goal 命令同一份形状;目标栏与看板都从这里读,同一个门铃刷新。
|
|
7185
7239
|
goal: ReadGoalResult,
|
|
7186
7240
|
people: ArraySchema(BoardPerson),
|
|
7241
|
+
// 已保存名单里的成员;名字显示(含远端成员)读这里,名单编辑器的草稿另存。
|
|
7242
|
+
rosterMembers: ArraySchema(TeamMember),
|
|
7243
|
+
remoteAgents: ArraySchema(BoardRemoteAgent),
|
|
7244
|
+
remoteAgentsUnavailable: optionalKey2(Literal2(true)),
|
|
7245
|
+
remoteWork: ArraySchema(BoardRemoteWork),
|
|
7246
|
+
viewerKey: optionalKey2(String4),
|
|
7187
7247
|
// 负责人要用看板与项目记忆两组工具;开关由宿主控件拨,这里只读来提示。
|
|
7188
7248
|
toolkits: Struct({ board: Boolean2, memory: Boolean2 }),
|
|
7189
7249
|
truncated: Boolean2
|
|
@@ -7222,6 +7282,7 @@ var UpdateItemResult = Union2([
|
|
|
7222
7282
|
// src/board.ts
|
|
7223
7283
|
var ITEM_LIMIT = 500;
|
|
7224
7284
|
var PEOPLE_LIMIT = 200;
|
|
7285
|
+
var REMOTE_AGENT_LIMIT = 1e3;
|
|
7225
7286
|
var decodeRead = decodeUnknownSync(ReadBoardInput);
|
|
7226
7287
|
var decodeCreate = decodeUnknownOption2(CreateItemInput);
|
|
7227
7288
|
var decodeUpdate = decodeUnknownOption2(UpdateItemInput);
|
|
@@ -7241,7 +7302,7 @@ var WORK_EVENTS = [
|
|
|
7241
7302
|
"board.toolkit-set",
|
|
7242
7303
|
"memory.toolkit-set"
|
|
7243
7304
|
];
|
|
7244
|
-
function registerBoardCommands(ctx, goals, options = {}) {
|
|
7305
|
+
function registerBoardCommands(ctx, goals, rosters, options = {}) {
|
|
7245
7306
|
const after = options.after ?? ((delay2, notify) => {
|
|
7246
7307
|
const timer = NodeTimers.setTimeout(notify, delay2);
|
|
7247
7308
|
return () => NodeTimers.clearTimeout(timer);
|
|
@@ -7251,20 +7312,38 @@ function registerBoardCommands(ctx, goals, options = {}) {
|
|
|
7251
7312
|
name: "board",
|
|
7252
7313
|
scope: "read",
|
|
7253
7314
|
payloadSchema: payloadSchemaOf(ReadBoardInput),
|
|
7254
|
-
handle: async (payload) => {
|
|
7315
|
+
handle: async (payload, invocation) => {
|
|
7255
7316
|
const { projectId } = decodeRead(payload);
|
|
7256
|
-
const [stateList, goal, toolkitStates, people] = await Promise.all([
|
|
7317
|
+
const [stateList, goal, roster, toolkitStates, people, remoteAgents, viewer] = await Promise.all([
|
|
7257
7318
|
ctx.work.states.list({ projectId }),
|
|
7258
7319
|
goals.read(projectId),
|
|
7320
|
+
// 已保存的名单随 team/roster-set 门铃一起刷新;看板上的名字只认这一份,不认编辑器里的草稿。
|
|
7321
|
+
rosters.read(projectId),
|
|
7259
7322
|
ctx.projects.toolkits.get({ projectId }),
|
|
7260
7323
|
// 人名只用来显示作者;本机所有者排第一,后面是这个项目认识的账号。
|
|
7261
|
-
readPages(PEOPLE_LIMIT, (page) => ctx.communication.people.list({ projectId, ...page }))
|
|
7324
|
+
readPages(PEOPLE_LIMIT, (page) => ctx.communication.people.list({ projectId, ...page })),
|
|
7325
|
+
// 主体目录只用于名字与选择器;任何一页读失败都退回空目录,不连累看板。
|
|
7326
|
+
readPages(
|
|
7327
|
+
REMOTE_AGENT_LIMIT,
|
|
7328
|
+
(page) => ctx.auth.remoteAgents.list({ projectId, ...page })
|
|
7329
|
+
).catch(() => null),
|
|
7330
|
+
// 认出当前读者只为把作者显示成「你」:读不出来就当没有,不连累整张看板。
|
|
7331
|
+
invocation.viewer?.communication.people.current({}).catch(() => null)
|
|
7332
|
+
]);
|
|
7333
|
+
const [remoteWork, { items: rows, truncated }] = await Promise.all([
|
|
7334
|
+
Promise.all(
|
|
7335
|
+
(roster?.members ?? []).flatMap(
|
|
7336
|
+
(member) => member.principal === void 0 ? [] : [
|
|
7337
|
+
ctx.work.remoteAgentPending.get({ projectId, principalId: member.principal.principalId }).then(
|
|
7338
|
+
({ work }) => ({ count: work.count, items: work.items }),
|
|
7339
|
+
() => null
|
|
7340
|
+
).then((pending) => ({ principalId: member.principal.principalId, pending }))
|
|
7341
|
+
]
|
|
7342
|
+
)
|
|
7343
|
+
),
|
|
7344
|
+
readPages(ITEM_LIMIT, (page) => ctx.work.items.list({ projectId, ...page }))
|
|
7262
7345
|
]);
|
|
7263
7346
|
const enabled = (toolkit) => toolkitStates.toolkits.some((row) => row.toolkit === toolkit && row.enabled);
|
|
7264
|
-
const { items: rows, truncated } = await readPages(
|
|
7265
|
-
ITEM_LIMIT,
|
|
7266
|
-
(page) => ctx.work.items.list({ projectId, ...page })
|
|
7267
|
-
);
|
|
7268
7347
|
const items = rows.map((item) => ({
|
|
7269
7348
|
workItemId: item.workItemId,
|
|
7270
7349
|
sequenceId: item.sequenceId,
|
|
@@ -7287,6 +7366,19 @@ function registerBoardCommands(ctx, goals, options = {}) {
|
|
|
7287
7366
|
key: personKey(row.person),
|
|
7288
7367
|
displayName: row.displayName
|
|
7289
7368
|
})),
|
|
7369
|
+
rosterMembers: roster?.members ?? [],
|
|
7370
|
+
// 读不出来时记一笔,添加菜单要说「读不出来」而不是「还没有」。
|
|
7371
|
+
...remoteAgents === null ? { remoteAgentsUnavailable: true } : {},
|
|
7372
|
+
remoteAgents: (remoteAgents?.items ?? []).map(
|
|
7373
|
+
({ principalId, label, state, lastUsedAt }) => ({
|
|
7374
|
+
principalId,
|
|
7375
|
+
label,
|
|
7376
|
+
state,
|
|
7377
|
+
...lastUsedAt === void 0 ? {} : { lastUsedAt }
|
|
7378
|
+
})
|
|
7379
|
+
),
|
|
7380
|
+
remoteWork,
|
|
7381
|
+
...viewer?.person == null ? {} : { viewerKey: personKey(viewer.person) },
|
|
7290
7382
|
toolkits: { board: enabled("board"), memory: enabled("memory") },
|
|
7291
7383
|
truncated
|
|
7292
7384
|
};
|
|
@@ -7728,7 +7820,8 @@ var decodeEnvelope2 = decodeUnknownOption2(
|
|
|
7728
7820
|
);
|
|
7729
7821
|
var Principal = Union2([
|
|
7730
7822
|
Struct({ kind: Literal2("human") }),
|
|
7731
|
-
Struct({ kind: Literal2("agent"), threadId: String4 })
|
|
7823
|
+
Struct({ kind: Literal2("agent"), threadId: String4 }),
|
|
7824
|
+
Struct({ kind: Literal2("remote-agent"), principalId: String4 })
|
|
7732
7825
|
]);
|
|
7733
7826
|
var Actor = Union2([
|
|
7734
7827
|
Principal,
|
|
@@ -8042,13 +8135,13 @@ function startWakeRuntime(ctx, options = {}) {
|
|
|
8042
8135
|
// src/index.ts
|
|
8043
8136
|
var index_default = definePlugin({
|
|
8044
8137
|
id: "team",
|
|
8045
|
-
apiVersion:
|
|
8138
|
+
apiVersion: 12,
|
|
8046
8139
|
activate(ctx) {
|
|
8047
8140
|
const rosters = createRosterService(ctx);
|
|
8048
8141
|
registerRosterCommands(ctx, rosters);
|
|
8049
8142
|
const goals = createGoalService(ctx, rosters);
|
|
8050
8143
|
registerGoalCommands(ctx, goals);
|
|
8051
|
-
registerBoardCommands(ctx, goals);
|
|
8144
|
+
registerBoardCommands(ctx, goals, rosters);
|
|
8052
8145
|
registerDetailCommands(ctx);
|
|
8053
8146
|
startWakeRuntime(ctx);
|
|
8054
8147
|
}
|
package/locales/en.json
CHANGED
|
@@ -66,12 +66,14 @@
|
|
|
66
66
|
"reload": "Reload details",
|
|
67
67
|
"notFound": "This work item was not found in this project.",
|
|
68
68
|
"actor": {
|
|
69
|
+
"you": "You",
|
|
69
70
|
"human": "A person",
|
|
70
71
|
"otherAgent": "Other agent",
|
|
71
72
|
"team": "Teams plugin",
|
|
72
73
|
"plugin": "Plugin {{pluginId}}",
|
|
73
74
|
"localCli": "Local command line",
|
|
74
|
-
"system": "System"
|
|
75
|
+
"system": "System",
|
|
76
|
+
"remoteAgentFallback": "Remote agent"
|
|
75
77
|
},
|
|
76
78
|
"history": {
|
|
77
79
|
"title": "Activity history",
|
|
@@ -113,7 +115,8 @@
|
|
|
113
115
|
"invalidGoal": "The goal must be 1–4000 characters after trimming spaces.",
|
|
114
116
|
"invalidRequestId": "The request ID must be 1–64 letters, numbers, underscores, or hyphens.",
|
|
115
117
|
"loadFailed": "The current goal could not be loaded. Try reloading it.",
|
|
116
|
-
"startFailed": "The goal could not be fully started. Retry to finish creating the threads and sending the lead's brief."
|
|
118
|
+
"startFailed": "The goal could not be fully started. Retry to finish creating the threads and sending the lead's brief.",
|
|
119
|
+
"remoteMembers": "Remote members:"
|
|
117
120
|
},
|
|
118
121
|
"roster": {
|
|
119
122
|
"title": "Roster",
|
|
@@ -123,6 +126,9 @@
|
|
|
123
126
|
"leadFor": "Make member {{number}} the lead",
|
|
124
127
|
"remove": "Remove member {{number}}",
|
|
125
128
|
"add": "Add member",
|
|
129
|
+
"addRemoteAgent": "Add remote agent",
|
|
130
|
+
"noRemoteAgents": "There are no available remote agents on this machine yet.",
|
|
131
|
+
"remote": "Remote",
|
|
126
132
|
"save": "Save",
|
|
127
133
|
"saving": "Saving…",
|
|
128
134
|
"saved": "Roster saved",
|
|
@@ -142,6 +148,26 @@
|
|
|
142
148
|
"invalidName": "Member names must be 1–40 characters after trimming spaces.",
|
|
143
149
|
"duplicateMemberId": "Each member needs a different ID.",
|
|
144
150
|
"duplicateName": "Member names must be different, ignoring capitalization and surrounding spaces.",
|
|
145
|
-
"leadNotMember": "Choose a lead from the members."
|
|
151
|
+
"leadNotMember": "Choose a lead from the members.",
|
|
152
|
+
"leadRemote": "The lead must be a local member.",
|
|
153
|
+
"duplicatePrincipal": "Each remote agent can appear only once in the roster.",
|
|
154
|
+
"invalidPrincipal": "A remote agent must have a non-empty principal ID.",
|
|
155
|
+
"allRemoteAgentsAdded": "All available remote agents are already on the roster.",
|
|
156
|
+
"remoteAgentsUnavailable": "Could not read the remote agents on this machine. Try again later.",
|
|
157
|
+
"remoteSource": "Remote agent: {{label}}"
|
|
158
|
+
},
|
|
159
|
+
"remoteStatus": {
|
|
160
|
+
"title": "Remote members",
|
|
161
|
+
"none": "No remote members on the roster. Add one with “Add remote agent” in the roster.",
|
|
162
|
+
"lastSeen": "Last seen {{time}}",
|
|
163
|
+
"neverSeen": "Not seen yet",
|
|
164
|
+
"workUnavailable": "Could not read this member's work. Try again later.",
|
|
165
|
+
"noWork": "No work assigned.",
|
|
166
|
+
"item": "#{{number}} {{title}}",
|
|
167
|
+
"disabled": "Disabled",
|
|
168
|
+
"revoked": "No active credentials",
|
|
169
|
+
"lastSeenUnavailable": "Could not read when it was last seen",
|
|
170
|
+
"blocked": "Blocked",
|
|
171
|
+
"more": "{{count}} more not listed here"
|
|
146
172
|
}
|
|
147
173
|
}
|
package/locales/zh-CN.json
CHANGED
|
@@ -66,12 +66,14 @@
|
|
|
66
66
|
"reload": "重新载入详情",
|
|
67
67
|
"notFound": "这个项目中找不到这件工作项。",
|
|
68
68
|
"actor": {
|
|
69
|
+
"you": "你",
|
|
69
70
|
"human": "人",
|
|
70
71
|
"otherAgent": "其他 agent",
|
|
71
72
|
"team": "团队插件",
|
|
72
73
|
"plugin": "插件 {{pluginId}}",
|
|
73
74
|
"localCli": "本机命令行",
|
|
74
|
-
"system": "系统"
|
|
75
|
+
"system": "系统",
|
|
76
|
+
"remoteAgentFallback": "远端 agent"
|
|
75
77
|
},
|
|
76
78
|
"history": {
|
|
77
79
|
"title": "活动历史",
|
|
@@ -113,7 +115,8 @@
|
|
|
113
115
|
"invalidGoal": "目标去掉首尾空白后需为 1 到 4000 个字符。",
|
|
114
116
|
"invalidRequestId": "请求 ID 需为 1 到 64 个字母、数字、下划线或连字符。",
|
|
115
117
|
"loadFailed": "未能载入当前目标,请重新载入。",
|
|
116
|
-
"startFailed": "目标未能全部开始,请重试以补齐会话并给负责人发话。"
|
|
118
|
+
"startFailed": "目标未能全部开始,请重试以补齐会话并给负责人发话。",
|
|
119
|
+
"remoteMembers": "远端成员:"
|
|
117
120
|
},
|
|
118
121
|
"roster": {
|
|
119
122
|
"title": "名单",
|
|
@@ -123,6 +126,9 @@
|
|
|
123
126
|
"leadFor": "将成员 {{number}} 设为负责人",
|
|
124
127
|
"remove": "删除成员 {{number}}",
|
|
125
128
|
"add": "添加成员",
|
|
129
|
+
"addRemoteAgent": "添加远端 agent",
|
|
130
|
+
"noRemoteAgents": "这台机器上还没有可用的远端 agent。",
|
|
131
|
+
"remote": "远端",
|
|
126
132
|
"save": "保存",
|
|
127
133
|
"saving": "保存中…",
|
|
128
134
|
"saved": "名单已保存",
|
|
@@ -142,6 +148,26 @@
|
|
|
142
148
|
"invalidName": "成员名字去掉首尾空白后需为 1 到 40 个字符。",
|
|
143
149
|
"duplicateMemberId": "每名成员的 ID 必须不同。",
|
|
144
150
|
"duplicateName": "成员名字不能重复,大小写不同或首尾有空白也算重复。",
|
|
145
|
-
"leadNotMember": "请从名单中选择一名负责人。"
|
|
151
|
+
"leadNotMember": "请从名单中选择一名负责人。",
|
|
152
|
+
"leadRemote": "负责人必须是本机成员。",
|
|
153
|
+
"duplicatePrincipal": "同一个远端 agent 在名单里只能出现一次。",
|
|
154
|
+
"invalidPrincipal": "远端 agent 的主体 ID 不能为空。",
|
|
155
|
+
"allRemoteAgentsAdded": "可用的远端 agent 都已在名单里。",
|
|
156
|
+
"remoteAgentsUnavailable": "暂时读不出这台机器上的远端 agent,请稍后再试。",
|
|
157
|
+
"remoteSource": "远端 agent:{{label}}"
|
|
158
|
+
},
|
|
159
|
+
"remoteStatus": {
|
|
160
|
+
"title": "远端成员",
|
|
161
|
+
"none": "名单里还没有远端成员。可在名单里用「添加远端 agent」加入。",
|
|
162
|
+
"lastSeen": "最近来过:{{time}}",
|
|
163
|
+
"neverSeen": "还没来过",
|
|
164
|
+
"workUnavailable": "暂时读不出它手上的活,请稍后再试。",
|
|
165
|
+
"noWork": "手上没有活。",
|
|
166
|
+
"item": "#{{number}} {{title}}",
|
|
167
|
+
"disabled": "已停用",
|
|
168
|
+
"revoked": "没有可用凭据",
|
|
169
|
+
"lastSeenUnavailable": "暂时读不出最近来过的时间",
|
|
170
|
+
"blocked": "被挡着",
|
|
171
|
+
"more": "还有 {{count}} 件没在这里列出"
|
|
146
172
|
}
|
|
147
173
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ycodium-ai/plugin-team",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3072",
|
|
4
4
|
"description": "A project team roster with members, a lead, and goals.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"teams",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"tailwindcss": "^4.0.0",
|
|
35
35
|
"typescript": "~6.0.3",
|
|
36
36
|
"vite-plus": "0.2.2",
|
|
37
|
-
"@ycodium-ai/plugin-api": "0.2.
|
|
37
|
+
"@ycodium-ai/plugin-api": "0.2.3072"
|
|
38
38
|
},
|
|
39
39
|
"ycodium": {
|
|
40
40
|
"plugin": "./dist/index.js",
|