@sireai/optimus 0.1.44 → 0.1.46

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 (92) hide show
  1. package/dist/cli/feedback-delivery.js +13 -8
  2. package/dist/cli/feedback-delivery.js.map +1 -1
  3. package/dist/cli/optimus.js +370 -63
  4. package/dist/cli/optimus.js.map +1 -1
  5. package/dist/integrations/feishu/feishu-client.d.ts +13 -0
  6. package/dist/integrations/feishu/feishu-client.js +111 -6
  7. package/dist/integrations/feishu/feishu-client.js.map +1 -1
  8. package/dist/integrations/feishu/feishu-reference-material-downloader.d.ts +34 -0
  9. package/dist/integrations/feishu/feishu-reference-material-downloader.js +572 -0
  10. package/dist/integrations/feishu/feishu-reference-material-downloader.js.map +1 -0
  11. package/dist/integrations/feishu/feishu-token-store.d.ts +25 -1
  12. package/dist/integrations/feishu/feishu-token-store.js +148 -4
  13. package/dist/integrations/feishu/feishu-token-store.js.map +1 -1
  14. package/dist/integrations/feishu/feishu-user-auth-service.d.ts +39 -0
  15. package/dist/integrations/feishu/feishu-user-auth-service.js +228 -0
  16. package/dist/integrations/feishu/feishu-user-auth-service.js.map +1 -0
  17. package/dist/integrations/jira/jira-cli.js +127 -19
  18. package/dist/integrations/jira/jira-cli.js.map +1 -1
  19. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.d.ts +12 -0
  20. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js +105 -0
  21. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js.map +1 -0
  22. package/dist/task-environment/delivery/commit-message/commit-message-builder.js +2 -1
  23. package/dist/task-environment/delivery/commit-message/commit-message-builder.js.map +1 -1
  24. package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +6 -0
  25. package/dist/task-environment/delivery/feishu-analysis-doc-service.js +106 -34
  26. package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
  27. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js +16 -1
  28. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js.map +1 -1
  29. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.d.ts +6 -0
  30. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js +19 -0
  31. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js.map +1 -1
  32. package/dist/task-environment/delivery/feishu-notifier.js +13 -11
  33. package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
  34. package/dist/task-environment/delivery/feishu-templates/coder-message-template.d.ts +6 -0
  35. package/dist/task-environment/delivery/feishu-templates/coder-message-template.js +58 -0
  36. package/dist/task-environment/delivery/feishu-templates/coder-message-template.js.map +1 -0
  37. package/dist/task-environment/delivery/feishu-templates/template-registry.js +2 -0
  38. package/dist/task-environment/delivery/feishu-templates/template-registry.js.map +1 -1
  39. package/dist/task-environment/delivery/task-delivery-dispatcher.js +6 -0
  40. package/dist/task-environment/delivery/task-delivery-dispatcher.js.map +1 -1
  41. package/dist/task-environment/delivery/task-delivery-service.d.ts +1 -0
  42. package/dist/task-environment/delivery/task-delivery-service.js +124 -8
  43. package/dist/task-environment/delivery/task-delivery-service.js.map +1 -1
  44. package/dist/task-environment/delivery/task-publication-service.js +9 -6
  45. package/dist/task-environment/delivery/task-publication-service.js.map +1 -1
  46. package/dist/task-environment/document-input/document-structure.d.ts +13 -0
  47. package/dist/task-environment/document-input/document-structure.js +438 -0
  48. package/dist/task-environment/document-input/document-structure.js.map +1 -0
  49. package/dist/task-environment/intake/manual-problem-intake.js +36 -0
  50. package/dist/task-environment/intake/manual-problem-intake.js.map +1 -1
  51. package/dist/task-environment/observability/logger.d.ts +1 -0
  52. package/dist/task-environment/observability/logger.js +26 -0
  53. package/dist/task-environment/observability/logger.js.map +1 -1
  54. package/dist/task-environment/observability/runtime-panel.js +10 -1
  55. package/dist/task-environment/observability/runtime-panel.js.map +1 -1
  56. package/dist/task-environment/orchestration/reference-material-relocator.d.ts +2 -0
  57. package/dist/task-environment/orchestration/reference-material-relocator.js +69 -0
  58. package/dist/task-environment/orchestration/reference-material-relocator.js.map +1 -0
  59. package/dist/task-environment/orchestration/task-orchestrator.d.ts +3 -0
  60. package/dist/task-environment/orchestration/task-orchestrator.js +182 -8
  61. package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
  62. package/dist/task-environment/orchestration/task-package-inputs.js +7 -1
  63. package/dist/task-environment/orchestration/task-package-inputs.js.map +1 -1
  64. package/dist/task-environment/orchestration/task-runtime-policy.js +11 -0
  65. package/dist/task-environment/orchestration/task-runtime-policy.js.map +1 -1
  66. package/dist/task-environment/orchestration/triage-runner.js +3 -0
  67. package/dist/task-environment/orchestration/triage-runner.js.map +1 -1
  68. package/dist/task-environment/runtime/optimus-runtime.js +3 -0
  69. package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
  70. package/dist/task-environment/storage/sqlite-task-store.d.ts +4 -0
  71. package/dist/task-environment/storage/sqlite-task-store.js +70 -1
  72. package/dist/task-environment/storage/sqlite-task-store.js.map +1 -1
  73. package/dist/task-environment/task-handler-descriptor.d.ts +5 -0
  74. package/dist/task-environment/task-handler-descriptor.js +15 -0
  75. package/dist/task-environment/task-handler-descriptor.js.map +1 -0
  76. package/dist/types.d.ts +47 -1
  77. package/embedded-skills/shared/feishu-task-inputs/SKILL.md +56 -0
  78. package/embedded-skills/shared/feishu-task-inputs/scripts/fetch-feishu-doc.mjs +756 -0
  79. package/embedded-skills/shared/feishu-task-inputs/skill.json +5 -0
  80. package/package.json +4 -1
  81. package/task-harnesses/coder/ACCEPT.md +73 -0
  82. package/task-harnesses/coder/CONSTRAINTS.md +72 -0
  83. package/task-harnesses/coder/CONTEXT.md +36 -0
  84. package/task-harnesses/coder/EVOLUTION.md +83 -0
  85. package/task-harnesses/coder/ROLE.md +39 -0
  86. package/task-harnesses/coder/STANDARD.md +258 -0
  87. package/task-harnesses/coder/manifest.json +13 -0
  88. package/task-harnesses/pm/ACCEPT.md +7 -0
  89. package/task-harnesses/pm/CONSTRAINTS.md +5 -0
  90. package/task-harnesses/pm/ROLE.md +5 -8
  91. package/task-harnesses/pm/STANDARD.md +83 -124
  92. package/task-harnesses/registry.json +4 -0
@@ -1,13 +1,20 @@
1
1
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
2
3
  import { dirname, join } from "node:path";
3
4
  import { resolveDefaultDataRootDir } from "../../config/optimus-paths.js";
4
5
  export function resolveDefaultFeishuTokenPath() {
5
6
  return join(resolveDefaultDataRootDir(), "feishu-token.json");
6
7
  }
8
+ export function resolveLegacyFeishuCliTokenPath() {
9
+ return join(homedir(), ".feishu", "auth.json");
10
+ }
7
11
  export class FileFeishuTokenStore {
8
12
  path;
9
- constructor(path = resolveDefaultFeishuTokenPath()) {
13
+ legacyCliPath;
14
+ static LEGACY_IMPORT_DISABLED_FLAG = "legacyImportDisabled";
15
+ constructor(path = resolveDefaultFeishuTokenPath(), legacyCliPath = resolveLegacyFeishuCliTokenPath()) {
10
16
  this.path = path;
17
+ this.legacyCliPath = legacyCliPath;
11
18
  }
12
19
  async readTenantToken() {
13
20
  try {
@@ -24,11 +31,148 @@ export class FileFeishuTokenStore {
24
31
  }
25
32
  }
26
33
  async writeTenantToken(record) {
27
- await mkdir(dirname(this.path), { recursive: true });
28
- await writeFile(this.path, `${JSON.stringify(record, null, 2)}\n`, "utf8");
34
+ const current = await this.readRaw();
35
+ await this.writeRaw({
36
+ ...current,
37
+ tenantAccessToken: record.tenantAccessToken,
38
+ expireAtMs: record.expireAtMs
39
+ });
29
40
  }
30
41
  async clearTenantToken() {
31
- await this.writeTenantToken({ tenantAccessToken: "", expireAtMs: 0 });
42
+ const current = await this.readRaw();
43
+ await this.writeRaw({
44
+ ...current,
45
+ tenantAccessToken: "",
46
+ expireAtMs: 0
47
+ });
48
+ }
49
+ async readUserToken() {
50
+ try {
51
+ const parsed = await this.readRaw();
52
+ const record = normalizeStoredUserTokenRecord(parsed);
53
+ if (record) {
54
+ return record;
55
+ }
56
+ if (parsed[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] === "true") {
57
+ return undefined;
58
+ }
59
+ const imported = await this.readLegacyCliUserToken();
60
+ if (imported) {
61
+ await this.writeUserToken(imported).catch(() => undefined);
62
+ return imported;
63
+ }
64
+ return undefined;
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ async writeUserToken(record) {
71
+ const current = await this.readRaw();
72
+ await this.writeRaw({
73
+ ...current,
74
+ userAccessToken: record.userAccessToken,
75
+ refreshToken: record.refreshToken,
76
+ userExpireAtMs: record.expireAtMs,
77
+ refreshExpireAtMs: record.refreshExpireAtMs,
78
+ ...(record.openId ? { openId: record.openId } : {}),
79
+ ...(record.tenantKey ? { tenantKey: record.tenantKey } : {}),
80
+ ...(record.userId ? { userId: record.userId } : {}),
81
+ source: record.source ?? "optimus",
82
+ [FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG]: "false"
83
+ });
84
+ }
85
+ async clearUserToken() {
86
+ const current = await this.readRaw();
87
+ delete current.userAccessToken;
88
+ delete current.refreshToken;
89
+ delete current.userExpireAtMs;
90
+ delete current.refreshExpireAtMs;
91
+ delete current.openId;
92
+ delete current.tenantKey;
93
+ delete current.userId;
94
+ delete current.source;
95
+ current[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] = "true";
96
+ await this.writeRaw(current);
97
+ }
98
+ async adoptLegacyUserToken() {
99
+ const current = await this.readRaw();
100
+ if (current[FileFeishuTokenStore.LEGACY_IMPORT_DISABLED_FLAG] === "true") {
101
+ return undefined;
102
+ }
103
+ const imported = await this.readLegacyCliUserToken();
104
+ if (!imported) {
105
+ return undefined;
106
+ }
107
+ await this.writeUserToken(imported).catch(() => undefined);
108
+ return imported;
109
+ }
110
+ async readRaw() {
111
+ try {
112
+ return JSON.parse(await readFile(this.path, "utf8"));
113
+ }
114
+ catch {
115
+ return {};
116
+ }
117
+ }
118
+ async readLegacyCliUserToken() {
119
+ try {
120
+ const parsed = JSON.parse(await readFile(this.legacyCliPath, "utf8"));
121
+ const userAccessToken = readTrimmedString(parsed.access_token);
122
+ const refreshToken = readTrimmedString(parsed.refresh_token);
123
+ const expireAtMs = normalizeLegacyEpochMs(parsed.expires_at);
124
+ const refreshExpireAtMs = normalizeLegacyEpochMs(parsed.refresh_expires_at);
125
+ if (!userAccessToken || !refreshToken || !Number.isFinite(expireAtMs) || !Number.isFinite(refreshExpireAtMs)) {
126
+ return undefined;
127
+ }
128
+ return {
129
+ userAccessToken,
130
+ refreshToken,
131
+ expireAtMs,
132
+ refreshExpireAtMs,
133
+ ...(readTrimmedString(parsed.open_id) ? { openId: readTrimmedString(parsed.open_id) } : {}),
134
+ ...(readTrimmedString(parsed.tenant_key) ? { tenantKey: readTrimmedString(parsed.tenant_key) } : {}),
135
+ ...(readTrimmedString(parsed.user_id) ? { userId: readTrimmedString(parsed.user_id) } : {}),
136
+ source: "feishu_cli"
137
+ };
138
+ }
139
+ catch {
140
+ return undefined;
141
+ }
142
+ }
143
+ async writeRaw(payload) {
144
+ await mkdir(dirname(this.path), { recursive: true });
145
+ await writeFile(this.path, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
146
+ }
147
+ }
148
+ function readTrimmedString(value) {
149
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
150
+ }
151
+ function normalizeStoredUserTokenRecord(parsed) {
152
+ const userAccessToken = readTrimmedString(parsed.userAccessToken);
153
+ const refreshToken = readTrimmedString(parsed.refreshToken);
154
+ const expireAtMs = Number(parsed.userExpireAtMs ?? parsed.expireAtMs);
155
+ const refreshExpireAtMs = Number(parsed.refreshExpireAtMs);
156
+ if (!userAccessToken || !refreshToken || !Number.isFinite(expireAtMs) || !Number.isFinite(refreshExpireAtMs)) {
157
+ return undefined;
158
+ }
159
+ const source = readTrimmedString(parsed.source);
160
+ return {
161
+ userAccessToken,
162
+ refreshToken,
163
+ expireAtMs,
164
+ refreshExpireAtMs,
165
+ ...(readTrimmedString(parsed.openId) ? { openId: readTrimmedString(parsed.openId) } : {}),
166
+ ...(readTrimmedString(parsed.tenantKey) ? { tenantKey: readTrimmedString(parsed.tenantKey) } : {}),
167
+ ...(readTrimmedString(parsed.userId) ? { userId: readTrimmedString(parsed.userId) } : {}),
168
+ ...(source === "optimus" || source === "feishu_cli" ? { source } : {})
169
+ };
170
+ }
171
+ function normalizeLegacyEpochMs(value) {
172
+ const numeric = Number(value);
173
+ if (!Number.isFinite(numeric)) {
174
+ return Number.NaN;
32
175
  }
176
+ return numeric > 1e12 ? numeric : numeric * 1000;
33
177
  }
34
178
  //# sourceMappingURL=feishu-token-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feishu-token-store.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-token-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAa1E,MAAM,UAAU,6BAA6B;IAC3C,OAAO,IAAI,CAAC,yBAAyB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,OAAO,oBAAoB;IACK;IAApC,YAAoC,OAAO,6BAA6B,EAAE;QAAtC,SAAI,GAAJ,IAAI,CAAkC;IAAG,CAAC;IAEvE,KAAK,CAAC,eAAe;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqC,CAAC;YACjG,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,MAA+B;QAC3D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;CACF"}
1
+ {"version":3,"file":"feishu-token-store.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-token-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA4B1E,MAAM,UAAU,6BAA6B;IAC3C,OAAO,IAAI,CAAC,yBAAyB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,OAAO,oBAAoB;IAIZ;IACA;IAJX,MAAM,CAAU,2BAA2B,GAAG,sBAAsB,CAAC;IAE7E,YACmB,OAAO,6BAA6B,EAAE,EACtC,gBAAgB,+BAA+B,EAAE;QADjD,SAAI,GAAJ,IAAI,CAAkC;QACtC,kBAAa,GAAb,aAAa,CAAoC;IACjE,CAAC;IAEG,KAAK,CAAC,eAAe;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqC,CAAC;YACjG,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,MAA+B;QAC3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClB,GAAG,OAAO;YACV,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClB,GAAG,OAAO;YACV,iBAAiB,EAAE,EAAE;YACrB,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,IAAI,MAAM,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,KAAK,MAAM,EAAE,CAAC;gBACxE,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACrD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC3D,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAA6B;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClB,GAAG,OAAO;YACV,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,cAAc,EAAE,MAAM,CAAC,UAAU;YACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,EAAE,OAAO;SAC5D,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,eAAe,CAAC;QAC/B,OAAO,OAAO,CAAC,YAAY,CAAC;QAC5B,OAAO,OAAO,CAAC,cAAc,CAAC;QAC9B,OAAO,OAAO,CAAC,iBAAiB,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,OAAO,CAAC,SAAS,CAAC;QACzB,OAAO,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC;QACnE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,oBAAoB;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,KAAK,MAAM,EAAE,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgD,CAAC;QACtG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAgD,CAAC;YACrH,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC5E,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7G,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO;gBACL,eAAe;gBACf,YAAY;gBACZ,UAAU;gBACV,iBAAiB;gBACjB,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5F,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5F,MAAM,EAAE,YAAY;aACrB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAoD;QACzE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;;AAGH,SAAS,iBAAiB,CAAC,KAAkC;IAC3D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAmD;IACzF,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IACtE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3D,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7G,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO;QACL,eAAe;QACf,YAAY;QACZ,UAAU;QACV,iBAAiB;QACjB,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAkC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;AACnD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { OptimusConfig } from "../../types.js";
2
+ import { type FeishuTokenStore, type FeishuUserTokenRecord } from "./feishu-token-store.js";
3
+ export interface FeishuUserAuthServiceOptions {
4
+ config?: Pick<OptimusConfig, "delivery">;
5
+ baseUrl?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ fetchImpl?: typeof globalThis.fetch;
8
+ tokenStore?: FeishuTokenStore;
9
+ openBrowserImpl?: (url: string) => void;
10
+ }
11
+ export interface FeishuDeviceAuthorizationResult {
12
+ verificationUriComplete: string;
13
+ expiresIn: number;
14
+ openId?: string;
15
+ tenantKey?: string;
16
+ userId?: string;
17
+ }
18
+ export declare class FeishuUserAuthService {
19
+ private readonly env;
20
+ private readonly fetchImpl;
21
+ private readonly tokenStore;
22
+ private readonly appConfig;
23
+ private readonly openBrowserImpl;
24
+ constructor(options?: FeishuUserAuthServiceOptions);
25
+ hasAuthorizedUser(): Promise<boolean>;
26
+ readAuthorizedUser(): Promise<FeishuUserTokenRecord | undefined>;
27
+ clearAuthorizedUser(): Promise<void>;
28
+ adoptLegacyCliSession(): Promise<FeishuUserTokenRecord | undefined>;
29
+ loginDeviceCode(options?: {
30
+ openBrowser?: boolean;
31
+ onVerificationUri?: (url: string, expiresIn: number) => void;
32
+ }): Promise<FeishuDeviceAuthorizationResult>;
33
+ private requestDeviceAuthorization;
34
+ private pollDeviceToken;
35
+ refreshUserToken(record: FeishuUserTokenRecord): Promise<FeishuUserTokenRecord>;
36
+ private postOauthToken;
37
+ private tryReadUserInfo;
38
+ private readJsonResponse;
39
+ }
@@ -0,0 +1,228 @@
1
+ import { spawn } from "node:child_process";
2
+ import { platform } from "node:os";
3
+ import { resolveFeishuAuthAppConfig } from "./feishu-auth-config.js";
4
+ import { FileFeishuTokenStore } from "./feishu-token-store.js";
5
+ const FEISHU_USER_AUTH_SCOPES = [
6
+ "docs:doc",
7
+ "docs:doc:readonly",
8
+ "docs:document.media:download",
9
+ "docx:document",
10
+ "docx:document:readonly",
11
+ "wiki:node:read",
12
+ "wiki:wiki",
13
+ "wiki:wiki:readonly",
14
+ "drive:file:readonly",
15
+ "offline_access"
16
+ ].join(" ");
17
+ export class FeishuUserAuthService {
18
+ env;
19
+ fetchImpl;
20
+ tokenStore;
21
+ appConfig;
22
+ openBrowserImpl;
23
+ constructor(options = {}) {
24
+ this.env = options.env ?? process.env;
25
+ this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);
26
+ this.tokenStore = options.tokenStore ?? new FileFeishuTokenStore();
27
+ this.appConfig = resolveFeishuAuthAppConfig(this.env, options.baseUrl
28
+ ? { baseUrl: options.baseUrl }
29
+ : options.config?.delivery.feishu?.baseUrl
30
+ ? { baseUrl: options.config.delivery.feishu.baseUrl }
31
+ : undefined);
32
+ this.openBrowserImpl = options.openBrowserImpl ?? openBrowser;
33
+ }
34
+ async hasAuthorizedUser() {
35
+ return Boolean((await this.tokenStore.readUserToken())?.userAccessToken);
36
+ }
37
+ async readAuthorizedUser() {
38
+ return await this.tokenStore.readUserToken();
39
+ }
40
+ async clearAuthorizedUser() {
41
+ await this.tokenStore.clearUserToken();
42
+ }
43
+ async adoptLegacyCliSession() {
44
+ if (typeof this.tokenStore.adoptLegacyUserToken !== "function") {
45
+ return undefined;
46
+ }
47
+ return await this.tokenStore.adoptLegacyUserToken();
48
+ }
49
+ async loginDeviceCode(options = {}) {
50
+ if (!this.fetchImpl) {
51
+ throw new Error("Feishu user authorization requires global fetch.");
52
+ }
53
+ const deviceAuth = await this.requestDeviceAuthorization();
54
+ options.onVerificationUri?.(deviceAuth.verificationUriComplete, deviceAuth.expiresIn);
55
+ if (options.openBrowser !== false) {
56
+ this.openBrowserImpl(deviceAuth.verificationUriComplete);
57
+ }
58
+ const tokenData = await this.pollDeviceToken(deviceAuth.deviceCode, deviceAuth.interval, deviceAuth.expiresIn);
59
+ await this.tokenStore.writeUserToken(tokenData);
60
+ return {
61
+ verificationUriComplete: deviceAuth.verificationUriComplete,
62
+ expiresIn: deviceAuth.expiresIn,
63
+ ...(tokenData.openId ? { openId: tokenData.openId } : {}),
64
+ ...(tokenData.tenantKey ? { tenantKey: tokenData.tenantKey } : {}),
65
+ ...(tokenData.userId ? { userId: tokenData.userId } : {})
66
+ };
67
+ }
68
+ async requestDeviceAuthorization() {
69
+ const url = `${this.appConfig.accountsBaseUrl}/oauth/v1/device_authorization`;
70
+ const basicAuth = Buffer.from(`${this.appConfig.appId}:${this.appConfig.appSecret}`).toString("base64");
71
+ const body = new URLSearchParams({
72
+ client_id: this.appConfig.appId,
73
+ scope: FEISHU_USER_AUTH_SCOPES
74
+ }).toString();
75
+ const response = await this.fetchImpl(url, {
76
+ method: "POST",
77
+ headers: {
78
+ "content-type": "application/x-www-form-urlencoded",
79
+ authorization: `Basic ${basicAuth}`
80
+ },
81
+ body
82
+ });
83
+ const payload = await this.readJsonResponse(response);
84
+ if (response.status >= 400 || typeof payload.error === "string") {
85
+ throw new Error(`Feishu device authorization failed: ${payload.error_description || payload.error || "unknown_error"}`);
86
+ }
87
+ if (!payload.device_code || !payload.verification_uri_complete) {
88
+ throw new Error("Feishu device authorization returned an incomplete response.");
89
+ }
90
+ return {
91
+ deviceCode: String(payload.device_code),
92
+ verificationUriComplete: String(payload.verification_uri_complete),
93
+ expiresIn: Number(payload.expires_in ?? 600),
94
+ interval: Number(payload.interval ?? 5)
95
+ };
96
+ }
97
+ async pollDeviceToken(deviceCode, intervalSeconds, expiresInSeconds) {
98
+ const deadline = Date.now() + expiresInSeconds * 1000;
99
+ let pollInterval = intervalSeconds;
100
+ while (Date.now() < deadline) {
101
+ await sleep(Math.max(1, pollInterval) * 1000);
102
+ const payload = await this.postOauthToken({
103
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
104
+ device_code: deviceCode,
105
+ client_id: this.appConfig.appId,
106
+ client_secret: this.appConfig.appSecret
107
+ });
108
+ if (!payload.error && payload.access_token) {
109
+ const now = Date.now();
110
+ const tokenRecord = {
111
+ userAccessToken: String(payload.access_token),
112
+ refreshToken: String(payload.refresh_token ?? ""),
113
+ expireAtMs: now + Math.max(60, Number(payload.expires_in ?? 7200)) * 1000,
114
+ refreshExpireAtMs: now + Math.max(60, Number(payload.refresh_token_expires_in ?? 2592000)) * 1000
115
+ };
116
+ const userInfo = await this.tryReadUserInfo(tokenRecord.userAccessToken);
117
+ return {
118
+ ...tokenRecord,
119
+ ...(userInfo.openId ? { openId: userInfo.openId } : {}),
120
+ ...(userInfo.tenantKey ? { tenantKey: userInfo.tenantKey } : {}),
121
+ ...(userInfo.userId ? { userId: userInfo.userId } : {})
122
+ };
123
+ }
124
+ switch (payload.error) {
125
+ case "authorization_pending":
126
+ break;
127
+ case "slow_down":
128
+ pollInterval += 5;
129
+ break;
130
+ case "access_denied":
131
+ throw new Error(readErrorText(payload.error_description) || "Feishu authorization denied by user.");
132
+ case "expired_token":
133
+ case "invalid_grant":
134
+ throw new Error(readErrorText(payload.error_description) || "Feishu device code expired. Please try again.");
135
+ default:
136
+ throw new Error(readErrorText(payload.error_description) || readErrorText(payload.error) || "Feishu authorization failed.");
137
+ }
138
+ }
139
+ throw new Error("Feishu user authorization timed out.");
140
+ }
141
+ async refreshUserToken(record) {
142
+ const payload = await this.postOauthToken({
143
+ grant_type: "refresh_token",
144
+ refresh_token: record.refreshToken,
145
+ client_id: this.appConfig.appId,
146
+ client_secret: this.appConfig.appSecret
147
+ });
148
+ if (!payload.access_token) {
149
+ throw new Error("Feishu user token refresh failed. Run `optimus feishu auth` again.");
150
+ }
151
+ const now = Date.now();
152
+ const refreshed = {
153
+ userAccessToken: String(payload.access_token),
154
+ refreshToken: String(payload.refresh_token ?? record.refreshToken),
155
+ expireAtMs: now + Math.max(60, Number(payload.expires_in ?? 7200)) * 1000,
156
+ refreshExpireAtMs: now + Math.max(60, Number(payload.refresh_token_expires_in ?? 2592000)) * 1000,
157
+ ...(record.openId ? { openId: record.openId } : {}),
158
+ ...(record.tenantKey ? { tenantKey: record.tenantKey } : {}),
159
+ ...(record.userId ? { userId: record.userId } : {})
160
+ };
161
+ await this.tokenStore.writeUserToken(refreshed);
162
+ return refreshed;
163
+ }
164
+ async postOauthToken(body) {
165
+ const response = await this.fetchImpl(`${this.appConfig.baseUrl}/open-apis/authen/v2/oauth/token`, {
166
+ method: "POST",
167
+ headers: {
168
+ "content-type": "application/x-www-form-urlencoded"
169
+ },
170
+ body: new URLSearchParams(body).toString()
171
+ });
172
+ return await this.readJsonResponse(response);
173
+ }
174
+ async tryReadUserInfo(userAccessToken) {
175
+ try {
176
+ const response = await this.fetchImpl(`${this.appConfig.baseUrl}/open-apis/authen/v1/user_info`, {
177
+ method: "GET",
178
+ headers: {
179
+ authorization: `Bearer ${userAccessToken}`
180
+ }
181
+ });
182
+ const payload = await this.readJsonResponse(response);
183
+ const data = (payload.data && typeof payload.data === "object") ? payload.data : {};
184
+ return {
185
+ ...(typeof data.open_id === "string" && data.open_id.trim() ? { openId: data.open_id.trim() } : {}),
186
+ ...(typeof data.tenant_key === "string" && data.tenant_key.trim() ? { tenantKey: data.tenant_key.trim() } : {}),
187
+ ...(typeof data.user_id === "string" && data.user_id.trim() ? { userId: data.user_id.trim() } : {})
188
+ };
189
+ }
190
+ catch {
191
+ return {};
192
+ }
193
+ }
194
+ async readJsonResponse(response) {
195
+ const text = await response.text();
196
+ if (!text.trim()) {
197
+ return {};
198
+ }
199
+ try {
200
+ return JSON.parse(text);
201
+ }
202
+ catch {
203
+ return { raw: text };
204
+ }
205
+ }
206
+ }
207
+ function openBrowser(url) {
208
+ try {
209
+ const os = platform();
210
+ const child = os === "darwin"
211
+ ? spawn("open", [url], { detached: true, stdio: "ignore" })
212
+ : os === "win32"
213
+ ? spawn(`start "" "${url}"`, { shell: true, detached: true, stdio: "ignore" })
214
+ : spawn("xdg-open", [url], { detached: true, stdio: "ignore" });
215
+ child.on("error", () => undefined);
216
+ child.unref();
217
+ }
218
+ catch {
219
+ // noop
220
+ }
221
+ }
222
+ function sleep(ms) {
223
+ return new Promise((resolve) => setTimeout(resolve, ms));
224
+ }
225
+ function readErrorText(value) {
226
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
227
+ }
228
+ //# sourceMappingURL=feishu-user-auth-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-user-auth-service.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-user-auth-service.ts"],"names":[],"mappings":"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"}