weaver-work-cli 0.1.33 → 0.1.36

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 (100) hide show
  1. package/dist/chunks/{archive-FVFY6GZN.js → archive-XBVH7JU7.js} +2 -2
  2. package/dist/chunks/{archive-oa-NW3OD4UV.js → archive-oa-MZM3EKFQ.js} +2 -2
  3. package/dist/chunks/{asset-7QJKMIDV.js → asset-4XO7UOUW.js} +2 -2
  4. package/dist/chunks/{attachment-content-OSAVA6K3.js → attachment-content-VXSWANAC.js} +3 -3
  5. package/dist/chunks/{blog-I7SDPNW4.js → blog-PGZKOPSC.js} +2 -2
  6. package/dist/chunks/{caizhilian-O37ZIQNY.js → caizhilian-BH4ZVGUN.js} +2 -2
  7. package/dist/chunks/{calendar-7KXE4ED3.js → calendar-MXEMTIO4.js} +2 -2
  8. package/dist/chunks/{chunk-VBCFFFGT.js → chunk-5DQEEGCC.js} +4 -1
  9. package/dist/chunks/{chunk-KAS45KNR.js → chunk-6LLJFKJE.js} +1 -1
  10. package/dist/chunks/{chunk-HEL5XTYI.js → chunk-BPE37FPB.js} +26 -4
  11. package/dist/chunks/{chunk-IHUYP6LO.js → chunk-F746NKNF.js} +1 -1
  12. package/dist/chunks/{chunk-MQ2I5AA3.js → chunk-HXJQI5NM.js} +2 -2
  13. package/dist/chunks/{chunk-ILMBNVSG.js → chunk-I6QGIBDM.js} +2 -2
  14. package/dist/chunks/{chunk-EEWPQE3O.js → chunk-JCSN3JGM.js} +2 -2
  15. package/dist/chunks/{chunk-D223PTXU.js → chunk-JNG42JKG.js} +29 -1
  16. package/dist/chunks/{chunk-6ATGWRZM.js → chunk-JUXVYKII.js} +4 -1
  17. package/dist/chunks/{chunk-GFPXQIY2.js → chunk-JYKABYCV.js} +2 -2
  18. package/dist/chunks/{chunk-Q6LWB5HX.js → chunk-NCOVUAZK.js} +2 -2
  19. package/dist/chunks/{chunk-WY74UBJ6.js → chunk-QHFANTX7.js} +900 -204
  20. package/dist/chunks/{chunk-WRRJ4GG2.js → chunk-QYGO5EE2.js} +2 -2
  21. package/dist/chunks/{chunk-RBGOMK4Y.js → chunk-T72N74ZT.js} +2 -2
  22. package/dist/chunks/{chunk-MEEFGWTM.js → chunk-TC6MZAO3.js} +84 -9
  23. package/dist/chunks/{chunk-OCU4RLHC.js → chunk-VPUTVEMC.js} +98 -34
  24. package/dist/chunks/{chunk-PRHJGPMA.js → chunk-VPXOPQJI.js} +2 -2
  25. package/dist/chunks/{chunk-NHA62QD7.js → chunk-WXFPWCXG.js} +3 -3
  26. package/dist/chunks/{chunk-2FLWXFVS.js → chunk-XMGSYD6S.js} +4 -4
  27. package/dist/chunks/{conflict-SFNEVJY5.js → conflict-JAB2LJEZ.js} +2 -2
  28. package/dist/chunks/contract-XI2EEIZU.js +9110 -0
  29. package/dist/chunks/{cowork-CKWYHXYB.js → cowork-SCPGLBA4.js} +44 -25
  30. package/dist/chunks/{ebuilder-form-KOLJRVZD.js → ebuilder-form-EYLHNOTA.js} +3 -3
  31. package/dist/chunks/{ehr-WFOC3B4D.js → ehr-EAP77IMT.js} +172 -9
  32. package/dist/chunks/{esb-LJZTN663.js → esb-2TGGXEE7.js} +4 -4
  33. package/dist/chunks/{fna-F7QRIIZC.js → fna-2X7ZE7BU.js} +13 -8
  34. package/dist/chunks/{host-VQ6JJXGQ.js → host-C6EL2RKL.js} +3 -3
  35. package/dist/chunks/{host-BCGUVEWX.js → host-I4NRK4MX.js} +3 -3
  36. package/dist/chunks/{host-DGE2TZD4.js → host-Q4LZGCRU.js} +3 -3
  37. package/dist/chunks/{host-BQBRHVR3.js → host-UEI5FGDM.js} +3 -3
  38. package/dist/chunks/{host-KXPTEWFS.js → host-XCLDDXKQ.js} +3 -3
  39. package/dist/chunks/{hrm-NI6XAKW5.js → hrm-YXERJM76.js} +3 -3
  40. package/dist/chunks/{im-7TRTF3KT.js → im-A4VZN2TQ.js} +3 -3
  41. package/dist/chunks/{invoice-AOXWJKYT.js → invoice-2Z6YPMIS.js} +3 -3
  42. package/dist/chunks/{jiuchuanhui-7NQWEZAW.js → jiuchuanhui-AR5GMKZB.js} +2 -2
  43. package/dist/chunks/{lazy-dispatch-RNS4EE4S.js → lazy-dispatch-QXW7P4X3.js} +4 -4
  44. package/dist/chunks/{mail-VDHJAB4O.js → mail-7GZ6CPBJ.js} +44 -23
  45. package/dist/chunks/{meeting-GA7XCNNP.js → meeting-3NMGA3MB.js} +74 -10
  46. package/dist/chunks/{okr-TQIRERPQ.js → okr-BZ6XUOAG.js} +2 -2
  47. package/dist/chunks/{plan-4RY4LN2P.js → plan-DR5CMUYP.js} +2 -2
  48. package/dist/chunks/{project-D6XT2OC5.js → project-6J63MK33.js} +2 -2
  49. package/dist/chunks/{registry-JHRIDQ3A.js → registry-KDD7DHNK.js} +4 -4
  50. package/dist/chunks/{registry-VOGKFFTR.js → registry-TKX2E7C7.js} +2 -2
  51. package/dist/chunks/{registry-QKMI43Q6.js → registry-VRTNC6UR.js} +8 -8
  52. package/dist/chunks/{room-recommend-D4EUOOWY.js → room-recommend-XCWRMB5P.js} +4 -4
  53. package/dist/chunks/{schedule-XPFBHPCV.js → schedule-IVBICP32.js} +4 -4
  54. package/dist/chunks/{workflow-HLBZRWIY.js → workflow-D74NFK3C.js} +11 -4
  55. package/dist/index.js +31 -26
  56. package/dist/internal/e10/fetch-timing.js +31 -0
  57. package/dist/internal/e10/request-runtime.js +5 -0
  58. package/dist/shortcuts/cowork/host.js +8 -0
  59. package/dist/shortcuts/cowork/operations/types.js +17 -2
  60. package/dist/shortcuts/ehr/operations/recruit-write.js +35 -0
  61. package/dist/shortcuts/ehr/operations/recruit.js +147 -0
  62. package/dist/shortcuts/fna/operations/expense-chart.js +19 -7
  63. package/dist/shortcuts/index.js +5 -0
  64. package/dist/shortcuts/mail/host.js +8 -0
  65. package/dist/shortcuts/mail/operations/types.js +17 -2
  66. package/dist/shortcuts/meeting/index.js +79 -1
  67. package/dist/shortcuts/meeting/manifest.js +10 -0
  68. package/dist/shortcuts/meeting/operations/eb/catalog.js +5 -0
  69. package/dist/shortcuts/meeting/operations/eb/conflict.js +6 -1
  70. package/dist/shortcuts/meeting/operations/eb/create-flow.js +1047 -134
  71. package/dist/shortcuts/meeting/operations/eb/factory.js +101 -7
  72. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +36 -2
  73. package/dist/shortcuts/meeting/operations/eb-fallback.js +4 -0
  74. package/dist/shortcuts/meeting/operations/env.js +6 -0
  75. package/dist/shortcuts/meeting/operations/invitation.js +79 -20
  76. package/dist/shortcuts/workflow/endpoints.js +8 -3
  77. package/dist/shortcuts/workflow/operations/form.js +181 -34
  78. package/dist/shortcuts/workflow/operations.js +23 -1
  79. package/docs/ehr.md +1 -1
  80. package/docs/fna.md +2 -1
  81. package/package.json +1 -1
  82. package/skill-template/business-info.json +18 -0
  83. package/skill-template/domains/cowork.md +14 -0
  84. package/skills/weaver-e10-cowork/SKILL.md +101 -0
  85. package/skills/weaver-e10-cowork/references/cowork-read.md +90 -0
  86. package/skills/weaver-e10-cowork/references/cowork-write.md +131 -0
  87. package/skills/weaver-e10-cowork/references/safety-boundaries.md +45 -0
  88. package/skills/weaver-e10-jucailin/SKILL.md +21 -3
  89. package/skills/weaver-e10-jucailin/references/recruit-read.md +25 -0
  90. package/skills/weaver-e10-jucailin/references/recruit-write.md +13 -0
  91. package/skills/weaver-e10-jucailin/references/salary.md +15 -11
  92. package/skills/weaver-e10-mail/SKILL.md +12 -9
  93. package/skills/weaver-e10-meeting/SKILL.md +284 -34
  94. package/skills/weaver-e10-meeting/references/meeting-eb.md +131 -0
  95. package/skills/weaver-e10-meeting/references/meeting-invitation.md +28 -2
  96. package/skills/weaver-e10-meeting.zip +0 -0
  97. package/skills/weaver-e10-qiyecheng/SKILL.md +5 -2
  98. package/skills/weaver-e10-qiyecheng/references/catalog.md +2 -2
  99. package/skills/weaver-e10-qiyecheng/references/expense-chart.md +15 -1
  100. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +22 -21
@@ -4,11 +4,11 @@ import {
4
4
  E10ApiError,
5
5
  createE10RequestRuntime,
6
6
  requireE10Session
7
- } from "./chunk-6ATGWRZM.js";
7
+ } from "./chunk-JUXVYKII.js";
8
8
  import {
9
9
  E10_SESSION_EXPIRED_MESSAGE,
10
10
  getActiveProfile
11
- } from "./chunk-D223PTXU.js";
11
+ } from "./chunk-JNG42JKG.js";
12
12
  import {
13
13
  CliError,
14
14
  isCliError,
@@ -145,6 +145,42 @@ function createCoworkContinuationSigner(ctx) {
145
145
  };
146
146
  }
147
147
 
148
+ // src/shortcuts/cowork/operations/types.ts
149
+ var READ = "read";
150
+ var READ_BEFORE_WRITE = "read-before-write";
151
+ var WRITE = "write";
152
+ var coworkPerf = {
153
+ t0: Date.now(),
154
+ sessionMs: 0,
155
+ requestCount: 0,
156
+ requestMs: 0
157
+ };
158
+ function coworkSuccess(action, data, meta) {
159
+ const payload = { ok: true, action, data };
160
+ const perf = {
161
+ elapsed_ms: Date.now() - coworkPerf.t0,
162
+ session_ms: coworkPerf.sessionMs || void 0,
163
+ requests: coworkPerf.requestCount || void 0,
164
+ network_ms: coworkPerf.requestMs || void 0
165
+ };
166
+ for (const k of Object.keys(perf)) if (perf[k] === void 0) delete perf[k];
167
+ payload.meta = { ...meta || {}, ...perf };
168
+ return payload;
169
+ }
170
+ function schemaOf(properties, options = {}) {
171
+ return {
172
+ type: "object",
173
+ additionalProperties: false,
174
+ properties,
175
+ ...options.required?.length ? { required: options.required } : {},
176
+ ...options.description ? { description: options.description } : {}
177
+ };
178
+ }
179
+ var SCHEMA_ID = { oneOf: [{ type: "integer" }, { type: "string", pattern: "^\\d+$" }] };
180
+ var SCHEMA_PAGE_CURRENT = { type: "integer", minimum: 1 };
181
+ var SCHEMA_PAGE_SIZE = { type: "integer", minimum: 1, maximum: 200 };
182
+ var SCHEMA_DATETIME = { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$" };
183
+
148
184
  // src/shortcuts/cowork/host.ts
149
185
  function inferProfile(ctx) {
150
186
  const options = ctx.getGlobalOptions();
@@ -214,7 +250,9 @@ function createCoworkHost(ctx, dependencies = {}) {
214
250
  const requireSession = dependencies.requireSession || ((innerCtx) => requireE10Session(innerCtx, { skipProfileEnrichment: true }));
215
251
  async function ensureSession() {
216
252
  if (!e10Session) {
253
+ const sessionStart = Date.now();
217
254
  e10Session = await requireSession(ctx);
255
+ coworkPerf.sessionMs = Date.now() - sessionStart;
218
256
  sessionContext = {
219
257
  baseUrl: e10Session.getBaseUrl(),
220
258
  profile: inferProfile(ctx),
@@ -249,6 +287,7 @@ function createCoworkHost(ctx, dependencies = {}) {
249
287
  assertPath(path);
250
288
  const resolvedMethod = method || (body === void 0 && form === void 0 ? "GET" : "POST");
251
289
  let response;
290
+ const reqStart = Date.now();
252
291
  try {
253
292
  response = await (await runtime()).requestJson({
254
293
  module: "cowork",
@@ -263,6 +302,9 @@ function createCoworkHost(ctx, dependencies = {}) {
263
302
  });
264
303
  } catch (error) {
265
304
  mapRuntimeNetworkError(error);
305
+ } finally {
306
+ coworkPerf.requestCount += 1;
307
+ coworkPerf.requestMs += Date.now() - reqStart;
266
308
  }
267
309
  if (response.status === 401 || response.status === 302) {
268
310
  throw coworkAuthError("session_expired", E10_SESSION_EXPIRED_MESSAGE, { httpStatus: response.status });
@@ -296,29 +338,6 @@ function createCoworkHost(ctx, dependencies = {}) {
296
338
  return { request, getSession };
297
339
  }
298
340
 
299
- // src/shortcuts/cowork/operations/types.ts
300
- var READ = "read";
301
- var READ_BEFORE_WRITE = "read-before-write";
302
- var WRITE = "write";
303
- function coworkSuccess(action, data, meta) {
304
- const payload = { ok: true, action, data };
305
- if (meta && Object.keys(meta).length > 0) payload.meta = meta;
306
- return payload;
307
- }
308
- function schemaOf(properties, options = {}) {
309
- return {
310
- type: "object",
311
- additionalProperties: false,
312
- properties,
313
- ...options.required?.length ? { required: options.required } : {},
314
- ...options.description ? { description: options.description } : {}
315
- };
316
- }
317
- var SCHEMA_ID = { oneOf: [{ type: "integer" }, { type: "string", pattern: "^\\d+$" }] };
318
- var SCHEMA_PAGE_CURRENT = { type: "integer", minimum: 1 };
319
- var SCHEMA_PAGE_SIZE = { type: "integer", minimum: 1, maximum: 200 };
320
- var SCHEMA_DATETIME = { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$" };
321
-
322
341
  // src/shortcuts/cowork/operations/shared.ts
323
342
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
324
343
  function asObject(value) {
@@ -2,7 +2,7 @@ import { createRequire as __esbuildCreateRequire } from 'node:module';
2
2
  const require = __esbuildCreateRequire(import.meta.url);
3
3
  import {
4
4
  createEbuilderFormHost
5
- } from "./chunk-WRRJ4GG2.js";
5
+ } from "./chunk-QYGO5EE2.js";
6
6
  import {
7
7
  createEbuilderFormContinuationSigner
8
8
  } from "./chunk-3SO6QL6U.js";
@@ -13,8 +13,8 @@ import {
13
13
  import {
14
14
  ebuilderValidationError
15
15
  } from "./chunk-BYATLLEF.js";
16
- import "./chunk-6ATGWRZM.js";
17
- import "./chunk-D223PTXU.js";
16
+ import "./chunk-JUXVYKII.js";
17
+ import "./chunk-JNG42JKG.js";
18
18
  import {
19
19
  isCliError,
20
20
  toErrorEnvelope
@@ -4,11 +4,11 @@ import {
4
4
  E10ApiError,
5
5
  createE10RequestRuntime,
6
6
  requireE10Session
7
- } from "./chunk-6ATGWRZM.js";
7
+ } from "./chunk-JUXVYKII.js";
8
8
  import {
9
9
  E10_SESSION_EXPIRED_MESSAGE,
10
10
  getActiveProfile
11
- } from "./chunk-D223PTXU.js";
11
+ } from "./chunk-JNG42JKG.js";
12
12
  import {
13
13
  CliError,
14
14
  isCliError,
@@ -3085,6 +3085,140 @@ var candidateList = {
3085
3085
  });
3086
3086
  }
3087
3087
  };
3088
+ function personNames(value) {
3089
+ const text = String(value ?? "").trim();
3090
+ if (!text) return "";
3091
+ if (text.startsWith("[")) {
3092
+ try {
3093
+ const arr = JSON.parse(text);
3094
+ if (Array.isArray(arr)) {
3095
+ const names = arr.map((item) => typeof item === "string" ? item : item?.name ?? item?.username ?? "").filter(Boolean);
3096
+ if (names.length) return names.join("\u3001");
3097
+ }
3098
+ } catch {
3099
+ }
3100
+ }
3101
+ return text;
3102
+ }
3103
+ function nameLike(value) {
3104
+ const text = String(value ?? "").trim();
3105
+ if (!text || /^\d{16,}$/.test(text)) return null;
3106
+ return text;
3107
+ }
3108
+ async function resolveCurrentUserName(host) {
3109
+ try {
3110
+ const session = await host.getSession();
3111
+ const baseUrl = String(session?.baseUrl || "");
3112
+ if (!baseUrl) return "";
3113
+ const resp = await fetch(
3114
+ `${baseUrl}/api/baseserver/layout/teamsCheck?clientType=not_xinchuang&client=WEB&domainName=${encodeURIComponent(baseUrl)}`,
3115
+ {
3116
+ method: "POST",
3117
+ headers: {
3118
+ accept: "application/json",
3119
+ "content-type": "application/json",
3120
+ eteamsid: String(session?.eteamsId || ""),
3121
+ cookie: typeof session?.cookieHeader === "function" ? session.cookieHeader() : "",
3122
+ "user-agent": typeof session?.uaHeader === "function" ? session.uaHeader() : "weaver-work-cli",
3123
+ origin: baseUrl
3124
+ },
3125
+ redirect: "manual"
3126
+ }
3127
+ );
3128
+ const data = await resp.json().catch(() => ({}));
3129
+ const cu = data.currentUser ?? data.data?.currentUser ?? null;
3130
+ return cu ? String(cu.username ?? cu.id ?? "") : "";
3131
+ } catch {
3132
+ return "";
3133
+ }
3134
+ }
3135
+ var interviewFeedbackTodo = {
3136
+ name: "ehr.recruit.interview.feedbackTodo",
3137
+ resource: "recruit",
3138
+ method: "interview.feedbackTodo",
3139
+ action: "ehr.recruit.interview.feedbackTodo",
3140
+ summary: "\u9762\u8BD5\u5F85\u529E\uFF1A**\u53EA\u8FD4\u56DE\u6211\u4F5C\u4E3A\u9762\u8BD5\u5B98\u7684 AI \u9762\u8BD5\u5F85\u53CD\u9988\u6E05\u5355**\uFF08\u5019\u9009\u4EBA\u5DF2\u7B54\u5B8C\u3001\u5DF2\u6709\u5F55\u50CF\u3001\u6211\u8FD8\u6CA1\u586B\u610F\u89C1\uFF09\uFF1B\u6309\u9700\u7FFB\u9875 + \u5BA2\u6237\u7AEF\u7B5B\u9009\uFF0C\u4E0D\u8FD4\u56DE\u5168\u91CF\u9762\u8BD5",
3141
+ capability: "recruit",
3142
+ risk: READ,
3143
+ inputSchema: schemaOf({
3144
+ maxPages: { type: "integer", minimum: 1, maximum: 50, description: "\u6700\u591A\u7FFB\u9875\u6570\uFF08\u9ED8\u8BA4 5\uFF09" },
3145
+ pageSize: { type: "integer", minimum: 1, maximum: 200, description: "\u5355\u9875\u6761\u6570\uFF08\u9ED8\u8BA4 200\uFF0C\u5B9E\u6D4B\u670D\u52A1\u7AEF\u4E0A\u9650 200\uFF09" }
3146
+ }),
3147
+ handler: async (args, env) => {
3148
+ if (!env.recruitContext) throw ehrValidationError("recruit_context_unavailable", "\u62DB\u8058\u4E0A\u4E0B\u6587\u52A0\u8F7D\u5668\u672A\u521D\u59CB\u5316");
3149
+ const cache = await env.recruitContext.load(env.host);
3150
+ const listParam = cache.lists.interview;
3151
+ const form = cache.forms.interview_plan;
3152
+ if (!listParam?.listId || !form?.objId) {
3153
+ throw new RecruitContextError(
3154
+ "recruit_list_unavailable",
3155
+ "\u5F53\u524D\u73AF\u5883\u672A\u542F\u7528\u300C\u9762\u8BD5\u7BA1\u7406\u300D\u529F\u80FD\uFF08\u672A\u627E\u5230\u9762\u8BD5\u5217\u8868/\u8868\u5355\u53C2\u6570\uFF0C\u6309\u80FD\u529B\u63A2\u6D4B\u62E6\u622A\uFF09\u3002"
3156
+ );
3157
+ }
3158
+ const pageSize = toNumber(args.pageSize, "pageSize") ?? 200;
3159
+ const maxPages = toNumber(args.maxPages, "maxPages") ?? 5;
3160
+ const me = await resolveCurrentUserName(env.host);
3161
+ const fields = cache.fields[form.objId] || {};
3162
+ const fieldOpts = cache.field_options[form.objId] || {};
3163
+ const statusOpts = fieldOpts[fields.union_status] || {};
3164
+ const typeOpts = fieldOpts[fields.interview_type] || {};
3165
+ const toCn = (map, raw) => {
3166
+ const text = String(raw ?? "");
3167
+ return map[text] ?? text;
3168
+ };
3169
+ const statusOf = (row) => toCn(statusOpts, row?.union_status_key ?? row?.union_status);
3170
+ const typeOf = (row) => toCn(typeOpts, row?.interview_type_key ?? row?.interview_type);
3171
+ const interviewerOf = (row) => personNames(row?.interviewer);
3172
+ const scanned = [];
3173
+ let lastPageCount = 0;
3174
+ for (let i = 0; i < maxPages; i++) {
3175
+ const body = buildListBody({
3176
+ listId: listParam.listId,
3177
+ cusMenuId: listParam.cusMenuId,
3178
+ menuName: listParam.menuName || "\u9762\u8BD5\u7BA1\u7406",
3179
+ title: "\u9762\u8BD5\u7BA1\u7406",
3180
+ current: i + 1,
3181
+ pageSize
3182
+ });
3183
+ const page = await fetchListRows(env.host, form.objId, listParam.listId, body);
3184
+ const use = page.displayRows && page.displayRows.length ? page.displayRows : page.rows;
3185
+ scanned.push(...use);
3186
+ lastPageCount = use.length;
3187
+ if (use.length < pageSize) break;
3188
+ }
3189
+ const pending = scanned.filter((row) => /待反馈/.test(statusOf(row)));
3190
+ const mineAll = me ? pending.filter((row) => interviewerOf(row).includes(me)) : [];
3191
+ const mineAi = mineAll.filter((row) => /AI\s*面试/i.test(typeOf(row)));
3192
+ const slim = (row) => ({
3193
+ form_data_id: row?.form_data_id ?? row?.id ?? null,
3194
+ candidate_name: nameLike(row?.candidate_name) ?? nameLike(row?.talent_id) ?? nameLike(row?.name),
3195
+ position_name: nameLike(row?.position_name) ?? nameLike(row?.position_manage_id),
3196
+ start_time: row?.start_time ?? null,
3197
+ interview_type_key: typeOf(row) || null,
3198
+ interview_session: row?.interview_session ?? null,
3199
+ interviewer: interviewerOf(row) || null,
3200
+ union_status_key: statusOf(row) || null,
3201
+ subject: row?.subject ?? null,
3202
+ talent_id: row?.talent_id ?? null,
3203
+ position_manage_id: row?.position_manage_id ?? null
3204
+ });
3205
+ const notes = [];
3206
+ if (!me) notes.push("\u672A\u80FD\u89E3\u6790\u5F53\u524D\u767B\u5F55\u4EBA\u59D3\u540D\uFF08teamsCheck \u5931\u8D25\uFF09\uFF0C\u65E0\u6CD5\u6309\u9762\u8BD5\u5B98\u8FC7\u6EE4");
3207
+ if (lastPageCount >= pageSize && scanned.length >= pageSize * maxPages) {
3208
+ notes.push(`\u5DF2\u626B\u63CF ${scanned.length} \u6761\uFF08\u8FBE maxPages=${maxPages} \u4E0A\u9650\uFF09\uFF0C\u5982\u6000\u7591\u9057\u6F0F\u53EF\u52A0\u5927 maxPages`);
3209
+ }
3210
+ return ehrSuccess("ehr.recruit.interview.feedbackTodo", {
3211
+ currentUser: me || null,
3212
+ scanned: scanned.length,
3213
+ myAiPendingFeedback: { count: mineAi.length, rows: mineAi.map(slim) },
3214
+ myOtherPendingFeedback: {
3215
+ count: mineAll.length - mineAi.length,
3216
+ rows: mineAll.filter((row) => !/AI\s*面试/i.test(typeOf(row))).map(slim)
3217
+ },
3218
+ ...notes.length ? { note: notes.join("\uFF1B") } : {}
3219
+ });
3220
+ }
3221
+ };
3088
3222
  var candidateCard = {
3089
3223
  name: "ehr.recruit.candidate.card",
3090
3224
  resource: "recruit",
@@ -3199,7 +3333,8 @@ var recruitOperations = [
3199
3333
  contextResolve,
3200
3334
  candidateSearch,
3201
3335
  candidateList,
3202
- candidateCard
3336
+ candidateCard,
3337
+ interviewFeedbackTodo
3203
3338
  ];
3204
3339
 
3205
3340
  // src/shortcuts/ehr/operations/recruit-write.ts
@@ -3230,6 +3365,24 @@ async function requireRecruitCache(env) {
3230
3365
  }
3231
3366
  return env.recruitContext.load(env.host);
3232
3367
  }
3368
+ function recruitTalentCardUrl(cache, baseUrl, talentId) {
3369
+ if (!cache.ebdDetailPageId || !talentId) return null;
3370
+ const extra = String(cache.selfUse) === "1" ? "&recruitType=useSelf" : "";
3371
+ return `${baseUrl.replace(/\/+$/, "")}/sp/ebdpage/view/${cache.ebdDetailPageId}?talentId=${talentId}${extra}`;
3372
+ }
3373
+ function recruitSlideLocateUrl(cache, baseUrl, listKey, formKey, dataId) {
3374
+ const listId = cache.lists?.[listKey]?.listId;
3375
+ const objId = cache.forms?.[formKey]?.objId;
3376
+ if (!listId || !objId || !dataId || !cache.appId) return null;
3377
+ const base = baseUrl.replace(/\/+$/, "");
3378
+ return `${base}/sp/ebdfpage/list/${listId}/card/0/${objId}/${dataId}/${listId}?id=${dataId}&openSource=field&openSourceId=${dataId}&openSourceAppId=${cache.appId}`;
3379
+ }
3380
+ function recruitOpenListUrl(cache, baseUrl, listKey, talentId) {
3381
+ const menu = cache.lists?.[listKey];
3382
+ if (!menu?.listId) return null;
3383
+ const extra = talentId ? `?talentId=${talentId}${String(cache.selfUse) === "1" ? "&recruitType=useSelf" : ""}` : "";
3384
+ return `${baseUrl.replace(/\/+$/, "")}/sp/ebdfpage/list/${menu.listId}${extra}`;
3385
+ }
3233
3386
  async function checkDuplicateByMobile(env, cache, mobile) {
3234
3387
  const talent = cache.lists.talent;
3235
3388
  const objId = cache.forms.talent_pool?.objId;
@@ -3694,7 +3847,9 @@ var candidateCreateApply = {
3694
3847
  status: "COMPLETE",
3695
3848
  talentId: newId,
3696
3849
  initTalentBatch: initMsg,
3697
- searchHint: `\u53EF\u7528 ehr.recruit.candidate.search \u6309 name=${name} \u6216 mobile=${mobile} \u56DE\u67E5`
3850
+ searchHint: `\u53EF\u7528 ehr.recruit.candidate.search \u6309 name=${name} \u6216 mobile=${mobile} \u56DE\u67E5`,
3851
+ talentCardUrl: recruitTalentCardUrl(cache, lease.baseUrl, newId),
3852
+ talentListLocateUrl: recruitOpenListUrl(cache, lease.baseUrl, "talent", newId)
3698
3853
  });
3699
3854
  }
3700
3855
  };
@@ -3918,7 +4073,9 @@ var interviewArrangeApply = {
3918
4073
  assigned: assigned?.data || {},
3919
4074
  candidate: `${plan.candidateName}\uFF08talentId=${args.talentId}\uFF09`,
3920
4075
  time: plan.interviewTime,
3921
- interviewer: plan.interviewer
4076
+ interviewer: plan.interviewer,
4077
+ talentCardUrl: recruitTalentCardUrl(cache, lease.baseUrl, args.talentId),
4078
+ interviewLocateUrl: recruitSlideLocateUrl(cache, lease.baseUrl, "interview", "interview_plan", planFormId)
3922
4079
  });
3923
4080
  }
3924
4081
  };
@@ -4169,7 +4326,9 @@ var offerSendApply = {
4169
4326
  validateOffer: "\u901A\u8FC7",
4170
4327
  sendOffer: "SUCCESS",
4171
4328
  runEsb: { successNum: esbResult.successNum, failNum: esbResult.failNum, msg: esbResult.successMsg },
4172
- nextStep: "\u56DE\u67E5 offer_status_select \u5E94\u5DF2\u53D8\u66F4\u4E3A\u300C\u5DF2\u53D1\u9001\u5F85\u53CD\u9988\u300D"
4329
+ nextStep: "\u56DE\u67E5 offer_status_select \u5E94\u5DF2\u53D8\u66F4\u4E3A\u300C\u5DF2\u53D1\u9001\u5F85\u53CD\u9988\u300D",
4330
+ talentCardUrl: recruitTalentCardUrl(cache, lease.baseUrl, payload.talentId),
4331
+ offerListUrl: recruitOpenListUrl(cache, lease.baseUrl, "offer")
4173
4332
  });
4174
4333
  }
4175
4334
  };
@@ -4448,7 +4607,8 @@ var entryProcessApply = {
4448
4607
  saveFormData: "\u5DF2\u66F4\u65B0",
4449
4608
  saveEstPreEntry: "\u5DF2\u843D\u8D26\u53F7",
4450
4609
  runEsb: { successNum: esbResult.successNum, failNum: esbResult.failNum, msg: esbResult.successMsg },
4451
- nextStep: "\u56DE\u67E5\u5165\u804C\u5217\u8868 transact_status \u5E94\u7531 1 \u53D8\u4E3A 2"
4610
+ nextStep: "\u56DE\u67E5\u5165\u804C\u5217\u8868 transact_status \u5E94\u7531 1 \u53D8\u4E3A 2",
4611
+ entryListUrl: recruitOpenListUrl(cache, lease.baseUrl, "entry")
4452
4612
  });
4453
4613
  }
4454
4614
  };
@@ -4677,7 +4837,8 @@ var feedbackEditApply = {
4677
4837
  feedbackId: payload.feedbackId,
4678
4838
  saved: Boolean(savedId),
4679
4839
  verify: backFeedback ? { result: backFeedback.result, comment: backFeedback.judgement, changed } : "\u56DE\u67E5\u672A\u53D6\u5230\u8BE5\u53CD\u9988",
4680
- ...changed ? {} : { warning: "\u56DE\u67E5\u672A\u786E\u8BA4\u53D8\u66F4\u751F\u6548\uFF0C\u8BF7\u4EBA\u5DE5\u5728 E10 \u4E2D\u6838\u5BF9\u9762\u8BD5\u53CD\u9988\uFF0C\u7981\u6B62\u81EA\u52A8\u91CD\u8BD5" }
4840
+ ...changed ? {} : { warning: "\u56DE\u67E5\u672A\u786E\u8BA4\u53D8\u66F4\u751F\u6548\uFF0C\u8BF7\u4EBA\u5DE5\u5728 E10 \u4E2D\u6838\u5BF9\u9762\u8BD5\u53CD\u9988\uFF0C\u7981\u6B62\u81EA\u52A8\u91CD\u8BD5" },
4841
+ talentCardUrl: recruitTalentCardUrl(cache, lease.baseUrl, payload.talentId)
4681
4842
  });
4682
4843
  }
4683
4844
  };
@@ -4796,6 +4957,7 @@ var feedbackUrgeApply = {
4796
4957
  requireConfirm2(args, "ehr.recruit.candidate.interview.feedback.urge.apply");
4797
4958
  const lease = await verifyLease2(args, "ehr.recruit.candidate.interview.feedback.urge.apply", env);
4798
4959
  const payload = lease.payload || {};
4960
+ const cache = await requireRecruitCache(env);
4799
4961
  if (!payload.feedbackRecordId || !payload.esbActionId || !payload.interviewDetailObjId) {
4800
4962
  throw ehrValidationError("continuation_payload_invalid", "continuation \u7F3A\u5C11\u50AC\u8BC4\u53C2\u6570\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C prepare");
4801
4963
  }
@@ -4814,7 +4976,8 @@ var feedbackUrgeApply = {
4814
4976
  return ehrSuccess("ehr.recruit.candidate.interview.feedback.urge.apply", {
4815
4977
  status: "COMPLETE",
4816
4978
  feedbackRecordId: payload.feedbackRecordId,
4817
- runEsb: { successNum: esbResult.successNum, failNum: esbResult.failNum, msg: esbResult.successMsg }
4979
+ runEsb: { successNum: esbResult.successNum, failNum: esbResult.failNum, msg: esbResult.successMsg },
4980
+ talentCardUrl: recruitTalentCardUrl(cache, lease.baseUrl, payload.talentId)
4818
4981
  });
4819
4982
  }
4820
4983
  };
@@ -9,15 +9,15 @@ import {
9
9
  assertNoForbiddenKeys,
10
10
  esbManifest,
11
11
  getEsbOperation
12
- } from "./chunk-KAS45KNR.js";
12
+ } from "./chunk-6LLJFKJE.js";
13
13
  import {
14
14
  createEsbHost
15
- } from "./chunk-ILMBNVSG.js";
15
+ } from "./chunk-I6QGIBDM.js";
16
16
  import {
17
17
  esbValidationError
18
18
  } from "./chunk-GPMFD4RD.js";
19
- import "./chunk-6ATGWRZM.js";
20
- import "./chunk-D223PTXU.js";
19
+ import "./chunk-JUXVYKII.js";
20
+ import "./chunk-JNG42JKG.js";
21
21
  import {
22
22
  isCliError,
23
23
  toErrorEnvelope
@@ -4,11 +4,11 @@ import {
4
4
  E10ApiError,
5
5
  createE10RequestRuntime,
6
6
  requireE10Session
7
- } from "./chunk-6ATGWRZM.js";
7
+ } from "./chunk-JUXVYKII.js";
8
8
  import {
9
9
  E10_SESSION_EXPIRED_MESSAGE,
10
10
  getActiveProfile
11
- } from "./chunk-D223PTXU.js";
11
+ } from "./chunk-JNG42JKG.js";
12
12
  import {
13
13
  CliError,
14
14
  isCliError,
@@ -719,6 +719,7 @@ var MAX_ROWS_LIMIT = 5e3;
719
719
  var USER_INPUT_LIMIT = 500;
720
720
  var BLOCKED_MESSAGE = /拦截|高危|安全校验/;
721
721
  var CLARIFY_MESSAGE = /不明确|请补充|补充查询/;
722
+ var PERMISSION_DENIED_MESSAGE = /权限|越权/;
722
723
  function requireUserInput(value) {
723
724
  if (typeof value !== "string" || value.trim().length === 0) {
724
725
  throw fnaValidationError("user_input_required", "userInput \u5FC5\u586B\uFF08\u81EA\u7136\u8BED\u8A00\u95EE\u9898\uFF0C\u4E0D\u80FD\u4E3A\u7A7A\u767D\uFF09");
@@ -773,8 +774,9 @@ function collectColumns(rows) {
773
774
  return columns;
774
775
  }
775
776
  function classifyMessage(message) {
776
- if (BLOCKED_MESSAGE.test(message)) return "blocked";
777
- if (CLARIFY_MESSAGE.test(message)) return "clarify";
777
+ if (PERMISSION_DENIED_MESSAGE.test(message)) return { kind: "clarify", permissionDenied: true };
778
+ if (BLOCKED_MESSAGE.test(message)) return { kind: "blocked", permissionDenied: false };
779
+ if (CLARIFY_MESSAGE.test(message)) return { kind: "clarify", permissionDenied: false };
778
780
  return void 0;
779
781
  }
780
782
  function normalizeChart(data, maxRows) {
@@ -807,9 +809,12 @@ function normalizeChart(data, maxRows) {
807
809
  });
808
810
  }
809
811
  if (typeof data === "string") {
810
- const kind = classifyMessage(data);
811
- if (kind) {
812
- return fnaSuccess("fna.expense.chart", { kind, message: data }, { messageKindInferred: true });
812
+ const classified = classifyMessage(data);
813
+ if (classified) {
814
+ return fnaSuccess("fna.expense.chart", { kind: classified.kind, message: data }, {
815
+ messageKindInferred: true,
816
+ permissionDenied: classified.permissionDenied
817
+ });
813
818
  }
814
819
  }
815
820
  return fnaSuccess("fna.expense.chart", { kind: "unexpected" }, { dataType: dataTypeOf(data) });
@@ -819,7 +824,7 @@ var fnaExpenseChart = {
819
824
  resource: "expense",
820
825
  method: "expense.chart",
821
826
  action: "fna.expense.chart",
822
- summary: "\u62A5\u9500\u62A5\u8868 AI \u95EE\u7B54\uFF1A\u7528\u81EA\u7136\u8BED\u8A00\u67E5\u8BE2\u5206\u7EC4/\u6392\u540D/\u8D8B\u52BF\uFF0C\u8FD4\u56DE kind=rows/empty/clarify/blocked/unexpected\uFF1BmaxRows \u53EA\u622A\u65AD\u672C\u5730\u5C55\u793A",
827
+ summary: "\u62A5\u9500\u62A5\u8868 AI \u95EE\u7B54\uFF1A\u7528\u81EA\u7136\u8BED\u8A00\u67E5\u8BE2\u5206\u7EC4/\u6392\u540D/\u8D8B\u52BF\uFF0C\u8FD4\u56DE kind=rows/empty/clarify/blocked/unexpected\uFF1B\u65E0\u6743\u9650\u6587\u6848\u989D\u5916\u8FD4\u56DE meta.permissionDenied=true\uFF0C\u6B64\u65F6\u5FC5\u987B\u505C\u4F4F\u3001\u4E0D\u5F97\u6539\u8C03\u5176\u5B83\u63A5\u53E3\u62FC\u6570\u636E\uFF1BmaxRows \u53EA\u622A\u65AD\u672C\u5730\u5C55\u793A",
823
828
  capability: "expense-chart",
824
829
  risk: READ,
825
830
  inputSchema: schemaOf(
@@ -5,10 +5,10 @@ import {
5
5
  extractApiBusinessError,
6
6
  isAtustRedirect,
7
7
  isLoginExpired
8
- } from "./chunk-PRHJGPMA.js";
8
+ } from "./chunk-VPXOPQJI.js";
9
9
  import "./chunk-FMPJJYYI.js";
10
- import "./chunk-6ATGWRZM.js";
11
- import "./chunk-D223PTXU.js";
10
+ import "./chunk-JUXVYKII.js";
11
+ import "./chunk-JNG42JKG.js";
12
12
  import "./chunk-LUSPKZKY.js";
13
13
  import "./chunk-BUSC6UAE.js";
14
14
  export {
@@ -6,10 +6,10 @@ import {
6
6
  createEsbHost,
7
7
  isEsbFlowUnavailable,
8
8
  triggerResultCode
9
- } from "./chunk-ILMBNVSG.js";
9
+ } from "./chunk-I6QGIBDM.js";
10
10
  import "./chunk-GPMFD4RD.js";
11
- import "./chunk-6ATGWRZM.js";
12
- import "./chunk-D223PTXU.js";
11
+ import "./chunk-JUXVYKII.js";
12
+ import "./chunk-JNG42JKG.js";
13
13
  import "./chunk-LUSPKZKY.js";
14
14
  import "./chunk-BUSC6UAE.js";
15
15
  export {
@@ -7,10 +7,10 @@ import {
7
7
  dirname,
8
8
  mkdir,
9
9
  writeFile
10
- } from "./chunk-RBGOMK4Y.js";
10
+ } from "./chunk-T72N74ZT.js";
11
11
  import "./chunk-ZEDWSH32.js";
12
- import "./chunk-6ATGWRZM.js";
13
- import "./chunk-D223PTXU.js";
12
+ import "./chunk-JUXVYKII.js";
13
+ import "./chunk-JNG42JKG.js";
14
14
  import "./chunk-LUSPKZKY.js";
15
15
  import "./chunk-BUSC6UAE.js";
16
16
  export {
@@ -7,10 +7,10 @@ import {
7
7
  pickEbuilderDataKey,
8
8
  resolveApiPrefix,
9
9
  routeEbuilderPath
10
- } from "./chunk-WRRJ4GG2.js";
10
+ } from "./chunk-QYGO5EE2.js";
11
11
  import "./chunk-BYATLLEF.js";
12
- import "./chunk-6ATGWRZM.js";
13
- import "./chunk-D223PTXU.js";
12
+ import "./chunk-JUXVYKII.js";
13
+ import "./chunk-JNG42JKG.js";
14
14
  import "./chunk-LUSPKZKY.js";
15
15
  import "./chunk-BUSC6UAE.js";
16
16
  export {
@@ -4,10 +4,10 @@ import {
4
4
  businessMessage,
5
5
  createHrmHost,
6
6
  isBusinessSuccess
7
- } from "./chunk-Q6LWB5HX.js";
7
+ } from "./chunk-NCOVUAZK.js";
8
8
  import "./chunk-OOUTBLZ4.js";
9
- import "./chunk-6ATGWRZM.js";
10
- import "./chunk-D223PTXU.js";
9
+ import "./chunk-JUXVYKII.js";
10
+ import "./chunk-JNG42JKG.js";
11
11
  import "./chunk-LUSPKZKY.js";
12
12
  import "./chunk-BUSC6UAE.js";
13
13
  export {
@@ -2,7 +2,7 @@ import { createRequire as __esbuildCreateRequire } from 'node:module';
2
2
  const require = __esbuildCreateRequire(import.meta.url);
3
3
  import {
4
4
  createHrmHost
5
- } from "./chunk-Q6LWB5HX.js";
5
+ } from "./chunk-NCOVUAZK.js";
6
6
  import {
7
7
  getHrmOperation,
8
8
  hrmOperationDefinitions
@@ -14,8 +14,8 @@ import {
14
14
  import {
15
15
  hrmValidationError
16
16
  } from "./chunk-OOUTBLZ4.js";
17
- import "./chunk-6ATGWRZM.js";
18
- import "./chunk-D223PTXU.js";
17
+ import "./chunk-JUXVYKII.js";
18
+ import "./chunk-JNG42JKG.js";
19
19
  import {
20
20
  isCliError,
21
21
  toErrorEnvelope
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-2LV74IWP.js";
9
9
  import {
10
10
  createImHost
11
- } from "./chunk-RBGOMK4Y.js";
11
+ } from "./chunk-T72N74ZT.js";
12
12
  import {
13
13
  createImContinuationSigner
14
14
  } from "./chunk-P26ZWSKU.js";
@@ -16,8 +16,8 @@ import {
16
16
  imValidationError
17
17
  } from "./chunk-ZEDWSH32.js";
18
18
  import "./chunk-YLCYX7LE.js";
19
- import "./chunk-6ATGWRZM.js";
20
- import "./chunk-D223PTXU.js";
19
+ import "./chunk-JUXVYKII.js";
20
+ import "./chunk-JNG42JKG.js";
21
21
  import {
22
22
  isCliError,
23
23
  toErrorEnvelope
@@ -7,9 +7,9 @@ import {
7
7
  invoicePartialError,
8
8
  invoiceValidationError,
9
9
  isInvoiceNetworkError
10
- } from "./chunk-EEWPQE3O.js";
11
- import "./chunk-6ATGWRZM.js";
12
- import "./chunk-D223PTXU.js";
10
+ } from "./chunk-JCSN3JGM.js";
11
+ import "./chunk-JUXVYKII.js";
12
+ import "./chunk-JNG42JKG.js";
13
13
  import {
14
14
  isCliError,
15
15
  toErrorEnvelope
@@ -4,11 +4,11 @@ import {
4
4
  E10ApiError,
5
5
  createE10RequestRuntime,
6
6
  requireE10Session
7
- } from "./chunk-6ATGWRZM.js";
7
+ } from "./chunk-JUXVYKII.js";
8
8
  import {
9
9
  E10_SESSION_EXPIRED_MESSAGE,
10
10
  getActiveProfile
11
- } from "./chunk-D223PTXU.js";
11
+ } from "./chunk-JNG42JKG.js";
12
12
  import {
13
13
  CliError,
14
14
  isCliError,
@@ -5,12 +5,12 @@ import {
5
5
  createProgram,
6
6
  registerCommands,
7
7
  toCommandMetadata
8
- } from "./chunk-GFPXQIY2.js";
8
+ } from "./chunk-JYKABYCV.js";
9
9
  import "./chunk-EG6ZU444.js";
10
10
  import "./chunk-AJ62BGAW.js";
11
- import "./chunk-EEWPQE3O.js";
12
- import "./chunk-6ATGWRZM.js";
13
- import "./chunk-D223PTXU.js";
11
+ import "./chunk-JCSN3JGM.js";
12
+ import "./chunk-JUXVYKII.js";
13
+ import "./chunk-JNG42JKG.js";
14
14
  import "./chunk-LUSPKZKY.js";
15
15
  import "./chunk-BUSC6UAE.js";
16
16