@stoneforge/quarry 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- package/web/logo.png +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/cli/commands/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Commands - Message sending and threading CLI interface
|
|
3
|
+
*
|
|
4
|
+
* Provides CLI commands for message operations:
|
|
5
|
+
* - msg send: Send a message to a channel
|
|
6
|
+
* - msg thread: View thread replies
|
|
7
|
+
* - msg list: List messages in a channel
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from '../types.js';
|
|
10
|
+
export declare const messageCommand: Command;
|
|
11
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/message.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,OAAO,EAA+C,MAAM,aAAa,CAAC;AAgsBxF,eAAO,MAAM,cAAc,EAAE,OA8C5B,CAAC"}
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Commands - Message sending and threading CLI interface
|
|
3
|
+
*
|
|
4
|
+
* Provides CLI commands for message operations:
|
|
5
|
+
* - msg send: Send a message to a channel
|
|
6
|
+
* - msg thread: View thread replies
|
|
7
|
+
* - msg list: List messages in a channel
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import { success, failure, ExitCode } from '../types.js';
|
|
12
|
+
import { getFormatter, getOutputMode } from '../formatter.js';
|
|
13
|
+
import { createMessage, filterByChannel, getThreadMessages, sortByCreatedAt, isRootMessage, } from '@stoneforge/core';
|
|
14
|
+
import { createDocument, ContentType, DocumentCategory, } from '@stoneforge/core';
|
|
15
|
+
import { isMember, isDirectChannel, findDirectChannel, createDirectChannel, } from '@stoneforge/core';
|
|
16
|
+
import { suggestCommands } from '../suggest.js';
|
|
17
|
+
import { resolveActor, createAPI } from '../db.js';
|
|
18
|
+
const msgSendOptions = [
|
|
19
|
+
{
|
|
20
|
+
name: 'channel',
|
|
21
|
+
short: 'c',
|
|
22
|
+
description: 'Channel ID to send to (required unless --to or --reply-to is used)',
|
|
23
|
+
hasValue: true,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'to',
|
|
27
|
+
short: 'T',
|
|
28
|
+
description: 'Entity ID to send DM to (finds or creates DM channel)',
|
|
29
|
+
hasValue: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'replyTo',
|
|
33
|
+
short: 'r',
|
|
34
|
+
description: 'Message ID to reply to (auto-sets channel, thread, and swaps sender/recipient in DM)',
|
|
35
|
+
hasValue: true,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'content',
|
|
39
|
+
short: 'm',
|
|
40
|
+
description: 'Message content (text)',
|
|
41
|
+
hasValue: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'file',
|
|
45
|
+
description: 'Read content from file',
|
|
46
|
+
hasValue: true,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'thread',
|
|
50
|
+
short: 't',
|
|
51
|
+
description: 'Reply to message (thread ID)',
|
|
52
|
+
hasValue: true,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'attachment',
|
|
56
|
+
short: 'a',
|
|
57
|
+
description: 'Attach document ID (can be repeated)',
|
|
58
|
+
hasValue: true,
|
|
59
|
+
array: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'tag',
|
|
63
|
+
description: 'Add tag (can be repeated)',
|
|
64
|
+
hasValue: true,
|
|
65
|
+
array: true,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
async function msgSendHandler(_args, options) {
|
|
69
|
+
// Must specify either --content or --file
|
|
70
|
+
if (!options.content && !options.file) {
|
|
71
|
+
return failure('Either --content or --file is required', ExitCode.INVALID_ARGUMENTS);
|
|
72
|
+
}
|
|
73
|
+
if (options.content && options.file) {
|
|
74
|
+
return failure('Cannot specify both --content and --file', ExitCode.INVALID_ARGUMENTS);
|
|
75
|
+
}
|
|
76
|
+
// Must have one of: --channel, --to, or --reply-to
|
|
77
|
+
if (!options.channel && !options.to && !options.replyTo) {
|
|
78
|
+
return failure('One of --channel, --to, or --reply-to is required', ExitCode.INVALID_ARGUMENTS);
|
|
79
|
+
}
|
|
80
|
+
const { api, error } = createAPI(options, true);
|
|
81
|
+
if (error) {
|
|
82
|
+
return failure(error, ExitCode.GENERAL_ERROR);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
let actor = resolveActor(options);
|
|
86
|
+
let channelId = options.channel;
|
|
87
|
+
let threadId = options.thread ? options.thread : null;
|
|
88
|
+
// Handle --reply-to: auto-set channel, thread, and swap sender/recipient in DM
|
|
89
|
+
if (options.replyTo) {
|
|
90
|
+
const replyToMessage = await api.get(options.replyTo);
|
|
91
|
+
if (!replyToMessage) {
|
|
92
|
+
return failure(`Reply-to message not found: ${options.replyTo}`, ExitCode.NOT_FOUND);
|
|
93
|
+
}
|
|
94
|
+
if (replyToMessage.type !== 'message') {
|
|
95
|
+
return failure(`Element ${options.replyTo} is not a message (type: ${replyToMessage.type})`, ExitCode.VALIDATION);
|
|
96
|
+
}
|
|
97
|
+
// Set channel from replied-to message
|
|
98
|
+
channelId = replyToMessage.channelId;
|
|
99
|
+
// Set thread: use replied-to message's thread, or if not in a thread, use the message itself
|
|
100
|
+
threadId = replyToMessage.threadId ?? replyToMessage.id;
|
|
101
|
+
// If in a DM channel and --from/--actor not explicitly set, swap sender/recipient
|
|
102
|
+
if (!options.actor) {
|
|
103
|
+
const replyChannel = await api.get(channelId);
|
|
104
|
+
if (replyChannel && isDirectChannel(replyChannel)) {
|
|
105
|
+
// Get the other party in the DM channel
|
|
106
|
+
const otherParty = replyChannel.members.find((m) => m !== replyToMessage.sender);
|
|
107
|
+
if (otherParty) {
|
|
108
|
+
actor = otherParty;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Handle --to: find or create DM channel between actor and target
|
|
114
|
+
if (options.to) {
|
|
115
|
+
const toEntity = options.to;
|
|
116
|
+
// Validate target entity exists
|
|
117
|
+
const targetEntity = await api.get(toEntity);
|
|
118
|
+
if (!targetEntity) {
|
|
119
|
+
return failure(`Target entity not found: ${toEntity}`, ExitCode.NOT_FOUND);
|
|
120
|
+
}
|
|
121
|
+
if (targetEntity.type !== 'entity') {
|
|
122
|
+
return failure(`Element ${toEntity} is not an entity (type: ${targetEntity.type})`, ExitCode.VALIDATION);
|
|
123
|
+
}
|
|
124
|
+
// Find existing DM channel
|
|
125
|
+
const allChannels = await api.list({ type: 'channel' });
|
|
126
|
+
let dmChannel = findDirectChannel(allChannels, actor, toEntity);
|
|
127
|
+
// Create DM channel if not found
|
|
128
|
+
if (!dmChannel) {
|
|
129
|
+
// Look up entity names for channel naming
|
|
130
|
+
const actorEntity = await api.get(actor);
|
|
131
|
+
const actorName = actorEntity?.name;
|
|
132
|
+
const targetName = targetEntity.name;
|
|
133
|
+
const newDmChannel = await createDirectChannel({
|
|
134
|
+
entityA: actor,
|
|
135
|
+
entityB: toEntity,
|
|
136
|
+
createdBy: actor,
|
|
137
|
+
...(actorName && { entityAName: actorName }),
|
|
138
|
+
...(targetName && { entityBName: targetName }),
|
|
139
|
+
});
|
|
140
|
+
dmChannel = await api.create(newDmChannel);
|
|
141
|
+
}
|
|
142
|
+
channelId = dmChannel.id;
|
|
143
|
+
}
|
|
144
|
+
if (!channelId) {
|
|
145
|
+
return failure('Could not determine channel', ExitCode.GENERAL_ERROR);
|
|
146
|
+
}
|
|
147
|
+
// Validate channel exists and sender is a member
|
|
148
|
+
const channel = await api.get(channelId);
|
|
149
|
+
if (!channel) {
|
|
150
|
+
return failure(`Channel not found: ${channelId}`, ExitCode.NOT_FOUND);
|
|
151
|
+
}
|
|
152
|
+
if (channel.type !== 'channel') {
|
|
153
|
+
return failure(`Element ${channelId} is not a channel (type: ${channel.type})`, ExitCode.VALIDATION);
|
|
154
|
+
}
|
|
155
|
+
if (!isMember(channel, actor)) {
|
|
156
|
+
return failure(`You are not a member of channel ${channelId}`, ExitCode.PERMISSION);
|
|
157
|
+
}
|
|
158
|
+
// Get content
|
|
159
|
+
let content;
|
|
160
|
+
if (options.content) {
|
|
161
|
+
content = options.content;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const filePath = resolve(options.file);
|
|
165
|
+
if (!existsSync(filePath)) {
|
|
166
|
+
return failure(`File not found: ${filePath}`, ExitCode.NOT_FOUND);
|
|
167
|
+
}
|
|
168
|
+
content = readFileSync(filePath, 'utf-8');
|
|
169
|
+
}
|
|
170
|
+
// Create content document (immutable, categorized as message content)
|
|
171
|
+
const contentDoc = await createDocument({
|
|
172
|
+
content,
|
|
173
|
+
contentType: ContentType.TEXT,
|
|
174
|
+
createdBy: actor,
|
|
175
|
+
category: DocumentCategory.MESSAGE_CONTENT,
|
|
176
|
+
immutable: true,
|
|
177
|
+
});
|
|
178
|
+
const createdContentDoc = await api.create(contentDoc);
|
|
179
|
+
// Validate thread parent if specified (and not already set by --reply-to)
|
|
180
|
+
if (options.thread && !options.replyTo) {
|
|
181
|
+
const threadParent = await api.get(options.thread);
|
|
182
|
+
if (!threadParent) {
|
|
183
|
+
return failure(`Thread parent message not found: ${options.thread}`, ExitCode.NOT_FOUND);
|
|
184
|
+
}
|
|
185
|
+
if (threadParent.type !== 'message') {
|
|
186
|
+
return failure(`Element ${options.thread} is not a message (type: ${threadParent.type})`, ExitCode.VALIDATION);
|
|
187
|
+
}
|
|
188
|
+
if (threadParent.channelId !== channelId) {
|
|
189
|
+
return failure(`Thread parent message is in a different channel`, ExitCode.VALIDATION);
|
|
190
|
+
}
|
|
191
|
+
threadId = options.thread;
|
|
192
|
+
}
|
|
193
|
+
// Handle attachments
|
|
194
|
+
let attachments;
|
|
195
|
+
if (options.attachment) {
|
|
196
|
+
const attachmentIds = Array.isArray(options.attachment)
|
|
197
|
+
? options.attachment
|
|
198
|
+
: [options.attachment];
|
|
199
|
+
attachments = [];
|
|
200
|
+
for (const attachmentId of attachmentIds) {
|
|
201
|
+
const attachmentDoc = await api.get(attachmentId);
|
|
202
|
+
if (!attachmentDoc) {
|
|
203
|
+
return failure(`Attachment document not found: ${attachmentId}`, ExitCode.NOT_FOUND);
|
|
204
|
+
}
|
|
205
|
+
if (attachmentDoc.type !== 'document') {
|
|
206
|
+
return failure(`Attachment ${attachmentId} is not a document (type: ${attachmentDoc.type})`, ExitCode.VALIDATION);
|
|
207
|
+
}
|
|
208
|
+
attachments.push(attachmentId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Handle tags
|
|
212
|
+
let tags;
|
|
213
|
+
if (options.tag) {
|
|
214
|
+
tags = Array.isArray(options.tag) ? options.tag : [options.tag];
|
|
215
|
+
}
|
|
216
|
+
// Create the message
|
|
217
|
+
const message = await createMessage({
|
|
218
|
+
channelId,
|
|
219
|
+
sender: actor,
|
|
220
|
+
contentRef: createdContentDoc.id,
|
|
221
|
+
attachments,
|
|
222
|
+
threadId,
|
|
223
|
+
tags,
|
|
224
|
+
});
|
|
225
|
+
const createdMessage = await api.create(message);
|
|
226
|
+
const mode = getOutputMode(options);
|
|
227
|
+
if (mode === 'quiet') {
|
|
228
|
+
return success(createdMessage.id);
|
|
229
|
+
}
|
|
230
|
+
const replyInfo = threadId ? ` (reply to ${threadId})` : '';
|
|
231
|
+
return success(createdMessage, `Sent message ${createdMessage.id} to ${channelId}${replyInfo}`);
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
235
|
+
return failure(`Failed to send message: ${message}`, ExitCode.GENERAL_ERROR);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const msgSendCommand = {
|
|
239
|
+
name: 'send',
|
|
240
|
+
description: 'Send a message to a channel or entity',
|
|
241
|
+
usage: 'sf message send (--channel <id> | --to <entity> | --reply-to <msg>) --content <text> | --file <path> [options]',
|
|
242
|
+
help: `Send a message to a channel, entity (DM), or as a reply.
|
|
243
|
+
|
|
244
|
+
Options:
|
|
245
|
+
-c, --channel <id> Channel to send to
|
|
246
|
+
-T, --to <entity> Entity to send DM to (finds or creates DM channel)
|
|
247
|
+
-r, --reply-to <msg> Message ID to reply to (auto-sets channel, thread, swaps sender/recipient in DM)
|
|
248
|
+
-m, --content <text> Message content
|
|
249
|
+
--file <path> Read content from file
|
|
250
|
+
-t, --thread <id> Reply to message (creates thread)
|
|
251
|
+
-a, --attachment <id> Attach document (can be repeated)
|
|
252
|
+
--tag <tag> Add tag (can be repeated)
|
|
253
|
+
|
|
254
|
+
When using --to, a DM channel is found or created between you and the target entity.
|
|
255
|
+
When using --reply-to in a DM channel, sender/recipient are automatically swapped.
|
|
256
|
+
|
|
257
|
+
Examples:
|
|
258
|
+
sf message send --channel el-abc123 --content "Hello!"
|
|
259
|
+
sf message send --to el-user456 -m "Direct message"
|
|
260
|
+
sf message send --reply-to el-msg789 -m "Reply to your message"
|
|
261
|
+
sf --from agent-1 msg send --to agent-2 -m "Message from agent-1"
|
|
262
|
+
sf message send -c el-abc123 --file message.txt
|
|
263
|
+
sf message send -c el-abc123 -m "Reply" --thread el-msg456`,
|
|
264
|
+
options: msgSendOptions,
|
|
265
|
+
handler: msgSendHandler,
|
|
266
|
+
};
|
|
267
|
+
const msgThreadOptions = [
|
|
268
|
+
{
|
|
269
|
+
name: 'limit',
|
|
270
|
+
short: 'l',
|
|
271
|
+
description: 'Maximum number of messages to show',
|
|
272
|
+
hasValue: true,
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
async function msgThreadHandler(args, options) {
|
|
276
|
+
const [messageId] = args;
|
|
277
|
+
if (!messageId) {
|
|
278
|
+
return failure('Usage: sf message thread <message-id>\nExample: sf message thread el-msg123', ExitCode.INVALID_ARGUMENTS);
|
|
279
|
+
}
|
|
280
|
+
const { api, error } = createAPI(options);
|
|
281
|
+
if (error) {
|
|
282
|
+
return failure(error, ExitCode.GENERAL_ERROR);
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
// Get the root message
|
|
286
|
+
const rootMessage = await api.get(messageId, { hydrate: { content: true } });
|
|
287
|
+
if (!rootMessage) {
|
|
288
|
+
return failure(`Message not found: ${messageId}`, ExitCode.NOT_FOUND);
|
|
289
|
+
}
|
|
290
|
+
if (rootMessage.type !== 'message') {
|
|
291
|
+
return failure(`Element ${messageId} is not a message (type: ${rootMessage.type})`, ExitCode.VALIDATION);
|
|
292
|
+
}
|
|
293
|
+
// Get all messages in the channel
|
|
294
|
+
const allMessages = await api.list({ type: 'message' });
|
|
295
|
+
const channelMessages = filterByChannel(allMessages, rootMessage.channelId);
|
|
296
|
+
// Get thread messages (root + replies)
|
|
297
|
+
const threadMessages = getThreadMessages(channelMessages, messageId);
|
|
298
|
+
// Apply limit
|
|
299
|
+
let messages = threadMessages;
|
|
300
|
+
if (options.limit) {
|
|
301
|
+
const limit = parseInt(options.limit, 10);
|
|
302
|
+
if (isNaN(limit) || limit < 1) {
|
|
303
|
+
return failure('Limit must be a positive number', ExitCode.VALIDATION);
|
|
304
|
+
}
|
|
305
|
+
messages = threadMessages.slice(0, limit);
|
|
306
|
+
}
|
|
307
|
+
// Hydrate content for display
|
|
308
|
+
const hydratedMessages = [];
|
|
309
|
+
for (const msg of messages) {
|
|
310
|
+
const hydrated = await api.get(msg.id, { hydrate: { content: true } });
|
|
311
|
+
if (hydrated) {
|
|
312
|
+
hydratedMessages.push(hydrated);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const mode = getOutputMode(options);
|
|
316
|
+
const formatter = getFormatter(mode);
|
|
317
|
+
if (mode === 'json') {
|
|
318
|
+
return success(hydratedMessages);
|
|
319
|
+
}
|
|
320
|
+
if (mode === 'quiet') {
|
|
321
|
+
return success(hydratedMessages.map((m) => m.id).join('\n'));
|
|
322
|
+
}
|
|
323
|
+
if (hydratedMessages.length === 0) {
|
|
324
|
+
return success(null, 'No messages in thread');
|
|
325
|
+
}
|
|
326
|
+
// Build table
|
|
327
|
+
const headers = ['ID', 'SENDER', 'CONTENT', 'CREATED'];
|
|
328
|
+
const rows = hydratedMessages.map((m) => {
|
|
329
|
+
const contentPreview = (m.content ?? '').substring(0, 40);
|
|
330
|
+
const truncated = contentPreview.length < (m.content?.length ?? 0) ? '...' : '';
|
|
331
|
+
return [
|
|
332
|
+
m.id,
|
|
333
|
+
m.sender,
|
|
334
|
+
contentPreview + truncated,
|
|
335
|
+
m.createdAt.split('T')[0],
|
|
336
|
+
];
|
|
337
|
+
});
|
|
338
|
+
const table = formatter.table(headers, rows);
|
|
339
|
+
const threadInfo = isRootMessage(rootMessage)
|
|
340
|
+
? 'Root message with'
|
|
341
|
+
: 'Reply to ' + rootMessage.threadId + ' with';
|
|
342
|
+
const summary = `\n${threadInfo} ${hydratedMessages.length - 1} replies`;
|
|
343
|
+
return success(hydratedMessages, table + summary);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
347
|
+
return failure(`Failed to get thread: ${message}`, ExitCode.GENERAL_ERROR);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const msgThreadCommand = {
|
|
351
|
+
name: 'thread',
|
|
352
|
+
description: 'View thread messages',
|
|
353
|
+
usage: 'sf message thread <message-id> [options]',
|
|
354
|
+
help: `View a message thread (root message and all replies).
|
|
355
|
+
|
|
356
|
+
Arguments:
|
|
357
|
+
message-id Message identifier (root or any reply)
|
|
358
|
+
|
|
359
|
+
Options:
|
|
360
|
+
-l, --limit <n> Maximum messages to show
|
|
361
|
+
|
|
362
|
+
Examples:
|
|
363
|
+
sf message thread el-msg123
|
|
364
|
+
sf message thread el-msg123 --limit 10`,
|
|
365
|
+
options: msgThreadOptions,
|
|
366
|
+
handler: msgThreadHandler,
|
|
367
|
+
};
|
|
368
|
+
const msgListOptions = [
|
|
369
|
+
{
|
|
370
|
+
name: 'channel',
|
|
371
|
+
short: 'c',
|
|
372
|
+
description: 'Channel ID to list messages from (required)',
|
|
373
|
+
hasValue: true,
|
|
374
|
+
required: true,
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
name: 'sender',
|
|
378
|
+
short: 's',
|
|
379
|
+
description: 'Filter by sender entity ID',
|
|
380
|
+
hasValue: true,
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
name: 'limit',
|
|
384
|
+
short: 'l',
|
|
385
|
+
description: 'Maximum number of messages',
|
|
386
|
+
hasValue: true,
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
name: 'rootOnly',
|
|
390
|
+
short: 'r',
|
|
391
|
+
description: 'Show only root messages (no replies)',
|
|
392
|
+
hasValue: false,
|
|
393
|
+
},
|
|
394
|
+
];
|
|
395
|
+
async function msgListHandler(_args, options) {
|
|
396
|
+
if (!options.channel) {
|
|
397
|
+
return failure('--channel is required', ExitCode.INVALID_ARGUMENTS);
|
|
398
|
+
}
|
|
399
|
+
const { api, error } = createAPI(options);
|
|
400
|
+
if (error) {
|
|
401
|
+
return failure(error, ExitCode.GENERAL_ERROR);
|
|
402
|
+
}
|
|
403
|
+
try {
|
|
404
|
+
const channelId = options.channel;
|
|
405
|
+
// Validate channel exists
|
|
406
|
+
const channel = await api.get(channelId);
|
|
407
|
+
if (!channel) {
|
|
408
|
+
return failure(`Channel not found: ${channelId}`, ExitCode.NOT_FOUND);
|
|
409
|
+
}
|
|
410
|
+
if (channel.type !== 'channel') {
|
|
411
|
+
return failure(`Element ${channelId} is not a channel (type: ${channel.type})`, ExitCode.VALIDATION);
|
|
412
|
+
}
|
|
413
|
+
// Get all messages
|
|
414
|
+
const allMessages = await api.list({ type: 'message' });
|
|
415
|
+
// Filter by channel
|
|
416
|
+
let messages = filterByChannel(allMessages, channelId);
|
|
417
|
+
// Filter by sender if specified
|
|
418
|
+
if (options.sender) {
|
|
419
|
+
messages = messages.filter((m) => m.sender === options.sender);
|
|
420
|
+
}
|
|
421
|
+
// Filter root-only if specified
|
|
422
|
+
if (options.rootOnly) {
|
|
423
|
+
messages = messages.filter(isRootMessage);
|
|
424
|
+
}
|
|
425
|
+
// Sort by creation time
|
|
426
|
+
messages = sortByCreatedAt(messages);
|
|
427
|
+
// Apply limit
|
|
428
|
+
if (options.limit) {
|
|
429
|
+
const limit = parseInt(options.limit, 10);
|
|
430
|
+
if (isNaN(limit) || limit < 1) {
|
|
431
|
+
return failure('Limit must be a positive number', ExitCode.VALIDATION);
|
|
432
|
+
}
|
|
433
|
+
messages = messages.slice(0, limit);
|
|
434
|
+
}
|
|
435
|
+
// Hydrate content for display
|
|
436
|
+
const hydratedMessages = [];
|
|
437
|
+
for (const msg of messages) {
|
|
438
|
+
const hydrated = await api.get(msg.id, { hydrate: { content: true } });
|
|
439
|
+
if (hydrated) {
|
|
440
|
+
hydratedMessages.push(hydrated);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const mode = getOutputMode(options);
|
|
444
|
+
const formatter = getFormatter(mode);
|
|
445
|
+
if (mode === 'json') {
|
|
446
|
+
return success(hydratedMessages);
|
|
447
|
+
}
|
|
448
|
+
if (mode === 'quiet') {
|
|
449
|
+
return success(hydratedMessages.map((m) => m.id).join('\n'));
|
|
450
|
+
}
|
|
451
|
+
if (hydratedMessages.length === 0) {
|
|
452
|
+
return success(null, 'No messages found');
|
|
453
|
+
}
|
|
454
|
+
// Build table
|
|
455
|
+
const headers = ['ID', 'SENDER', 'THREAD', 'CONTENT', 'CREATED'];
|
|
456
|
+
const rows = hydratedMessages.map((m) => {
|
|
457
|
+
const contentPreview = (m.content ?? '').substring(0, 35);
|
|
458
|
+
const truncated = contentPreview.length < (m.content?.length ?? 0) ? '...' : '';
|
|
459
|
+
return [
|
|
460
|
+
m.id,
|
|
461
|
+
m.sender,
|
|
462
|
+
m.threadId ? `→${m.threadId.substring(0, 8)}` : '-',
|
|
463
|
+
contentPreview + truncated,
|
|
464
|
+
m.createdAt.split('T')[0],
|
|
465
|
+
];
|
|
466
|
+
});
|
|
467
|
+
const table = formatter.table(headers, rows);
|
|
468
|
+
const summary = `\n${hydratedMessages.length} message(s) in channel ${channelId}`;
|
|
469
|
+
return success(hydratedMessages, table + summary);
|
|
470
|
+
}
|
|
471
|
+
catch (err) {
|
|
472
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
473
|
+
return failure(`Failed to list messages: ${message}`, ExitCode.GENERAL_ERROR);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
const msgListCommand = {
|
|
477
|
+
name: 'list',
|
|
478
|
+
description: 'List messages in a channel',
|
|
479
|
+
usage: 'sf message list --channel <id> [options]',
|
|
480
|
+
help: `List messages in a channel.
|
|
481
|
+
|
|
482
|
+
Options:
|
|
483
|
+
-c, --channel <id> Channel to list messages from (required)
|
|
484
|
+
-s, --sender <id> Filter by sender entity
|
|
485
|
+
-l, --limit <n> Maximum messages to show
|
|
486
|
+
-r, --rootOnly Show only root messages (no replies)
|
|
487
|
+
|
|
488
|
+
Examples:
|
|
489
|
+
sf message list --channel el-abc123
|
|
490
|
+
sf message list -c el-abc123 --sender el-user456
|
|
491
|
+
sf message list -c el-abc123 --rootOnly --limit 20`,
|
|
492
|
+
options: msgListOptions,
|
|
493
|
+
handler: msgListHandler,
|
|
494
|
+
};
|
|
495
|
+
const msgReplyOptions = [
|
|
496
|
+
{
|
|
497
|
+
name: 'content',
|
|
498
|
+
short: 'm',
|
|
499
|
+
description: 'Message content (text)',
|
|
500
|
+
hasValue: true,
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
name: 'file',
|
|
504
|
+
description: 'Read content from file',
|
|
505
|
+
hasValue: true,
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
name: 'attachment',
|
|
509
|
+
short: 'a',
|
|
510
|
+
description: 'Attach document ID (can be repeated)',
|
|
511
|
+
hasValue: true,
|
|
512
|
+
array: true,
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
name: 'tag',
|
|
516
|
+
description: 'Add tag (can be repeated)',
|
|
517
|
+
hasValue: true,
|
|
518
|
+
array: true,
|
|
519
|
+
},
|
|
520
|
+
];
|
|
521
|
+
async function msgReplyHandler(args, options) {
|
|
522
|
+
const [messageId] = args;
|
|
523
|
+
if (!messageId) {
|
|
524
|
+
return failure('Usage: sf message reply <message-id> --content <text> | --file <path>\nExample: sf message reply el-msg123 --content "Thanks!"', ExitCode.INVALID_ARGUMENTS);
|
|
525
|
+
}
|
|
526
|
+
// Delegate to send handler with --reply-to set
|
|
527
|
+
return msgSendHandler([], {
|
|
528
|
+
...options,
|
|
529
|
+
replyTo: messageId,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
const msgReplyCommand = {
|
|
533
|
+
name: 'reply',
|
|
534
|
+
description: 'Reply to a message (shorthand for send --reply-to)',
|
|
535
|
+
usage: 'sf message reply <message-id> --content <text> | --file <path> [options]',
|
|
536
|
+
help: `Reply to a message.
|
|
537
|
+
|
|
538
|
+
This is a shorthand for "sf message send --reply-to <message-id>".
|
|
539
|
+
It automatically sets the channel and thread from the replied-to message.
|
|
540
|
+
In DM channels, sender/recipient are automatically swapped unless --from is specified.
|
|
541
|
+
|
|
542
|
+
Arguments:
|
|
543
|
+
message-id Message to reply to
|
|
544
|
+
|
|
545
|
+
Options:
|
|
546
|
+
-m, --content <text> Message content
|
|
547
|
+
--file <path> Read content from file
|
|
548
|
+
-a, --attachment <id> Attach document (can be repeated)
|
|
549
|
+
--tag <tag> Add tag (can be repeated)
|
|
550
|
+
|
|
551
|
+
Use --from (or --actor) to override the sender:
|
|
552
|
+
sf --from agent-1 msg reply el-msg123 -m "Reply as agent-1"
|
|
553
|
+
|
|
554
|
+
Examples:
|
|
555
|
+
sf message reply el-msg123 --content "Thanks for the update!"
|
|
556
|
+
sf message reply el-msg123 --file response.txt
|
|
557
|
+
sf --from bot msg reply el-msg123 -m "Automated response"`,
|
|
558
|
+
options: msgReplyOptions,
|
|
559
|
+
handler: msgReplyHandler,
|
|
560
|
+
};
|
|
561
|
+
// ============================================================================
|
|
562
|
+
// Message Root Command
|
|
563
|
+
// ============================================================================
|
|
564
|
+
export const messageCommand = {
|
|
565
|
+
name: 'message',
|
|
566
|
+
description: 'Send and manage messages',
|
|
567
|
+
usage: 'sf message <subcommand> [options]',
|
|
568
|
+
help: `Send and manage messages in channels.
|
|
569
|
+
|
|
570
|
+
Messages are immutable - once sent, they cannot be edited or deleted.
|
|
571
|
+
This ensures a reliable audit trail of all communication.
|
|
572
|
+
|
|
573
|
+
Subcommands:
|
|
574
|
+
send Send a message to a channel, entity, or as a reply
|
|
575
|
+
reply Reply to a message (shorthand for send --reply-to)
|
|
576
|
+
list List messages in a channel
|
|
577
|
+
thread View a message thread
|
|
578
|
+
|
|
579
|
+
Examples:
|
|
580
|
+
sf message send --channel el-abc123 --content "Hello!"
|
|
581
|
+
sf message send --to el-user456 -m "Direct message"
|
|
582
|
+
sf message reply el-msg789 -m "Reply to your message"
|
|
583
|
+
sf message list --channel el-abc123
|
|
584
|
+
sf message thread el-msg456`,
|
|
585
|
+
subcommands: {
|
|
586
|
+
send: msgSendCommand,
|
|
587
|
+
reply: msgReplyCommand,
|
|
588
|
+
list: msgListCommand,
|
|
589
|
+
thread: msgThreadCommand,
|
|
590
|
+
// Aliases (hidden from --help via dedup in getCommandHelp)
|
|
591
|
+
ls: msgListCommand,
|
|
592
|
+
},
|
|
593
|
+
handler: async (args, _options) => {
|
|
594
|
+
if (args.length === 0) {
|
|
595
|
+
return failure(`Usage: sf message <subcommand>. Use 'sf message --help' for available subcommands.`, ExitCode.INVALID_ARGUMENTS);
|
|
596
|
+
}
|
|
597
|
+
// Show "did you mean?" for unknown subcommands
|
|
598
|
+
const subNames = Object.keys(messageCommand.subcommands);
|
|
599
|
+
const suggestions = suggestCommands(args[0], subNames);
|
|
600
|
+
let msg = `Unknown subcommand: ${args[0]}`;
|
|
601
|
+
if (suggestions.length > 0) {
|
|
602
|
+
msg += `\n\nDid you mean?\n${suggestions.map(s => ` ${s}`).join('\n')}`;
|
|
603
|
+
}
|
|
604
|
+
msg += '\n\nRun "sf message --help" to see available subcommands.';
|
|
605
|
+
return failure(msg, ExitCode.INVALID_ARGUMENTS);
|
|
606
|
+
},
|
|
607
|
+
};
|
|
608
|
+
//# sourceMappingURL=message.js.map
|