@ycodium-ai/plugin-team 0.2.3598 → 0.2.3614

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/dist/index.js CHANGED
@@ -9056,6 +9056,67 @@ function createRosterService(ctx, options = {}) {
9056
9056
 
9057
9057
  // src/runtime/deliver.ts
9058
9058
  import * as NodeCrypto from "node:crypto";
9059
+
9060
+ // ../../packages/ycodium-system-text/src/systemText.ts
9061
+ var SYSTEM_NOTIFICATION_OPEN_TAG = "<ycodium-system>";
9062
+ var SYSTEM_NOTIFICATION_CLOSE_TAG = "</ycodium-system>";
9063
+ var isSystemNotificationText = (text) => text.startsWith(SYSTEM_NOTIFICATION_OPEN_TAG);
9064
+ var rendersAsSystemMessage = (text) => isSystemNotificationText(text) && !(isPresetPrefixMessage(text) && text.includes(PRESET_PREFIX_CLOSE) && parsePresetPrefixText(text) === null);
9065
+ var FIRST_BLOCK_START = `^(?:${SYSTEM_NOTIFICATION_OPEN_TAG}\\n)?`;
9066
+ var PRESET_PREFIX_MESSAGE_START = `${SYSTEM_NOTIFICATION_OPEN_TAG}
9067
+ <preset-prefix `;
9068
+ var isPresetPrefixMessage = (text) => text.startsWith(PRESET_PREFIX_MESSAGE_START);
9069
+ var SYSTEM_TEXT_ESCAPED_ATTRIBUTE = 'esc="1"';
9070
+ var escapeSystemText = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;");
9071
+ var SYSTEM_TEXT_MAX_ESCAPE_GROWTH = "&amp;".length;
9072
+ var escapeSystemAttribute = (text) => escapeSystemText(text).replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/\r/g, "&#13;").replace(/\n/g, "&#10;");
9073
+ var ESCAPED_BLOCK_NAMES = [
9074
+ "thread-response",
9075
+ "thread-handover",
9076
+ "scheduled-wake",
9077
+ "plugin-wake"
9078
+ ];
9079
+ var escapedBlockOpenTag = (name, attributes) => `<${name} ${[
9080
+ ...attributes.map(([key, value]) => `${key}="${escapeSystemAttribute(value)}"`),
9081
+ SYSTEM_TEXT_ESCAPED_ATTRIBUTE
9082
+ ].join(" ")}>`;
9083
+ var ESCAPED_OPEN_LINE_PATTERN = new RegExp(
9084
+ `^<(?:${ESCAPED_BLOCK_NAMES.join("|")})(?:\\s[^>]*)? ${SYSTEM_TEXT_ESCAPED_ATTRIBUTE}>$`
9085
+ );
9086
+ var PRESET_PREFIX_CLOSE = `
9087
+ </preset-prefix>
9088
+ ${SYSTEM_NOTIFICATION_CLOSE_TAG}`;
9089
+ var PRESET_PREFIX_PATTERN = new RegExp(
9090
+ `^${SYSTEM_NOTIFICATION_OPEN_TAG}\\n<preset-prefix id="([^"]*)">\\n([\\s\\S]*?)\\n</preset-prefix>\\n${SYSTEM_NOTIFICATION_CLOSE_TAG}(?:\\n\\n([\\s\\S]*))?$`
9091
+ );
9092
+ var parsePresetPrefixText = (text) => {
9093
+ if (text.split(PRESET_PREFIX_CLOSE).length !== 2) return null;
9094
+ const match7 = PRESET_PREFIX_PATTERN.exec(text);
9095
+ if (match7 === null) return null;
9096
+ const [, presetId, prefix, body] = match7;
9097
+ if (!presetId) return null;
9098
+ return { presetId, prefix: prefix ?? "", body: body ?? "" };
9099
+ };
9100
+ var userSpokenText = (text) => {
9101
+ if (!rendersAsSystemMessage(text)) return text;
9102
+ return parsePresetPrefixText(text)?.body || null;
9103
+ };
9104
+ var formatPluginWakeText = (input) => [
9105
+ SYSTEM_NOTIFICATION_OPEN_TAG,
9106
+ escapedBlockOpenTag("plugin-wake", [
9107
+ ["plugin", input.pluginId],
9108
+ ["reason", input.reason],
9109
+ ...input.item ? [["item", input.item]] : []
9110
+ ]),
9111
+ escapeSystemText(input.text),
9112
+ "</plugin-wake>",
9113
+ SYSTEM_NOTIFICATION_CLOSE_TAG
9114
+ ].join("\n");
9115
+ var PLUGIN_WAKE_PATTERN = new RegExp(
9116
+ `${FIRST_BLOCK_START}<plugin-wake plugin="([^"]+)" reason="([^"]+)"(?: item="([^"]+)")? ${SYSTEM_TEXT_ESCAPED_ATTRIBUTE}>\\n[\\s\\S]*?\\n</plugin-wake>`
9117
+ );
9118
+
9119
+ // src/runtime/deliver.ts
9059
9120
  var worktreeSetupSentence = async (ctx, projectId, branch) => {
9060
9121
  const intro = `You are in your own newly created worktree on branch ${branch}.`;
9061
9122
  const project2 = await ctx.projects.get({ projectId }).catch(() => null);
@@ -9064,6 +9125,12 @@ var worktreeSetupSentence = async (ctx, projectId, branch) => {
9064
9125
  return `${intro} Install dependencies according to the project's instructions before starting work.`;
9065
9126
  return `${intro} If dependencies are missing, install them before starting work. This project defines a setup command for that: ${setup.command}; run it from the worktree root with the environment variables YCODIUM_PROJECT_ROOT set to "${project2.workspaceRoot}" and YCODIUM_WORKTREE_PATH set to this worktree's path. If it fails with "could not lock config file", wait a moment and run it again.`;
9066
9127
  };
9128
+ var teamWakeText = (display, text) => formatPluginWakeText({
9129
+ pluginId: "team",
9130
+ reason: display.reason,
9131
+ item: display.sequenceId === void 0 ? void 0 : `W${display.sequenceId}`,
9132
+ text
9133
+ });
9067
9134
  var stableHash = (key) => NodeCrypto.createHash("sha256").update(key).digest("hex").slice(0, 32);
9068
9135
  var memberWorktreeBranch = (name, threadId) => {
9069
9136
  const slug = Array.from(
@@ -9115,7 +9182,7 @@ async function deliverWake(ctx, input) {
9115
9182
  message: {
9116
9183
  messageId: input.messageId,
9117
9184
  role: "user",
9118
- text,
9185
+ text: teamWakeText(input.wake, text),
9119
9186
  attachments: []
9120
9187
  },
9121
9188
  modelSelection: execution.modelSelection,
@@ -9152,9 +9219,12 @@ async function deliverWake(ctx, input) {
9152
9219
  requestId: input.requestId,
9153
9220
  message: {
9154
9221
  ...turn.message,
9155
- text: `${text}
9222
+ text: teamWakeText(
9223
+ input.wake,
9224
+ `${text}
9156
9225
 
9157
9226
  ${await worktreeSetupSentence(ctx, input.projectId, branch)}`
9227
+ )
9158
9228
  },
9159
9229
  bootstrap: {
9160
9230
  prepareWorktree: {
@@ -9190,7 +9260,8 @@ ${await worktreeSetupSentence(ctx, input.projectId, branch)}`
9190
9260
  recipient: { threadId: worktree.leadThreadId },
9191
9261
  requestId: `team-worktree-report:${threadId}`,
9192
9262
  messageId: `team-worktree-report-msg:${threadId}`,
9193
- text: `Could not create a worktree for member ${await worktree.name()} (threadId ${threadId}): ${failure.reason}. They will work in the project folder for now.`
9263
+ text: `Could not create a worktree for member ${await worktree.name()} (threadId ${threadId}): ${failure.reason}. They will work in the project folder for now.`,
9264
+ wake: { reason: "notice" }
9194
9265
  });
9195
9266
  if (!reported) throw new Error("Member worktree failure could not be reported to the lead");
9196
9267
  const receipt = await worktree.lane.events.append({
@@ -9347,7 +9418,6 @@ var en_default = {
9347
9418
  sessionWaiting: "Needs input",
9348
9419
  sessionStopped: "Stopped",
9349
9420
  sessionStoppedAt: "Stopped at {{time}}",
9350
- sessionStatusTitle: "Status of the assigned member's session",
9351
9421
  queued: "Queued",
9352
9422
  dateLocale: "en",
9353
9423
  queuedTitle: "Assigned but not woken yet: waits until their current item is done",
@@ -9454,7 +9524,6 @@ var en_default = {
9454
9524
  openItem: "Open details for goal work item #{{number}}"
9455
9525
  },
9456
9526
  roster: {
9457
- remote: "Remote",
9458
9527
  toolsHint: "Keep the board and project memory on for this project so members can pick up work and record what they learn.",
9459
9528
  toolkitsOff: "The lead needs the board and project memory. Turn on both switches above.",
9460
9529
  boardOff: "The lead needs the board. Turn on the board switch above.",
@@ -9497,7 +9566,7 @@ var en_default = {
9497
9566
  kind: "Type",
9498
9567
  kindAgentHint: "Runs with the provider and model you pick when the machine is this one. A member set to another machine fails its trial run: set it back to this machine, or skip the trial run, and it runs on this machine with the project's default model.",
9499
9568
  kindRemoteHint: "An agent that connects from another machine with its own credentials.",
9500
- kindPersonHint: "A teammate. People are listed as members but do not run sessions.",
9569
+ kindPersonHint: "People are listed as members but do not run sessions.",
9501
9570
  thisIsMe: "This is me",
9502
9571
  thisIsMeHint: "When someone @-mentions this member in a team group, the message goes to your Sent to me.",
9503
9572
  boundToOther: "This member is another person. Only they can change this.",
@@ -9506,7 +9575,6 @@ var en_default = {
9506
9575
  memberTitle: "Title",
9507
9576
  responsibility: "Responsibility",
9508
9577
  instructions: "Work instructions",
9509
- instructionsHint: "Written for this member. You can change it later.",
9510
9578
  instructionsLoading: "Loading work instructions\u2026",
9511
9579
  instructionsFailed: "The work instructions could not be loaded.",
9512
9580
  avatar: "Avatar",
@@ -9638,7 +9706,6 @@ var en_default = {
9638
9706
  version: "Version {{version}}",
9639
9707
  publishedBy: "Published by {{author}}",
9640
9708
  requiresAck: "Acknowledgement required",
9641
- noAck: "Acknowledgement not required",
9642
9709
  restoredFrom: "Restored from version {{version}}",
9643
9710
  moreReleases: "Load older versions",
9644
9711
  members: "Member acknowledgements",
@@ -9664,7 +9731,6 @@ var en_default = {
9664
9731
  revertDescription: "Publish the content of version {{version}} as a new version, under your name. The current version remains in history.",
9665
9732
  confirmRevert: "Revert and publish",
9666
9733
  historyFailed: "Couldn't load the version history. Try again.",
9667
- emptyPages: "Once the handbook is published, its three pages show here.",
9668
9734
  fieldTitle: "Title (optional)",
9669
9735
  fieldBody: "Body",
9670
9736
  fieldSummary: "Change summary (optional)",
@@ -9677,7 +9743,6 @@ var en_default = {
9677
9743
  },
9678
9744
  remoteStatus: {
9679
9745
  title: "Remote members",
9680
- none: "No remote agents on the team. Add one as a member of type Remote agent.",
9681
9746
  lastSeen: "Last seen {{time}}",
9682
9747
  neverSeen: "Not seen yet",
9683
9748
  workUnavailable: "Could not read this member's work. Try again later.",
@@ -10051,7 +10116,10 @@ function createGoalService(ctx, rosterService, options = {}) {
10051
10116
  message: {
10052
10117
  messageId: `team-lead-message:${goal.projectId}:${goal.goalId}`,
10053
10118
  role: "user",
10054
- text: leadBrief(goal, roster, { engineMembers: view.stored?.version === 2 }),
10119
+ text: teamWakeText(
10120
+ { reason: "instructions" },
10121
+ leadBrief(goal, roster, { engineMembers: view.stored?.version === 2 })
10122
+ ),
10055
10123
  attachments: []
10056
10124
  },
10057
10125
  modelSelection: selections.get(goal.leadMemberId).modelSelection,
@@ -11902,6 +11970,7 @@ function startMemberBindingRuntime(ctx, goals, rosters, wakes, trials2) {
11902
11970
  recipient: { threadId: leadThreadId },
11903
11971
  requestId: `team-member-unbound-notice:${key}`,
11904
11972
  messageId: `team-member-unbound-notice-message:${key}`,
11973
+ wake: { reason: "notice" },
11905
11974
  text: rebinding ? `Member ${member.name} (memberId ${member.memberId}) passed its trial run with the new setup but could not be moved onto it: ${failure.detail}. Work not yet handed to them waits until it is. Fix the cause, for example change their model with team_update_member; they are set up again within a couple of minutes.` : `Member ${member.name} (memberId ${member.memberId}) could not join this goal: ${failure.detail}. Work assigned to them waits until they join. Fix the cause, for example change their model with team_update_member; they are set up again within a couple of minutes.`
11906
11975
  });
11907
11976
  if (delivered) told.add(key);
@@ -12080,6 +12149,7 @@ function startMemberRemovalRuntime(ctx, goals, wakes) {
12080
12149
  recipient: { threadId: lead },
12081
12150
  requestId: `team-member-removed-notice:${key}`,
12082
12151
  messageId: `team-member-removed-notice-message:${key}`,
12152
+ wake: { reason: "notice" },
12083
12153
  text: [
12084
12154
  `Member ${member.name} (memberId ${memberId}) was removed from this project's team.`,
12085
12155
  `Work that had not reached them yet was taken off them and now has no assignee: ${list(mine(taken))}. Assign it to another member with work_update_item.`,
@@ -13371,6 +13441,7 @@ function startWakeRuntime(ctx, goals, options = {}) {
13371
13441
  recipient: wake,
13372
13442
  requestId: wakeRequestId(id),
13373
13443
  messageId: `team-wake-msg:${id}`,
13444
+ wake: { reason: "work", sequenceId: wake.sequenceId },
13374
13445
  memberWorktree: worktree === void 0 ? void 0 : { ...worktree, lane: worktrees },
13375
13446
  // 评论在收件人正在跑时插进当前这一轮,不排到这一轮结束(试跑 3:一轮 97 分钟,检查点落空)。
13376
13447
  ...wake.kind === "comment" ? { steer: true } : {},
@@ -13574,6 +13645,10 @@ function startRecoveryRuntime(ctx, goals, state, worktrees) {
13574
13645
  requestId: `team-recovery:${id}:${plan.action}`,
13575
13646
  messageId: `team-recovery-msg:${id}:${plan.action}`,
13576
13647
  text: plan.text,
13648
+ // 续做与提醒是叫成员接着干活;告诉负责人谁停了是通知。
13649
+ wake: {
13650
+ reason: plan.action === "resume" || plan.action === "remind" ? "work" : "notice"
13651
+ },
13577
13652
  memberWorktree: worktree === void 0 ? void 0 : { ...worktree, lane: worktrees }
13578
13653
  });
13579
13654
  if (!delivered) continue;
@@ -13665,7 +13740,8 @@ fired:${fired.wakes.length}`);
13665
13740
  recipient: { threadId },
13666
13741
  requestId: `team-lead-checkin:${threadId}:${key}`,
13667
13742
  messageId: `team-lead-checkin-message:${threadId}:${key}`,
13668
- text: LEAD_CHECKIN_REMINDER
13743
+ text: LEAD_CHECKIN_REMINDER,
13744
+ wake: { reason: "check-in" }
13669
13745
  });
13670
13746
  }
13671
13747
  };
@@ -14372,6 +14448,7 @@ function startHandbookRuntime(ctx, worktrees) {
14372
14448
  messageId: `team-handbook-msg:${id}`,
14373
14449
  // 成员闲着时被换版提醒叫醒,不能借机自己挑活:成员的提醒写死只确认、确认完就结束这一轮。
14374
14450
  text: handbookReminder(release, seat.goal.leadMemberId === member.memberId),
14451
+ wake: { reason: "instructions" },
14375
14452
  memberWorktree: worktree === void 0 ? void 0 : { ...worktree, lane: worktrees.lane }
14376
14453
  });
14377
14454
  if (!delivered) continue;
@@ -15931,39 +16008,6 @@ async function teamWaitingList(ctx, memberThreads, nameOf2) {
15931
16008
  return waiting.length === 0 ? null : `${count(waiting.length, "member is", "members are")} waiting on the person: ${waiting.join("; ")}. These appear in this conversation for the person to answer; you cannot answer them and should not wait for them. Hand out work to members who are not blocked.`;
15932
16009
  }
15933
16010
 
15934
- // ../../packages/ycodium-system-text/src/systemText.ts
15935
- var SYSTEM_NOTIFICATION_OPEN_TAG = "<ycodium-system>";
15936
- var SYSTEM_NOTIFICATION_CLOSE_TAG = "</ycodium-system>";
15937
- var isSystemNotificationText = (text) => text.startsWith(SYSTEM_NOTIFICATION_OPEN_TAG);
15938
- var rendersAsSystemMessage = (text) => isSystemNotificationText(text) && !(isPresetPrefixMessage(text) && text.includes(PRESET_PREFIX_CLOSE) && parsePresetPrefixText(text) === null);
15939
- var FIRST_BLOCK_START = `^(?:${SYSTEM_NOTIFICATION_OPEN_TAG}\\n)?`;
15940
- var PRESET_PREFIX_MESSAGE_START = `${SYSTEM_NOTIFICATION_OPEN_TAG}
15941
- <preset-prefix `;
15942
- var isPresetPrefixMessage = (text) => text.startsWith(PRESET_PREFIX_MESSAGE_START);
15943
- var SYSTEM_TEXT_ESCAPED_ATTRIBUTE = 'esc="1"';
15944
- var ESCAPED_BLOCK_NAMES = ["thread-response", "thread-handover", "scheduled-wake"];
15945
- var ESCAPED_OPEN_LINE_PATTERN = new RegExp(
15946
- `^<(?:${ESCAPED_BLOCK_NAMES.join("|")})(?:\\s[^>]*)? ${SYSTEM_TEXT_ESCAPED_ATTRIBUTE}>$`
15947
- );
15948
- var PRESET_PREFIX_CLOSE = `
15949
- </preset-prefix>
15950
- ${SYSTEM_NOTIFICATION_CLOSE_TAG}`;
15951
- var PRESET_PREFIX_PATTERN = new RegExp(
15952
- `^${SYSTEM_NOTIFICATION_OPEN_TAG}\\n<preset-prefix id="([^"]*)">\\n([\\s\\S]*?)\\n</preset-prefix>\\n${SYSTEM_NOTIFICATION_CLOSE_TAG}(?:\\n\\n([\\s\\S]*))?$`
15953
- );
15954
- var parsePresetPrefixText = (text) => {
15955
- if (text.split(PRESET_PREFIX_CLOSE).length !== 2) return null;
15956
- const match7 = PRESET_PREFIX_PATTERN.exec(text);
15957
- if (match7 === null) return null;
15958
- const [, presetId, prefix, body] = match7;
15959
- if (!presetId) return null;
15960
- return { presetId, prefix: prefix ?? "", body: body ?? "" };
15961
- };
15962
- var userSpokenText = (text) => {
15963
- if (!rendersAsSystemMessage(text)) return text;
15964
- return parsePresetPrefixText(text)?.body || null;
15965
- };
15966
-
15967
16011
  // src/team/groupDigest.ts
15968
16012
  var DIGEST_LIMIT = 30;
15969
16013
  var SCAN_PAGES = 5;
@@ -16271,7 +16315,6 @@ var zh_CN_default = {
16271
16315
  sessionWaiting: "\u7B49\u4EBA\u5904\u7406",
16272
16316
  sessionStopped: "\u505C\u7740",
16273
16317
  sessionStoppedAt: "\u505C\u4E8E {{time}}",
16274
- sessionStatusTitle: "\u6307\u6D3E\u6210\u5458\u7684\u4F1A\u8BDD\u6B64\u523B\u7684\u72B6\u6001",
16275
16318
  queued: "\u6392\u7740",
16276
16319
  dateLocale: "zh-CN",
16277
16320
  queuedTitle: "\u5DF2\u6D3E\u3001\u8FD8\u6CA1\u53EB\u9192\uFF1A\u7B49\u5BF9\u65B9\u624B\u4E0A\u90A3\u4EF6\u505A\u5B8C\u518D\u53EB",
@@ -16378,7 +16421,6 @@ var zh_CN_default = {
16378
16421
  openItem: "\u6253\u5F00\u76EE\u6807\u5DE5\u4F5C\u9879 #{{number}} \u7684\u8BE6\u60C5"
16379
16422
  },
16380
16423
  roster: {
16381
- remote: "\u8FDC\u7AEF",
16382
16424
  toolsHint: "\u8FD9\u4E2A\u9879\u76EE\u8981\u5F00\u7740\u770B\u677F\u4E0E\u9879\u76EE\u8BB0\u5FC6\uFF0C\u6210\u5458\u624D\u80FD\u9886\u6D3B\u4E0E\u8BB0\u7ECF\u9A8C\u3002",
16383
16425
  toolkitsOff: "\u8D1F\u8D23\u4EBA\u8981\u7528\u770B\u677F\u548C\u9879\u76EE\u8BB0\u5FC6\uFF0C\u5148\u6253\u5F00\u4E0A\u9762\u4E24\u53EA\u5F00\u5173\u3002",
16384
16426
  boardOff: "\u8D1F\u8D23\u4EBA\u8981\u7528\u770B\u677F\uFF0C\u5148\u6253\u5F00\u4E0A\u9762\u7684\u770B\u677F\u5F00\u5173\u3002",
@@ -16421,7 +16463,7 @@ var zh_CN_default = {
16421
16463
  kind: "\u7C7B\u578B",
16422
16464
  kindAgentHint: "\u673A\u5668\u9009\u8FD9\u4E00\u53F0\u65F6\uFF0C\u7528\u4F60\u9009\u7684 provider \u548C\u6A21\u578B\u8FD0\u884C\u3002\u9009\u4E86\u522B\u7684\u673A\u5668\u7684\u6210\u5458\u8BD5\u8DD1\u4F1A\u51FA\u9519\uFF1A\u6539\u56DE\u8FD9\u4E00\u53F0\uFF0C\u6216\u8005\u8DF3\u8FC7\u8BD5\u8DD1\uFF0C\u5B83\u5C31\u5728\u8FD9\u53F0\u673A\u5668\u4E0A\u7528\u9879\u76EE\u7684\u9ED8\u8BA4\u6A21\u578B\u8FD0\u884C\u3002",
16423
16465
  kindRemoteHint: "\u4ECE\u53E6\u4E00\u53F0\u673A\u5668\u7528\u81EA\u5DF1\u7684\u51ED\u636E\u8FDE\u8FDB\u6765\u7684 agent\u3002",
16424
- kindPersonHint: "\u56E2\u961F\u91CC\u7684\u4EBA\u3002\u4EBA\u4F1A\u5217\u5728\u6210\u5458\u91CC\uFF0C\u4F46\u4E0D\u4F1A\u8FD0\u884C\u4F1A\u8BDD\u3002",
16466
+ kindPersonHint: "\u4EBA\u4F1A\u5217\u5728\u6210\u5458\u91CC\uFF0C\u4F46\u4E0D\u4F1A\u8FD0\u884C\u4F1A\u8BDD\u3002",
16425
16467
  thisIsMe: "\u8FD9\u662F\u6211",
16426
16468
  thisIsMeHint: "\u6709\u4EBA\u5728\u56E2\u961F\u7FA4\u91CC @ \u8FD9\u4E2A\u6210\u5458\u65F6\uFF0C\u6D88\u606F\u4F1A\u8FDB\u4F60\u7684\u300C\u53D1\u7ED9\u6211\u7684\u300D\u3002",
16427
16469
  boundToOther: "\u8FD9\u4E2A\u6210\u5458\u662F\u53E6\u4E00\u4E2A\u4EBA\uFF0C\u53EA\u6709\u5BF9\u65B9\u672C\u4EBA\u80FD\u6539\u8FD9\u4E00\u9879\u3002",
@@ -16430,7 +16472,6 @@ var zh_CN_default = {
16430
16472
  memberTitle: "\u5934\u8854",
16431
16473
  responsibility: "\u804C\u8D23",
16432
16474
  instructions: "\u5DE5\u4F5C\u8BF4\u660E",
16433
- instructionsHint: "\u5199\u7ED9\u8FD9\u540D\u6210\u5458\u7684\u8BF4\u660E\uFF0C\u4E4B\u540E\u53EF\u4EE5\u4FEE\u6539\u3002",
16434
16475
  instructionsLoading: "\u6B63\u5728\u8F7D\u5165\u5DE5\u4F5C\u8BF4\u660E\u2026",
16435
16476
  instructionsFailed: "\u672A\u80FD\u8F7D\u5165\u5DE5\u4F5C\u8BF4\u660E\u3002",
16436
16477
  avatar: "\u5934\u50CF",
@@ -16562,7 +16603,6 @@ var zh_CN_default = {
16562
16603
  version: "\u7B2C {{version}} \u7248",
16563
16604
  publishedBy: "\u53D1\u5E03\u8005\uFF1A{{author}}",
16564
16605
  requiresAck: "\u8981\u6C42\u786E\u8BA4",
16565
- noAck: "\u4E0D\u8981\u6C42\u786E\u8BA4",
16566
16606
  restoredFrom: "\u9000\u56DE\u81EA\u7B2C {{version}} \u7248",
16567
16607
  moreReleases: "\u52A0\u8F7D\u66F4\u65E9\u7248\u672C",
16568
16608
  members: "\u6210\u5458\u786E\u8BA4\u60C5\u51B5",
@@ -16588,7 +16628,6 @@ var zh_CN_default = {
16588
16628
  revertDescription: "\u4EE5\u4F60\u7684\u540D\u5B57\uFF0C\u628A\u7B2C {{version}} \u7248\u7684\u5185\u5BB9\u53D1\u5E03\u4E3A\u4E00\u4E2A\u65B0\u7248\u672C\u3002\u5F53\u524D\u7248\u672C\u4ECD\u4FDD\u7559\u5728\u5386\u53F2\u91CC",
16589
16629
  confirmRevert: "\u9000\u56DE\u5E76\u53D1\u5E03",
16590
16630
  historyFailed: "\u7248\u672C\u5386\u53F2\u8BFB\u53D6\u5931\u8D25\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21",
16591
- emptyPages: "\u624B\u518C\u53D1\u5E03\u540E\uFF0C\u8FD9\u91CC\u663E\u793A\u5B83\u7684\u4E09\u9875\u5185\u5BB9",
16592
16631
  fieldTitle: "\u6807\u9898\uFF08\u53EF\u9009\uFF09",
16593
16632
  fieldBody: "\u6B63\u6587",
16594
16633
  fieldSummary: "\u6539\u52A8\u8BF4\u660E\uFF08\u53EF\u9009\uFF09",
@@ -16601,7 +16640,6 @@ var zh_CN_default = {
16601
16640
  },
16602
16641
  remoteStatus: {
16603
16642
  title: "\u8FDC\u7AEF\u6210\u5458",
16604
- none: "\u56E2\u961F\u91CC\u8FD8\u6CA1\u6709\u8FDC\u7AEF agent\u3002\u53EF\u5728\u6210\u5458\u91CC\u6DFB\u52A0\u7C7B\u578B\u4E3A\u8FDC\u7AEF agent \u7684\u6210\u5458\u3002",
16605
16643
  lastSeen: "\u6700\u8FD1\u6765\u8FC7\uFF1A{{time}}",
16606
16644
  neverSeen: "\u8FD8\u6CA1\u6765\u8FC7",
16607
16645
  workUnavailable: "\u6682\u65F6\u8BFB\u4E0D\u51FA\u5B83\u624B\u4E0A\u7684\u6D3B\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\u3002",
@@ -16917,7 +16955,7 @@ async function ensureSession(env, record2, ensured, prepared) {
16917
16955
  message: {
16918
16956
  messageId: `team-trial-message:${key}`,
16919
16957
  role: "user",
16920
- text: trialMessage("localPrompt", { trialId }),
16958
+ text: teamWakeText({ reason: "instructions" }, trialMessage("localPrompt", { trialId })),
16921
16959
  attachments: []
16922
16960
  },
16923
16961
  modelSelection: selection.modelSelection,
@@ -16987,7 +17025,8 @@ async function tellLeads(env, leadThreads, projectId, key, text) {
16987
17025
  recipient: { threadId: leadThreadId },
16988
17026
  requestId,
16989
17027
  messageId: `${requestId}:message`,
16990
- text
17028
+ text,
17029
+ wake: { reason: "notice" }
16991
17030
  });
16992
17031
  delivered ||= sent;
16993
17032
  }
@@ -17413,7 +17452,7 @@ function startTrialRuntime(ctx, deps, options = {}) {
17413
17452
  // src/index.ts
17414
17453
  var index_default = definePlugin({
17415
17454
  id: "team",
17416
- apiVersion: 48,
17455
+ apiVersion: 49,
17417
17456
  activate(ctx) {
17418
17457
  const trialState = ctx.derivedState(trialStateDefinition);
17419
17458
  const rosters = createRosterService(ctx);
package/locales/en.json CHANGED
@@ -85,7 +85,6 @@
85
85
  "sessionWaiting": "Needs input",
86
86
  "sessionStopped": "Stopped",
87
87
  "sessionStoppedAt": "Stopped at {{time}}",
88
- "sessionStatusTitle": "Status of the assigned member's session",
89
88
  "queued": "Queued",
90
89
  "dateLocale": "en",
91
90
  "queuedTitle": "Assigned but not woken yet: waits until their current item is done",
@@ -192,7 +191,6 @@
192
191
  "openItem": "Open details for goal work item #{{number}}"
193
192
  },
194
193
  "roster": {
195
- "remote": "Remote",
196
194
  "toolsHint": "Keep the board and project memory on for this project so members can pick up work and record what they learn.",
197
195
  "toolkitsOff": "The lead needs the board and project memory. Turn on both switches above.",
198
196
  "boardOff": "The lead needs the board. Turn on the board switch above.",
@@ -235,7 +233,7 @@
235
233
  "kind": "Type",
236
234
  "kindAgentHint": "Runs with the provider and model you pick when the machine is this one. A member set to another machine fails its trial run: set it back to this machine, or skip the trial run, and it runs on this machine with the project's default model.",
237
235
  "kindRemoteHint": "An agent that connects from another machine with its own credentials.",
238
- "kindPersonHint": "A teammate. People are listed as members but do not run sessions.",
236
+ "kindPersonHint": "People are listed as members but do not run sessions.",
239
237
  "thisIsMe": "This is me",
240
238
  "thisIsMeHint": "When someone @-mentions this member in a team group, the message goes to your Sent to me.",
241
239
  "boundToOther": "This member is another person. Only they can change this.",
@@ -244,7 +242,6 @@
244
242
  "memberTitle": "Title",
245
243
  "responsibility": "Responsibility",
246
244
  "instructions": "Work instructions",
247
- "instructionsHint": "Written for this member. You can change it later.",
248
245
  "instructionsLoading": "Loading work instructions…",
249
246
  "instructionsFailed": "The work instructions could not be loaded.",
250
247
  "avatar": "Avatar",
@@ -376,7 +373,6 @@
376
373
  "version": "Version {{version}}",
377
374
  "publishedBy": "Published by {{author}}",
378
375
  "requiresAck": "Acknowledgement required",
379
- "noAck": "Acknowledgement not required",
380
376
  "restoredFrom": "Restored from version {{version}}",
381
377
  "moreReleases": "Load older versions",
382
378
  "members": "Member acknowledgements",
@@ -402,7 +398,6 @@
402
398
  "revertDescription": "Publish the content of version {{version}} as a new version, under your name. The current version remains in history.",
403
399
  "confirmRevert": "Revert and publish",
404
400
  "historyFailed": "Couldn't load the version history. Try again.",
405
- "emptyPages": "Once the handbook is published, its three pages show here.",
406
401
  "fieldTitle": "Title (optional)",
407
402
  "fieldBody": "Body",
408
403
  "fieldSummary": "Change summary (optional)",
@@ -415,7 +410,6 @@
415
410
  },
416
411
  "remoteStatus": {
417
412
  "title": "Remote members",
418
- "none": "No remote agents on the team. Add one as a member of type Remote agent.",
419
413
  "lastSeen": "Last seen {{time}}",
420
414
  "neverSeen": "Not seen yet",
421
415
  "workUnavailable": "Could not read this member's work. Try again later.",
@@ -85,7 +85,6 @@
85
85
  "sessionWaiting": "等人处理",
86
86
  "sessionStopped": "停着",
87
87
  "sessionStoppedAt": "停于 {{time}}",
88
- "sessionStatusTitle": "指派成员的会话此刻的状态",
89
88
  "queued": "排着",
90
89
  "dateLocale": "zh-CN",
91
90
  "queuedTitle": "已派、还没叫醒:等对方手上那件做完再叫",
@@ -192,7 +191,6 @@
192
191
  "openItem": "打开目标工作项 #{{number}} 的详情"
193
192
  },
194
193
  "roster": {
195
- "remote": "远端",
196
194
  "toolsHint": "这个项目要开着看板与项目记忆,成员才能领活与记经验。",
197
195
  "toolkitsOff": "负责人要用看板和项目记忆,先打开上面两只开关。",
198
196
  "boardOff": "负责人要用看板,先打开上面的看板开关。",
@@ -235,7 +233,7 @@
235
233
  "kind": "类型",
236
234
  "kindAgentHint": "机器选这一台时,用你选的 provider 和模型运行。选了别的机器的成员试跑会出错:改回这一台,或者跳过试跑,它就在这台机器上用项目的默认模型运行。",
237
235
  "kindRemoteHint": "从另一台机器用自己的凭据连进来的 agent。",
238
- "kindPersonHint": "团队里的人。人会列在成员里,但不会运行会话。",
236
+ "kindPersonHint": "人会列在成员里,但不会运行会话。",
239
237
  "thisIsMe": "这是我",
240
238
  "thisIsMeHint": "有人在团队群里 @ 这个成员时,消息会进你的「发给我的」。",
241
239
  "boundToOther": "这个成员是另一个人,只有对方本人能改这一项。",
@@ -244,7 +242,6 @@
244
242
  "memberTitle": "头衔",
245
243
  "responsibility": "职责",
246
244
  "instructions": "工作说明",
247
- "instructionsHint": "写给这名成员的说明,之后可以修改。",
248
245
  "instructionsLoading": "正在载入工作说明…",
249
246
  "instructionsFailed": "未能载入工作说明。",
250
247
  "avatar": "头像",
@@ -376,7 +373,6 @@
376
373
  "version": "第 {{version}} 版",
377
374
  "publishedBy": "发布者:{{author}}",
378
375
  "requiresAck": "要求确认",
379
- "noAck": "不要求确认",
380
376
  "restoredFrom": "退回自第 {{version}} 版",
381
377
  "moreReleases": "加载更早版本",
382
378
  "members": "成员确认情况",
@@ -402,7 +398,6 @@
402
398
  "revertDescription": "以你的名字,把第 {{version}} 版的内容发布为一个新版本。当前版本仍保留在历史里",
403
399
  "confirmRevert": "退回并发布",
404
400
  "historyFailed": "版本历史读取失败,请再试一次",
405
- "emptyPages": "手册发布后,这里显示它的三页内容",
406
401
  "fieldTitle": "标题(可选)",
407
402
  "fieldBody": "正文",
408
403
  "fieldSummary": "改动说明(可选)",
@@ -415,7 +410,6 @@
415
410
  },
416
411
  "remoteStatus": {
417
412
  "title": "远端成员",
418
- "none": "团队里还没有远端 agent。可在成员里添加类型为远端 agent 的成员。",
419
413
  "lastSeen": "最近来过:{{time}}",
420
414
  "neverSeen": "还没来过",
421
415
  "workUnavailable": "暂时读不出它手上的活,请稍后再试。",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ycodium-ai/plugin-team",
3
- "version": "0.2.3598",
3
+ "version": "0.2.3614",
4
4
  "description": "A project team roster with members, a lead, and goals.",
5
5
  "keywords": [
6
6
  "teams",
@@ -35,7 +35,7 @@
35
35
  "typescript": "~6.0.3",
36
36
  "vite-plus": "0.2.2",
37
37
  "ycodium-system-text": "0.0.0",
38
- "@ycodium-ai/plugin-api": "0.2.3598"
38
+ "@ycodium-ai/plugin-api": "0.2.3614"
39
39
  },
40
40
  "ycodium": {
41
41
  "plugin": "./dist/index.js",