cli-jaw 2.2.17 → 2.2.18

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 (135) hide show
  1. package/README.md +4 -0
  2. package/dist/bin/cli-jaw.js +9 -1
  3. package/dist/bin/cli-jaw.js.map +1 -1
  4. package/dist/bin/commands/ask.js +245 -0
  5. package/dist/bin/commands/ask.js.map +1 -0
  6. package/dist/bin/commands/chat.js +41 -3
  7. package/dist/bin/commands/chat.js.map +1 -1
  8. package/dist/bin/commands/dispatch.js +210 -167
  9. package/dist/bin/commands/dispatch.js.map +1 -1
  10. package/dist/bin/commands/init.js +33 -4
  11. package/dist/bin/commands/init.js.map +1 -1
  12. package/dist/bin/commands/slack.js +73 -3
  13. package/dist/bin/commands/slack.js.map +1 -1
  14. package/dist/bin/commands/tui/raw-pipe-mode.js +90 -0
  15. package/dist/bin/commands/tui/raw-pipe-mode.js.map +1 -0
  16. package/dist/bin/commands/tui/simple-mode.js +11 -2
  17. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  18. package/dist/bin/postinstall.js +54 -30
  19. package/dist/bin/postinstall.js.map +1 -1
  20. package/dist/server.js +10 -0
  21. package/dist/server.js.map +1 -1
  22. package/dist/src/agent/pi-runtime.js +10 -2
  23. package/dist/src/agent/pi-runtime.js.map +1 -1
  24. package/dist/src/agent/spawn/queue.js +21 -0
  25. package/dist/src/agent/spawn/queue.js.map +1 -1
  26. package/dist/src/agent/spawn.js +19 -6
  27. package/dist/src/agent/spawn.js.map +1 -1
  28. package/dist/src/cli/cli-status.js +65 -5
  29. package/dist/src/cli/cli-status.js.map +1 -1
  30. package/dist/src/cli/handlers.js +9 -1
  31. package/dist/src/cli/handlers.js.map +1 -1
  32. package/dist/src/cli/tui/jawcode-render.js +18 -5
  33. package/dist/src/cli/tui/jawcode-render.js.map +1 -1
  34. package/dist/src/core/config.js +85 -0
  35. package/dist/src/core/config.js.map +1 -1
  36. package/dist/src/core/exec-name.js +55 -0
  37. package/dist/src/core/exec-name.js.map +1 -0
  38. package/dist/src/core/runtime-settings.js +9 -1
  39. package/dist/src/core/runtime-settings.js.map +1 -1
  40. package/dist/src/core/settings-watch.js +10 -1
  41. package/dist/src/core/settings-watch.js.map +1 -1
  42. package/dist/src/lib/tui/bun-shim.mjs +75 -0
  43. package/dist/src/memory/bootstrap.js +8 -1
  44. package/dist/src/memory/bootstrap.js.map +1 -1
  45. package/dist/src/messaging/channel-validate.js +11 -1
  46. package/dist/src/messaging/channel-validate.js.map +1 -1
  47. package/dist/src/orchestrator/gateway.js +23 -2
  48. package/dist/src/orchestrator/gateway.js.map +1 -1
  49. package/dist/src/orchestrator/pipeline.js +6 -0
  50. package/dist/src/orchestrator/pipeline.js.map +1 -1
  51. package/dist/src/orchestrator/request-registry.js +116 -0
  52. package/dist/src/orchestrator/request-registry.js.map +1 -0
  53. package/dist/src/prompt/templates/a1-system.md +5 -5
  54. package/dist/src/routes/messaging.js +94 -1
  55. package/dist/src/routes/messaging.js.map +1 -1
  56. package/dist/src/routes/settings.js +61 -4
  57. package/dist/src/routes/settings.js.map +1 -1
  58. package/dist/src/routes/system.js +23 -3
  59. package/dist/src/routes/system.js.map +1 -1
  60. package/dist/src/slack/bot.js +36 -1
  61. package/dist/src/slack/bot.js.map +1 -1
  62. package/dist/src/slack/commands.js +29 -1
  63. package/dist/src/slack/commands.js.map +1 -1
  64. package/dist/src/slack/events.js +4 -1
  65. package/dist/src/slack/events.js.map +1 -1
  66. package/dist/src/slack/history.js +10 -3
  67. package/dist/src/slack/history.js.map +1 -1
  68. package/dist/src/slack/identity.js +553 -0
  69. package/dist/src/slack/identity.js.map +1 -0
  70. package/dist/src/slack/ingress.js +42 -0
  71. package/dist/src/slack/ingress.js.map +1 -1
  72. package/dist/src/slack/manifest.js +95 -71
  73. package/dist/src/slack/manifest.js.map +1 -1
  74. package/dist/src/slack/roster.js +180 -0
  75. package/dist/src/slack/roster.js.map +1 -0
  76. package/package.json +4 -3
  77. package/public/css/sidebar.css +29 -51
  78. package/public/dist/assets/AdvancedExport-c41zCkwB.js +1 -0
  79. package/public/dist/assets/{Agent-CNNQ7KkJ.js → Agent-nMPZsMfN.js} +1 -1
  80. package/public/dist/assets/ChannelsSlack-CVNKtoo4.js +1 -0
  81. package/public/dist/assets/{app-Dsgp4xpU.js → app-DqSJmDwP.js} +4 -4
  82. package/public/dist/assets/{app-DjgGeXhJ.css → app-DuyLYRC6.css} +1 -1
  83. package/public/dist/assets/bgtask-badge-CjWz0F6U.js +1 -0
  84. package/public/dist/assets/{bgtask-badge-CpavV0Jc.js → bgtask-badge-D6XYRFI5.js} +1 -1
  85. package/public/dist/assets/{employees-BJyEgim7.js → employees-B_wKPfTO.js} +1 -1
  86. package/public/dist/assets/{iframe-renderer-B8k3AvTv.js → iframe-renderer-D1-zDg8V.js} +2 -2
  87. package/public/dist/assets/iframe-renderer-qRVLHPnT.js +1 -0
  88. package/public/dist/assets/{manager-kXYQyMhR.js → manager-Bjuh1jpq.js} +1 -1
  89. package/public/dist/assets/{memory-D2RbBVO-.js → memory-CNUpXWEC.js} +1 -1
  90. package/public/dist/assets/memory-CcWGiPy_.js +1 -0
  91. package/public/dist/assets/message-history-BamMPUnL.js +1 -0
  92. package/public/dist/assets/{message-history-Bw2E_b8L.js → message-history-DB1rynP-.js} +1 -1
  93. package/public/dist/assets/{render-BkGcpH7z.js → render-DXwQzjsJ.js} +1 -1
  94. package/public/dist/assets/{settings-B1FPORO2.js → settings-CXndjCad.js} +14 -14
  95. package/public/dist/assets/settings-RGpifFHy.js +1 -0
  96. package/public/dist/assets/settings-core-X_5UHfr3.js +1 -0
  97. package/public/dist/assets/settings-core-t5yYVRrv.js +162 -0
  98. package/public/dist/assets/{sidebar-DW78DANx.js → sidebar-DgIj-LuT.js} +3 -3
  99. package/public/dist/assets/skills-CbwIimit.js +1 -0
  100. package/public/dist/assets/{skills-lWi0ZFiV.js → skills-QqxjqDHg.js} +1 -1
  101. package/public/dist/assets/{slash-commands-DYOI6nKj.js → slash-commands-B2V_jngP.js} +1 -1
  102. package/public/dist/assets/slash-commands-tCNRlNTC.js +1 -0
  103. package/public/dist/assets/{trace-drawer-DBX9xzmt.js → trace-drawer-CBe9nRjS.js} +1 -1
  104. package/public/dist/assets/{ui-Bx7eqnXt.js → ui-CDozpEQt.js} +1 -1
  105. package/public/dist/assets/ui-o-VpvrSv.js +1 -0
  106. package/public/dist/index.html +15 -34
  107. package/public/dist/manager/index.html +1 -1
  108. package/public/index.html +13 -32
  109. package/public/js/features/channel-onboarding-flow.ts +25 -2
  110. package/public/js/features/channel-onboarding.ts +111 -8
  111. package/public/js/features/settings-cli-status.ts +18 -4
  112. package/public/js/features/settings-slack.ts +127 -29
  113. package/public/js/features/settings-types.ts +11 -2
  114. package/public/locales/en.json +17 -8
  115. package/public/locales/ja.json +17 -8
  116. package/public/locales/ko.json +17 -8
  117. package/public/locales/zh.json +17 -8
  118. package/public/manager/src/settings/pages/AdvancedExport.tsx +1 -0
  119. package/public/manager/src/settings/pages/Agent.tsx +10 -1
  120. package/public/manager/src/settings/pages/ChannelsSlack.tsx +13 -1
  121. package/scripts/atomic-build.sh +10 -3
  122. package/scripts/release-preview.sh +16 -1
  123. package/scripts/verify-dist-assets.sh +53 -0
  124. package/public/dist/assets/AdvancedExport-DYGcCAUq.js +0 -1
  125. package/public/dist/assets/ChannelsSlack-ybvupgdK.js +0 -1
  126. package/public/dist/assets/bgtask-badge-C6h5C-o4.js +0 -1
  127. package/public/dist/assets/iframe-renderer-BO_GgCTR.js +0 -1
  128. package/public/dist/assets/memory-amsvg4Ey.js +0 -1
  129. package/public/dist/assets/message-history-BGHZxvgV.js +0 -1
  130. package/public/dist/assets/settings-CMN-zN4Q.js +0 -1
  131. package/public/dist/assets/settings-core-B_OjGYVN.js +0 -1
  132. package/public/dist/assets/settings-core-CxRwqx86.js +0 -144
  133. package/public/dist/assets/skills-Dz-9Yrxr.js +0 -1
  134. package/public/dist/assets/slash-commands-xJFCdTTM.js +0 -1
  135. package/public/dist/assets/ui-JOcrYeG-.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/slack/ingress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/slack/ingress.ts"],"names":[],"mappings":"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"}
@@ -9,80 +9,104 @@
9
9
  // and the PKCE localhost flow GA'd 2026-03-30 explicitly bans bot scopes on
10
10
  // desktop redirects. Full analysis: devlog 260803_slack_oauth_setup/000.
11
11
  import { stringify } from 'yaml';
12
- export const SLACK_APP_MANIFEST = {
13
- _metadata: { major_version: 1 },
14
- display_information: {
15
- name: 'cli-jaw',
16
- description: 'AI agent orchestration relay messages to your cli-jaw instance',
17
- },
18
- features: {
19
- bot_user: {
20
- display_name: 'cli-jaw',
21
- always_online: false,
22
- },
23
- // The Messages tab is what gives users a DM composer for the app.
24
- // Without it the im:history/im:write scopes are granted but nobody
25
- // can actually start a DM.
26
- app_home: {
27
- messages_tab_enabled: true,
28
- messages_tab_read_only_enabled: false,
12
+ export const DEFAULT_SLACK_APP_NAME = 'cli-jaw';
13
+ export const MAX_SLACK_APP_NAME_LENGTH = 35;
14
+ function normalizedSlackAppName(appName) {
15
+ const normalized = appName.trim();
16
+ if (!normalized || Array.from(normalized).length > MAX_SLACK_APP_NAME_LENGTH || !/^[a-z0-9._-]+$/.test(normalized)) {
17
+ throw new RangeError(`Slack app name must be 1-${MAX_SLACK_APP_NAME_LENGTH} characters using lowercase letters, numbers, dots, underscores, or hyphens.`);
18
+ }
19
+ return normalized;
20
+ }
21
+ export function createSlackAppManifest(appName = DEFAULT_SLACK_APP_NAME) {
22
+ const name = normalizedSlackAppName(appName);
23
+ return {
24
+ _metadata: { major_version: 1 },
25
+ display_information: {
26
+ name,
27
+ description: 'AI agent orchestration — relay messages to your cli-jaw instance',
29
28
  },
30
- // The `commands` scope AUTHORIZES slash commands; it does not create
31
- // any. cli-jaw routes the received command name through its shared
32
- // command catalog, so any catalog command works once registered here.
33
- // Starter set only — add more from `cli-jaw help` as needed.
34
- slash_commands: [
35
- { command: '/status', description: 'cli-jaw status', usage_hint: '', should_escape: false },
36
- { command: '/model', description: 'Show or switch the model', usage_hint: '[model]', should_escape: false },
37
- { command: '/cli', description: 'Show or switch the CLI engine', usage_hint: '[engine]', should_escape: false },
38
- { command: '/clear', description: 'Clear the conversation', usage_hint: '', should_escape: false },
39
- { command: '/help', description: 'Command list', usage_hint: '[command]', should_escape: false },
40
- ],
41
- },
42
- oauth_config: {
43
- scopes: {
44
- bot: [
45
- // Every scope here maps to a call the transport really makes:
46
- // app_mentions:read -> app_mention envelopes
47
- // channels:history -> message.channels envelopes
48
- // groups:history -> message.groups envelopes
49
- // im:history -> message.im envelopes (DMs; NOT covered by app_mention)
50
- // im:write -> conversations.open (DM a user id)
51
- // chat:write -> chat.postMessage + chat.update/chat.delete
52
- // (live progress status edits its own message)
53
- // files:write -> files.getUploadURLExternal / completeUploadExternal
54
- // commands -> slash_commands envelopes
55
- 'app_mentions:read',
56
- 'channels:history',
57
- 'groups:history',
58
- 'im:history',
59
- 'im:write',
60
- 'chat:write',
61
- // files.info -> files:read; authenticated private downloads use
62
- // the same bot token only after Slack-host and SSRF validation.
63
- 'files:read',
64
- 'files:write',
65
- 'commands',
29
+ features: {
30
+ bot_user: {
31
+ display_name: name,
32
+ always_online: false,
33
+ },
34
+ // The Messages tab is what gives users a DM composer for the app.
35
+ // Without it the im:history/im:write scopes are granted but nobody
36
+ // can actually start a DM.
37
+ app_home: {
38
+ messages_tab_enabled: true,
39
+ messages_tab_read_only_enabled: false,
40
+ },
41
+ // The `commands` scope AUTHORIZES slash commands; it does not create
42
+ // any. cli-jaw routes the received command name through its shared
43
+ // command catalog, so any catalog command works once registered here.
44
+ // Starter set only add more from `cli-jaw help` as needed.
45
+ slash_commands: [
46
+ { command: '/model', description: 'Show or switch the model', usage_hint: '[model]', should_escape: false },
47
+ { command: '/cli', description: 'Show or switch the CLI engine', usage_hint: '[engine]', should_escape: false },
48
+ { command: '/clear', description: 'Clear the conversation', should_escape: false },
49
+ { command: '/help', description: 'Command list', usage_hint: '[command]', should_escape: false },
66
50
  ],
67
51
  },
68
- },
69
- settings: {
70
- event_subscriptions: {
71
- bot_events: [
72
- 'app_mention',
73
- 'message.channels',
74
- 'message.groups',
75
- 'message.im',
76
- ],
52
+ oauth_config: {
53
+ scopes: {
54
+ bot: [
55
+ // Every scope here maps to a call the transport really makes:
56
+ // app_mentions:read -> app_mention envelopes
57
+ // channels:history -> message.channels envelopes
58
+ // groups:history -> message.groups envelopes
59
+ // im:history -> message.im envelopes (DMs; NOT covered by app_mention)
60
+ // im:write -> conversations.open (DM a user id)
61
+ // chat:write -> chat.postMessage + chat.update/chat.delete
62
+ // (live progress status edits its own message)
63
+ // files:write -> files.getUploadURLExternal / completeUploadExternal
64
+ // commands -> slash_commands envelopes
65
+ 'app_mentions:read',
66
+ 'channels:history',
67
+ 'groups:history',
68
+ 'im:history',
69
+ 'im:write',
70
+ 'chat:write',
71
+ // files.info -> files:read; authenticated private downloads use
72
+ // the same bot token only after Slack-host and SSRF validation.
73
+ 'files:read',
74
+ 'files:write',
75
+ // Sender identity and rosters. Existing installs do not get
76
+ // these automatically; without them names degrade to raw ids.
77
+ 'users:read',
78
+ 'team:read',
79
+ 'channels:read',
80
+ 'groups:read',
81
+ 'im:read',
82
+ 'mpim:read',
83
+ 'commands',
84
+ ],
85
+ },
77
86
  },
78
- socket_mode_enabled: true,
79
- org_deploy_enabled: false,
80
- is_hosted: false,
81
- token_rotation_enabled: false,
82
- },
83
- };
84
- /** Serialize the manifest for pasting into Slack's "From an app manifest" flow. */
85
- export function slackManifestYaml() {
86
- return stringify(SLACK_APP_MANIFEST);
87
+ settings: {
88
+ event_subscriptions: {
89
+ bot_events: [
90
+ 'app_mention',
91
+ 'message.channels',
92
+ 'message.groups',
93
+ 'message.im',
94
+ ],
95
+ },
96
+ socket_mode_enabled: true,
97
+ org_deploy_enabled: false,
98
+ is_hosted: false,
99
+ token_rotation_enabled: false,
100
+ },
101
+ };
102
+ }
103
+ export const SLACK_APP_MANIFEST = createSlackAppManifest();
104
+ /** Serialize the manifest for pasting into Slack's "From a manifest" flow. */
105
+ export function slackManifestYaml(appName = DEFAULT_SLACK_APP_NAME) {
106
+ return stringify(createSlackAppManifest(appName));
107
+ }
108
+ /** Serialize the manifest as formatted JSON for the onboarding copy action. */
109
+ export function slackManifestJson(appName = DEFAULT_SLACK_APP_NAME) {
110
+ return JSON.stringify(createSlackAppManifest(appName), null, 2);
87
111
  }
88
112
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/slack/manifest.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,qEAAqE;AACrE,6EAA6E;AAC7E,6EAA6E;AAC7E,8BAA8B;AAC9B,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;IAC/B,mBAAmB,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,kEAAkE;KAClF;IACD,QAAQ,EAAE;QACN,QAAQ,EAAE;YACN,YAAY,EAAE,SAAS;YACvB,aAAa,EAAE,KAAK;SACvB;QACD,kEAAkE;QAClE,mEAAmE;QACnE,2BAA2B;QAC3B,QAAQ,EAAE;YACN,oBAAoB,EAAE,IAAI;YAC1B,8BAA8B,EAAE,KAAK;SACxC;QACD,qEAAqE;QACrE,mEAAmE;QACnE,sEAAsE;QACtE,6DAA6D;QAC7D,cAAc,EAAE;YACZ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;YAC3F,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE;YAC3G,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,+BAA+B,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE;YAC/G,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;YAClG,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE;SACnG;KACJ;IACD,YAAY,EAAE;QACV,MAAM,EAAE;YACJ,GAAG,EAAE;gBACD,8DAA8D;gBAC9D,iDAAiD;gBACjD,sDAAsD;gBACtD,oDAAoD;gBACpD,kFAAkF;gBAClF,6DAA6D;gBAC7D,sEAAsE;gBACtE,wEAAwE;gBACxE,+EAA+E;gBAC/E,oDAAoD;gBACpD,mBAAmB;gBACnB,kBAAkB;gBAClB,gBAAgB;gBAChB,YAAY;gBACZ,UAAU;gBACd,YAAY;gBACZ,gEAAgE;gBAChE,gEAAgE;gBAChE,YAAY;gBACZ,aAAa;gBACT,UAAU;aACb;SACJ;KACJ;IACD,QAAQ,EAAE;QACN,mBAAmB,EAAE;YACjB,UAAU,EAAE;gBACR,aAAa;gBACb,kBAAkB;gBAClB,gBAAgB;gBAChB,YAAY;aACf;SACJ;QACD,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,KAAK;QACzB,SAAS,EAAE,KAAK;QAChB,sBAAsB,EAAE,KAAK;KAChC;CACK,CAAC;AAEX,mFAAmF;AACnF,MAAM,UAAU,iBAAiB;IAC7B,OAAO,SAAS,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/slack/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ // ─── Slack Roster ────────────────────────────────────
2
+ // "Who is in this channel?" and "who is in this workspace?" — the second half of
3
+ // the question an agent could not answer before. conversations.members returns
4
+ // bare user ids, so the names come from the identity cache and a bounded
5
+ // users.list join rather than one users.info call per member.
6
+ // Design + rate-limit facts: devlog 260811_slack_sender_identity_roster/030.
7
+ import { slackApi, describeSlackError } from './api.js';
8
+ import { redactChannelSecrets } from '../messaging/redact.js';
9
+ import { getCachedSlackIdentities, pickSlackUserName, primeSlackIdentityCache, resolveSlackIdentities, } from './identity.js';
10
+ /** Slack recommends staying at or below 200 per page. */
11
+ const PAGE_SIZE = 200;
12
+ const MAX_PAGE_SIZE = 1000;
13
+ /** conversations.members is Tier 4, so a slightly deeper walk is affordable. */
14
+ const MAX_MEMBER_PAGES = 5;
15
+ /** users.list is only Tier 2 — walk it far more conservatively. */
16
+ const MAX_LIST_PAGES = 3;
17
+ const TOP_UP_LIMIT = 25;
18
+ function clampLimit(limit) {
19
+ const n = Number(limit) || PAGE_SIZE;
20
+ return Math.min(Math.max(Math.floor(n), 1), MAX_PAGE_SIZE);
21
+ }
22
+ function memberFromIdentity(identity) {
23
+ const member = {
24
+ id: identity.id,
25
+ name: identity.name,
26
+ isBot: identity.isBot,
27
+ };
28
+ if (identity.realName)
29
+ member.realName = identity.realName;
30
+ if (identity.displayName)
31
+ member.displayName = identity.displayName;
32
+ return member;
33
+ }
34
+ /**
35
+ * Channel membership.
36
+ *
37
+ * Deliberately NOT one users.info per member: a 200-person channel would be 200
38
+ * round trips. Order is cache -> bounded users.list join -> small users.info
39
+ * top-up. What is guaranteed is a CEILING on calls (5 member pages + 3 list pages
40
+ * + 25 top-ups), not a page count for a given channel size — member ids and
41
+ * users.list ordering are unrelated, so a target can sit on a later page.
42
+ */
43
+ export async function fetchSlackChannelMembers(token, channel, opts) {
44
+ const perPage = clampLimit(opts.limit);
45
+ const ids = [];
46
+ let cursor = '';
47
+ let hasMore = false;
48
+ for (let page = 0; page < MAX_MEMBER_PAGES; page += 1) {
49
+ const result = await slackApi(token, 'conversations.members', { channel, limit: perPage, ...(cursor ? { cursor } : {}) }, { form: true, ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}) });
50
+ if (!result.ok) {
51
+ return { ok: false, error: redactChannelSecrets(describeSlackError(result.error, result.data)) };
52
+ }
53
+ for (const id of result.data?.members ?? [])
54
+ if (id)
55
+ ids.push(id);
56
+ cursor = result.data?.response_metadata?.next_cursor?.trim() || '';
57
+ if (!cursor)
58
+ break;
59
+ if (page === MAX_MEMBER_PAGES - 1)
60
+ hasMore = true;
61
+ }
62
+ const { members, partial } = await namesForIds(token, ids, opts);
63
+ return { ok: true, members, hasMore, partial };
64
+ }
65
+ /** Resolve names for a list of ids: cache, then a bounded list join, then top-up. */
66
+ async function namesForIds(token, ids, opts) {
67
+ const resolved = new Map(getCachedSlackIdentities(opts.teamId, ids));
68
+ let missing = ids.filter(id => !resolved.has(id));
69
+ let cursor = '';
70
+ for (let page = 0; page < MAX_LIST_PAGES && missing.length; page += 1) {
71
+ const result = await slackApi(token, 'users.list',
72
+ // Always send a limit. Slack marks it optional, but omitting it makes
73
+ // Slack attempt the whole directory and can 500 on a large team.
74
+ { limit: PAGE_SIZE, ...(cursor ? { cursor } : {}) }, { form: true, ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}) });
75
+ if (!result.ok)
76
+ break; // A list failure is not fatal; top-up still runs.
77
+ primeSlackIdentityCache(opts.teamId, result.data?.members ?? []);
78
+ const found = getCachedSlackIdentities(opts.teamId, missing);
79
+ for (const [id, identity] of found)
80
+ resolved.set(id, identity);
81
+ missing = missing.filter(id => !resolved.has(id));
82
+ cursor = result.data?.response_metadata?.next_cursor?.trim() || '';
83
+ if (!cursor)
84
+ break;
85
+ }
86
+ let partial = false;
87
+ if (missing.length) {
88
+ const batch = await resolveSlackIdentities(token, missing.map(id => ({ userId: id })), {
89
+ teamId: opts.teamId, topUpLimit: TOP_UP_LIMIT,
90
+ ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}),
91
+ ...(opts.signal ? { signal: opts.signal } : {}),
92
+ });
93
+ partial = batch.partial;
94
+ for (const [id, identity] of batch.identities)
95
+ resolved.set(id, identity);
96
+ }
97
+ const members = ids.map(id => {
98
+ const identity = resolved.get(id);
99
+ // An unresolved member still appears, under its raw id. A roster that
100
+ // silently omits people is worse than one that admits it does not know.
101
+ return identity
102
+ ? memberFromIdentity(identity)
103
+ : { id, name: id, isBot: false };
104
+ });
105
+ return { members, partial };
106
+ }
107
+ /**
108
+ * Workspace directory.
109
+ *
110
+ * users.list already returns full user objects, so no users.info re-read is
111
+ * needed — and priming the identity cache from these pages means later inbound
112
+ * resolution is a cache hit.
113
+ */
114
+ export async function fetchSlackWorkspaceUsers(token, opts) {
115
+ const perPage = clampLimit(opts.limit);
116
+ const members = [];
117
+ let cursor = '';
118
+ let hasMore = false;
119
+ for (let page = 0; page < MAX_LIST_PAGES; page += 1) {
120
+ const result = await slackApi(token, 'users.list', { limit: perPage, ...(cursor ? { cursor } : {}) }, { form: true, ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}) });
121
+ if (!result.ok) {
122
+ return { ok: false, error: redactChannelSecrets(describeSlackError(result.error, result.data)) };
123
+ }
124
+ const page_members = result.data?.members ?? [];
125
+ primeSlackIdentityCache(opts.teamId, page_members);
126
+ for (const user of page_members) {
127
+ if (!user?.id)
128
+ continue;
129
+ // "Who is here" normally means people, so bots and deactivated
130
+ // accounts are opt-in rather than default noise.
131
+ if (user.deleted && !opts.includeDeleted)
132
+ continue;
133
+ if (user.is_bot && !opts.includeBots)
134
+ continue;
135
+ const member = {
136
+ id: user.id,
137
+ name: pickSlackUserName(user, user.id),
138
+ isBot: user.is_bot === true,
139
+ };
140
+ if (user.deleted)
141
+ member.deleted = true;
142
+ members.push(member);
143
+ }
144
+ cursor = result.data?.response_metadata?.next_cursor?.trim() || '';
145
+ if (!cursor)
146
+ break;
147
+ if (page === MAX_LIST_PAGES - 1)
148
+ hasMore = true;
149
+ }
150
+ const teamName = await fetchTeamName(token, opts);
151
+ return { ok: true, members, hasMore, partial: false, ...(teamName ? { teamName } : {}) };
152
+ }
153
+ /** Workspace name. Optional: without team:read the roster still returns fine. */
154
+ async function fetchTeamName(token, opts) {
155
+ const result = await slackApi(token, 'team.info', {}, { form: true, ...(opts.fetchImpl ? { fetchImpl: opts.fetchImpl } : {}) });
156
+ return result.ok ? (result.data?.team?.name || '') : '';
157
+ }
158
+ const FORMAT_CHAR_CAP = 6000;
159
+ /** Plain-text rendering for the agent prompt. Names keep their ids alongside. */
160
+ export function formatRosterForAgent(result, opts = {}) {
161
+ if (!result.ok)
162
+ return result.error;
163
+ const heading = opts.channel
164
+ ? `#${opts.channel} 멤버 ${result.members.length}명`
165
+ : `${result.teamName ? `${result.teamName} ` : ''}워크스페이스 사용자 ${result.members.length}명`;
166
+ const lines = result.members.map(member => {
167
+ const tags = [member.id];
168
+ if (member.isBot)
169
+ tags.push('봇');
170
+ if (member.deleted)
171
+ tags.push('비활성');
172
+ return `- ${member.name} (${tags.join(', ')})`;
173
+ });
174
+ if (result.hasMore)
175
+ lines.push('… (페이지 상한에 도달해 일부만 표시)');
176
+ if (result.partial)
177
+ lines.push('… (이름 해석 상한에 도달해 일부는 id 로 표시)');
178
+ return redactChannelSecrets([heading, ...lines].join('\n')).slice(0, FORMAT_CHAR_CAP);
179
+ }
180
+ //# sourceMappingURL=roster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster.js","sourceRoot":"","sources":["../../../src/slack/roster.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-jaw",
3
- "version": "2.2.17",
3
+ "version": "2.2.18",
4
4
  "description": "Personal AI assistant powered by Pi, Antigravity, AI-E, Claude, Claude E, Codex, Codex App, Cursor, Grok, Kiro, OpenCode, and Copilot — Web, Terminal, Telegram, and Discord interfaces with 107 built-in skills",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -90,7 +90,7 @@
90
90
  "verify:release-evidence": "node scripts/verify-release-evidence.mjs",
91
91
  "test:fresh-install": "tsx scripts/fresh-install-smoke.ts",
92
92
  "build": "bash scripts/atomic-build.sh",
93
- "postbuild": "node scripts/link-current-nvm-bin.cjs",
93
+ "postbuild": "bash scripts/verify-dist-assets.sh && node scripts/link-current-nvm-bin.cjs",
94
94
  "build:frontend": "vite build --config vite.config.ts",
95
95
  "qa:manager-frontend": "npm run build:frontend && npm run typecheck:frontend",
96
96
  "dev:frontend": "vite --config vite.config.ts",
@@ -135,7 +135,8 @@
135
135
  "check:electron-dist-linux-no-jwc": "node scripts/check-electron-sidecar-no-jwc.cjs --server-root electron/dist/linux-unpacked/resources/server",
136
136
  "check:app-icons": "node scripts/check-app-icon-assets.cjs",
137
137
  "check:electron-no-native": "node scripts/check-electron-no-native.cjs",
138
- "smoke:tui-fullscreen": "tsx scripts/smoke/tui-fullscreen-frame-smoke.ts"
138
+ "smoke:tui-fullscreen": "tsx scripts/smoke/tui-fullscreen-frame-smoke.ts",
139
+ "verify:dist-assets": "bash scripts/verify-dist-assets.sh"
139
140
  },
140
141
  "dependencies": {
141
142
  "@codemirror/autocomplete": "^6.20.1",
@@ -226,60 +226,16 @@
226
226
  background: color-mix(in oklch, var(--accent) 10%, var(--bg));
227
227
  }
228
228
 
229
- .channel-transport-status .transport-status-block + .transport-status-block {
230
- margin-top: 10px;
231
- }
232
-
233
- /* Slack guided setup card: 3 steps above the collapsed advanced section. */
234
- .slack-setup-card {
235
- display: flex;
236
- flex-direction: column;
237
- gap: 10px;
238
- margin: 8px 0;
239
- padding: 10px;
240
- border: 1px solid color-mix(in oklch, var(--accent) 35%, var(--border));
241
- border-radius: 6px;
242
- background: color-mix(in oklch, var(--accent) 4%, var(--bg));
243
- }
244
-
245
- .slack-setup-step {
246
- display: flex;
247
- gap: 8px;
248
- align-items: flex-start;
249
- }
250
-
251
- .slack-step-num {
252
- flex: 0 0 auto;
253
- width: 18px;
254
- height: 18px;
255
- border-radius: 50%;
256
- border: 1px solid var(--accent);
257
- color: var(--accent);
258
- font-size: 11px;
259
- line-height: 18px;
260
- text-align: center;
261
- }
262
-
263
- .slack-step-body {
264
- flex: 1;
265
- min-width: 0;
266
- }
267
-
268
- .slack-step-title {
269
- font-size: 12px;
270
- color: var(--text);
271
- margin-bottom: 2px;
272
- }
273
-
274
- .slack-step-desc {
275
- font-size: 11px;
229
+ .perm-btn:disabled {
230
+ border-color: var(--border);
231
+ background: none;
276
232
  color: var(--text-dim);
277
- margin: 2px 0 6px;
233
+ cursor: not-allowed;
234
+ opacity: 0.55;
278
235
  }
279
236
 
280
- .slack-step-actions {
281
- display: flex;
282
- gap: 6px;
237
+ .channel-transport-status .transport-status-block + .transport-status-block {
238
+ margin-top: 10px;
283
239
  }
284
240
 
285
241
  .slack-field-error {
@@ -288,6 +244,17 @@
288
244
  margin-top: 3px;
289
245
  }
290
246
 
247
+ .settings-managed-notice {
248
+ margin-bottom: 8px;
249
+ padding: 7px 8px;
250
+ border: 1px solid color-mix(in oklch, var(--accent) 45%, var(--border));
251
+ border-radius: 6px;
252
+ color: var(--text-dim);
253
+ background: color-mix(in oklch, var(--accent) 7%, var(--bg));
254
+ font-size: 11px;
255
+ line-height: 1.4;
256
+ }
257
+
291
258
  .input-sm.input-error {
292
259
  border-color: var(--error, #e5534b);
293
260
  }
@@ -315,6 +282,7 @@
315
282
  flex: 0 0 auto;
316
283
  padding: 3px 8px;
317
284
  font-size: 10px;
285
+ white-space: nowrap;
318
286
  }
319
287
 
320
288
  .onboarding-box {
@@ -404,6 +372,16 @@
404
372
  color: var(--text-dim);
405
373
  }
406
374
 
375
+ .onboarding-manifest-status {
376
+ align-self: center;
377
+ font-size: 10px;
378
+ color: var(--accent);
379
+ }
380
+
381
+ .onboarding-manifest-status.is-error {
382
+ color: var(--error, #e5534b);
383
+ }
384
+
407
385
  .onboarding-scopes {
408
386
  display: block;
409
387
  margin-top: 4px;
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{t as r}from"./error-normalize-BzeO0SXE.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-LF7vVVfG.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:p(t)}}function p(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,slackEnvironmentVariables:i,...a}=e;return a}function m({port:e,client:t,triggerDownload:n}){let{state:m}=i(t,`/api/settings`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(``),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(!1),[C,w]=(0,l.useState)(null),T=n||d;(0,l.useEffect)(()=>{v(``),b(null),w(null)},[e]);let E=(0,l.useCallback)(()=>{m.kind===`ready`&&T(`cli-jaw-settings-${e}.json`,JSON.stringify(p(m.data),null,2))},[m,e,T]),D=(0,l.useCallback)(async()=>{let e=f(_);if(!e.ok){b(e.error),w(null);return}b(null),w(null),S(!0);try{await t.put(`/api/settings`,e.value),w(`Imported. Reload the page to refresh other tabs.`)}catch(e){b(r(e))}finally{S(!1)}},[t,_]);return m.kind===`loading`?(0,u.jsx)(o,{}):m.kind===`offline`?(0,u.jsx)(s,{port:e}):m.kind===`error`?(0,u.jsx)(c,{message:m.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:E,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)})]}),h?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:_,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>v(e.target.value),"aria-invalid":!!y}),y?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:y}):null,C?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:C}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void D(),disabled:x||_.trim()===``,children:x?`Importing…`:`Apply import`})]}):null]})]})}export{m as default,p as stripServerOwnedSettingsFields,f as validateImportPayload};