@sleep2agi/agent-network 2.3.0-preview.16 → 2.3.0-preview.161
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/README.md +35 -324
- package/dist/bin/anet.cjs +101 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +20 -1
- package/dist/bin/goal-wake-log-render.d.ts +31 -0
- package/dist/src/active-network-task.d.ts +28 -0
- package/dist/src/batch-workdir.d.ts +9 -0
- package/dist/src/bootstrap-password-db.d.ts +13 -0
- package/dist/src/channel-attachments.d.ts +29 -0
- package/dist/src/channel-inbox-wake.d.ts +21 -0
- package/dist/src/channel-meta.d.ts +10 -0
- package/dist/src/channel-peer-reply.d.ts +41 -0
- package/dist/src/channel-task-trace.d.ts +14 -0
- package/dist/src/claude-vendor-env.d.ts +28 -0
- package/dist/src/cli-args.d.ts +8 -0
- package/dist/src/cli-auth-session.d.ts +47 -0
- package/dist/src/cli-errors.d.ts +41 -0
- package/dist/src/cli-exit.d.ts +11 -0
- package/dist/src/cli-help.d.ts +10 -0
- package/dist/src/cli-version-display.d.ts +16 -0
- package/dist/src/client-task-trace.d.ts +9 -0
- package/dist/src/client.js +1 -1
- package/dist/src/codex-adopt.d.ts +46 -0
- package/dist/src/codex-auth-fingerprint.d.ts +211 -0
- package/dist/src/codex-bin-pin.d.ts +23 -0
- package/dist/src/codex-commhub-mcp.d.ts +22 -0
- package/dist/src/codex-copresence-bridge-log.d.ts +44 -0
- package/dist/src/codex-copresence-env.d.ts +5 -0
- package/dist/src/codex-copresence-login-gate.d.ts +16 -0
- package/dist/src/codex-copresence-model.d.ts +23 -0
- package/dist/src/codex-copresence-preflight.d.ts +78 -0
- package/dist/src/codex-copresence-profile.d.ts +125 -0
- package/dist/src/codex-copresence-recovery.d.ts +67 -0
- package/dist/src/codex-copresence-resume-timeout.d.ts +28 -0
- package/dist/src/codex-copresence-rollout-guard.d.ts +36 -0
- package/dist/src/codex-copresence-rpc.d.ts +15 -0
- package/dist/src/codex-copresence-thread.d.ts +13 -0
- package/dist/src/codex-external-appserver.d.ts +128 -0
- package/dist/src/codex-fork-recovery.d.ts +52 -0
- package/dist/src/codex-home-enforce.d.ts +88 -0
- package/dist/src/codex-lifecycle-account.d.ts +104 -0
- package/dist/src/codex-lifecycle-canary.d.ts +20 -0
- package/dist/src/codex-lifecycle-facts.d.ts +53 -0
- package/dist/src/codex-lifecycle-fork.d.ts +91 -0
- package/dist/src/codex-lifecycle-preflight.d.ts +77 -0
- package/dist/src/codex-lifecycle-receipt.d.ts +53 -0
- package/dist/src/codex-lifecycle-restart.d.ts +88 -0
- package/dist/src/codex-login-share-guard.d.ts +146 -0
- package/dist/src/codex-menu.d.ts +99 -0
- package/dist/src/codex-model-default.d.ts +6 -0
- package/dist/src/codex-node-login.d.ts +98 -0
- package/dist/src/codex-pending-thread-restart.d.ts +69 -0
- package/dist/src/codex-recovery-lease.d.ts +39 -0
- package/dist/src/codex-recovery-resource-gate.d.ts +15 -0
- package/dist/src/codex-resume.d.ts +89 -0
- package/dist/src/codex-rollout-history-guard.d.ts +84 -0
- package/dist/src/codex-tui-client-health.d.ts +30 -0
- package/dist/src/commhub-response.d.ts +1 -0
- package/dist/src/controlled-upload.d.ts +83 -0
- package/dist/src/copresence-deps.d.ts +22 -0
- package/dist/src/copresence-identity.d.ts +363 -0
- package/dist/src/copresence-startup-diagnosis.d.ts +17 -0
- package/dist/src/daemon-adopt.d.ts +14 -0
- package/dist/src/daemon-anet-bin.d.ts +32 -0
- package/dist/src/daemon-capability-display.d.ts +110 -0
- package/dist/src/daemon-capability-display.js +21 -0
- package/dist/src/daemon-inherited-env.d.ts +9 -0
- package/dist/src/daemon-runtime-path-preflight.d.ts +22 -0
- package/dist/src/daemon-runtime-staleness.d.ts +13 -0
- package/dist/src/dashboard-managed-process.d.ts +35 -0
- package/dist/src/display-width.d.ts +27 -0
- package/dist/src/doctor-node-count.d.ts +28 -0
- package/dist/src/environ-alias.d.ts +14 -0
- package/dist/src/grok-attach-client.d.ts +129 -0
- package/dist/src/grok-build-drift.d.ts +15 -0
- package/dist/src/grok-copresence-disclosure.d.ts +11 -0
- package/dist/src/grok-copresence-orchestration.d.ts +75 -0
- package/dist/src/grok-copresence-profile.d.ts +65 -0
- package/dist/src/grok-create-mode.d.ts +19 -0
- package/dist/src/host-telemetry.d.ts +14 -0
- package/dist/src/hub-health-timeout.d.ts +4 -0
- package/dist/src/hub-server-version.d.ts +64 -0
- package/dist/src/hub-stop.d.ts +74 -0
- package/dist/src/hub-time-display.d.ts +20 -0
- package/dist/src/hub-version-skew.d.ts +19 -0
- package/dist/src/im/correlation-store.d.ts +34 -0
- package/dist/src/im/feishu/adapter.d.ts +54 -0
- package/dist/src/im/feishu/bridge.d.ts +78 -14
- package/dist/src/im/feishu/hub-upload.d.ts +1 -1
- package/dist/src/im/feishu/outbound-route.d.ts +62 -0
- package/dist/src/im/feishu/worker-lifecycle.d.ts +13 -0
- package/dist/src/im/feishu/worker.js +180 -153
- package/dist/src/inbox-drain.d.ts +20 -0
- package/dist/src/local-process-state.d.ts +12 -0
- package/dist/src/locale-diagnostic.d.ts +12 -0
- package/dist/src/login-client-label.d.ts +6 -0
- package/dist/src/ls-columns.d.ts +15 -0
- package/dist/src/mock-llm.d.ts +12 -0
- package/dist/src/node-activity-log.d.ts +4 -0
- package/dist/src/node-clone.d.ts +134 -0
- package/dist/src/node-delete-hub.d.ts +42 -0
- package/dist/src/node-files.d.ts +62 -0
- package/dist/src/node-locate.d.ts +60 -0
- package/dist/src/node-ls-all.d.ts +80 -0
- package/dist/src/node-menu.d.ts +40 -0
- package/dist/src/node-not-found.d.ts +1 -0
- package/dist/src/node-remote.d.ts +180 -0
- package/dist/src/node-running-guard.d.ts +9 -0
- package/dist/src/node-server-identity.d.ts +35 -0
- package/dist/src/node-server-payload.d.ts +66 -0
- package/dist/src/node-server-rules-file.d.ts +14 -0
- package/dist/src/node-server-version.d.ts +39 -0
- package/dist/src/node-server.js +8 -1
- package/dist/src/node-skills.d.ts +57 -0
- package/dist/src/normalize-runtime.d.ts +29 -2
- package/dist/src/offline-age.d.ts +29 -0
- package/dist/src/one-line-cell.d.ts +20 -0
- package/dist/src/opencode-agent-node-pair.d.ts +28 -0
- package/dist/src/opencode-auth-login.d.ts +43 -0
- package/dist/src/opencode-free-tier.d.ts +27 -0
- package/dist/src/opencode-generation-create.d.ts +27 -0
- package/dist/src/opencode-generation-record.d.ts +24 -0
- package/dist/src/opencode-launch-env.d.ts +13 -0
- package/dist/src/opencode-owner-mode.d.ts +6 -0
- package/dist/src/opencode-package-binary.d.ts +44 -0
- package/dist/src/opencode-pin.d.ts +61 -0
- package/dist/src/opencode-preset.d.ts +73 -0
- package/dist/src/opencode-runtime-binding.d.ts +30 -0
- package/dist/src/opencode-safe-root.d.ts +36 -0
- package/dist/src/opencode-smoke-env.d.ts +1 -0
- package/dist/src/opencode-versions.d.ts +44 -0
- package/dist/src/outbound-attachments.d.ts +60 -0
- package/dist/src/outbound-tool-names.d.ts +1 -0
- package/dist/src/owned-roots.d.ts +58 -0
- package/dist/src/owner-env-file.d.ts +2 -0
- package/dist/src/package-mode-preflight.d.ts +41 -0
- package/dist/src/posix-codex-copresence.d.ts +33 -0
- package/dist/src/posix-modes.d.ts +36 -0
- package/dist/src/primary-network.d.ts +23 -0
- package/dist/src/private-state.d.ts +10 -0
- package/dist/src/process-telemetry.d.ts +12 -0
- package/dist/src/profile-serialize.d.ts +1 -0
- package/dist/src/project-key.d.ts +1 -0
- package/dist/src/reply-local-links.d.ts +47 -0
- package/dist/src/reply-originator.d.ts +20 -0
- package/dist/src/resume-runtime-infer.d.ts +18 -0
- package/dist/src/rules-file.d.ts +53 -0
- package/dist/src/secret-shell-guidance.d.ts +4 -0
- package/dist/src/session-status-class.d.ts +48 -0
- package/dist/src/shared/reserved-env.d.ts +3 -0
- package/dist/src/sibling-agent-node.d.ts +23 -0
- package/dist/src/stale-socket.d.ts +118 -0
- package/dist/src/start-resource-gate.d.ts +146 -0
- package/dist/src/stopped-receipt.d.ts +8 -0
- package/dist/src/subcommand-redirect.d.ts +26 -0
- package/dist/src/task-trace.d.ts +33 -0
- package/dist/src/tmux-attach.d.ts +11 -0
- package/dist/src/tmux-capability.d.ts +58 -0
- package/dist/src/tmux-exact-target.d.ts +36 -0
- package/dist/src/tmux-format.d.ts +20 -0
- package/dist/src/tmux-pane-prompt.d.ts +22 -0
- package/dist/src/tmux.d.ts +44 -0
- package/dist/src/token-cli.d.ts +13 -0
- package/dist/src/tool-allowlist.d.ts +28 -0
- package/dist/src/unsafe-package-path-reason.d.ts +31 -0
- package/dist/src/upgrade-channel.d.ts +31 -0
- package/dist/src/win-launcher.d.ts +20 -0
- package/dist/src/windows-codex-copresence.d.ts +60 -0
- package/package.json +14 -7
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface WakeLogEntryShape {
|
|
2
|
+
ts?: string;
|
|
3
|
+
status?: string;
|
|
4
|
+
summary?: string;
|
|
5
|
+
task_id?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WakeLogGoalShape {
|
|
8
|
+
goal_id: string;
|
|
9
|
+
progress_log?: WakeLogEntryShape[];
|
|
10
|
+
}
|
|
11
|
+
export interface WakeLogRenderOpts {
|
|
12
|
+
/** Trim to the last N entries. undefined = all. */
|
|
13
|
+
tail?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Format progress_log as a JSON object suitable for `--json` output.
|
|
17
|
+
* Pure. Never reads/writes filesystem. Legacy goals without
|
|
18
|
+
* progress_log render as empty array (not error).
|
|
19
|
+
*/
|
|
20
|
+
export declare function renderWakeLogJson(goal: WakeLogGoalShape, opts?: WakeLogRenderOpts): {
|
|
21
|
+
goal_id: string;
|
|
22
|
+
total: number;
|
|
23
|
+
returned: number;
|
|
24
|
+
entries: WakeLogEntryShape[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Format progress_log as a table for human console output.
|
|
28
|
+
* Column layout mirrors printGoalShow so the two commands read
|
|
29
|
+
* consistently. Empty log renders a single "(none)" line, not an error.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderWakeLogText(goal: WakeLogGoalShape, opts?: WakeLogRenderOpts): string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ActiveNetworkTask {
|
|
2
|
+
taskId: string;
|
|
3
|
+
from: string;
|
|
4
|
+
startedAt: number;
|
|
5
|
+
}
|
|
6
|
+
/** 运行时崩溃没来得及删标记时的兜底:超过这个年龄的标记当不存在。 */
|
|
7
|
+
export declare const ACTIVE_NETWORK_TASK_MAX_AGE_MS: number;
|
|
8
|
+
export declare function parseActiveNetworkTask(raw: string | null | undefined, now: number, maxAgeMs?: number): ActiveNetworkTask | null;
|
|
9
|
+
export type OutboundTool = "commhub_send_task" | "commhub_send_message";
|
|
10
|
+
export type OutboundRewrite = {
|
|
11
|
+
kind: "pass";
|
|
12
|
+
} | {
|
|
13
|
+
kind: "progress_of_active_task";
|
|
14
|
+
taskId: string;
|
|
15
|
+
from: string;
|
|
16
|
+
text: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* 只在「目标 alias 恰好是当前网络任务的发起方」时改写;发给别人的照常放行——
|
|
20
|
+
* 模型替任务派活给第三方是合法的协作,不能一刀切。
|
|
21
|
+
*/
|
|
22
|
+
export declare function decideOutboundRewrite(tool: OutboundTool, args: {
|
|
23
|
+
alias?: unknown;
|
|
24
|
+
task?: unknown;
|
|
25
|
+
message?: unknown;
|
|
26
|
+
} | null | undefined, active: ActiveNetworkTask | null): OutboundRewrite;
|
|
27
|
+
/** outbound-only 模式下模型不能自选 high(#1770 第三条):降为 normal,其余原样。 */
|
|
28
|
+
export declare function clampOutboundPriority(priority: unknown, outboundOnly: boolean): "high" | "normal" | "low" | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve one batch workdir before any mkdir/chdir loop starts.
|
|
3
|
+
*
|
|
4
|
+
* Node does not expand shell tildes. Leaving `~/team` relative means every
|
|
5
|
+
* iteration can resolve it from the previous node's cwd and create paths such
|
|
6
|
+
* as `/work/~/team/~/team`. Only the current user's `~` form is supported;
|
|
7
|
+
* `~other` is rejected instead of being written as a literal directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeBatchWorkdir(input: string, cwd?: string, home?: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface BootstrapPasswordUpdateInvocation {
|
|
2
|
+
argv: string[];
|
|
3
|
+
env: NodeJS.ProcessEnv;
|
|
4
|
+
script: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the database selected for the local Hub into an explicit absolute
|
|
8
|
+
* path before launching the bootstrap helper. The helper must never infer a
|
|
9
|
+
* database from its own HOME/cwd: those can differ from the parent process.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveBootstrapDatabasePath(env: NodeJS.ProcessEnv, home: string, cwd: string): string;
|
|
12
|
+
export declare const BOOTSTRAP_PASSWORD_UPDATE_SCRIPT: string;
|
|
13
|
+
export declare function buildBootstrapPasswordUpdateInvocation(userId: string, dbPath: string, baseEnv?: NodeJS.ProcessEnv): BootstrapPasswordUpdateInvocation;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface AttachmentDescriptor {
|
|
2
|
+
type?: unknown;
|
|
3
|
+
file_id?: unknown;
|
|
4
|
+
path?: unknown;
|
|
5
|
+
mime?: unknown;
|
|
6
|
+
name?: unknown;
|
|
7
|
+
size?: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface ChannelAttachmentDeps {
|
|
10
|
+
hubUrl: string;
|
|
11
|
+
authToken: string;
|
|
12
|
+
cacheDir: string;
|
|
13
|
+
fetch?: typeof fetch;
|
|
14
|
+
maxBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ChannelAttachmentResult {
|
|
17
|
+
paths: string[];
|
|
18
|
+
failures: Array<{
|
|
19
|
+
fileId: string;
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare function readableAttachmentsFromInbox(message: any): AttachmentDescriptor[];
|
|
25
|
+
export declare function channelAttachmentCacheDir(home: string, alias: string): string;
|
|
26
|
+
export declare function downloadChannelAttachments(message: any, deps: ChannelAttachmentDeps): Promise<ChannelAttachmentResult>;
|
|
27
|
+
export declare const downloadChannelImageAttachments: typeof downloadChannelAttachments;
|
|
28
|
+
export declare function appendChannelAttachmentPaths(content: string, paths: readonly string[]): string;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** SSE event types that mean "there is something new in your inbox". */
|
|
2
|
+
export declare const INBOX_WAKE_EVENTS: ReadonlySet<string>;
|
|
3
|
+
export declare function isInboxWakeEvent(type: unknown): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Single-flight runner: at most one drain runs at a time, and wakeups that
|
|
6
|
+
* arrive mid-drain collapse into exactly one rerun. Two concurrent drains
|
|
7
|
+
* would both fetch the same unacked rows and inject each task twice.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createSingleFlight(run: () => Promise<void>): () => Promise<void>;
|
|
10
|
+
export declare const DEFAULT_INBOX_POLL_MS = 60000;
|
|
11
|
+
/** ANET_CHANNEL_INBOX_POLL_MS: poll period in ms; "0" disables the safety net. */
|
|
12
|
+
export declare function inboxPollIntervalMs(raw: string | undefined): number;
|
|
13
|
+
/**
|
|
14
|
+
* Periodically run the drain so a missed push costs at most one period.
|
|
15
|
+
* Returns a stop function. The timer never keeps the process alive.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startInboxSafetyNet(opts: {
|
|
18
|
+
intervalMs: number;
|
|
19
|
+
drain: () => Promise<void>;
|
|
20
|
+
onError?: (error: unknown) => void;
|
|
21
|
+
}): () => void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** One inbound inbox row → the meta Claude Code renders as `<channel …>` attrs.
|
|
2
|
+
*
|
|
3
|
+
* Pure so the attribute set is assertable; it used to be inline in the SSE
|
|
4
|
+
* handler, where nothing could see it. */
|
|
5
|
+
export declare function inboundChannelMeta(msg: {
|
|
6
|
+
id: string;
|
|
7
|
+
from_session?: string | null;
|
|
8
|
+
priority?: string | null;
|
|
9
|
+
created_at?: string | null;
|
|
10
|
+
}): Record<string, string>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare const PEER_REPLY_TOOL_NAME = "commhub_send_peer_reply";
|
|
2
|
+
export interface ChannelPeerReplyInput {
|
|
3
|
+
task_id?: unknown;
|
|
4
|
+
text?: unknown;
|
|
5
|
+
status?: unknown;
|
|
6
|
+
alias?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface ChannelPeerReplyDeps {
|
|
9
|
+
/** One Hub MCP tool call. Returns the parsed tool payload (ok:false on rejection); may throw on transport failure. */
|
|
10
|
+
call: (tool: string, args: Record<string, unknown>) => Promise<any>;
|
|
11
|
+
fromAlias: string;
|
|
12
|
+
/** Sender alias the channel recorded when it injected this task_id (in-memory; may be unknown after a restart). */
|
|
13
|
+
originatorOf?: (taskId: string) => string | undefined;
|
|
14
|
+
/** channel meta task_id is the inbox ROW id; map it to the logical tasks.task_id when known. */
|
|
15
|
+
logicalTaskIdOf?: (taskId: string) => string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export type ChannelPeerReplyRoute = "atomic" | "wake-then-close" | "reply-only";
|
|
18
|
+
export interface ChannelPeerReplyResult {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
route?: ChannelPeerReplyRoute;
|
|
21
|
+
/** The original task is now terminal. */
|
|
22
|
+
closed: boolean;
|
|
23
|
+
/** A wake was delivered to the peer (atomic result row or fallback send_task). */
|
|
24
|
+
woke: boolean;
|
|
25
|
+
task_id?: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
message?: string;
|
|
28
|
+
wake_task_id?: string | null;
|
|
29
|
+
fallback_reason?: string;
|
|
30
|
+
upstream?: unknown;
|
|
31
|
+
}
|
|
32
|
+
/** The Hub rejected the ATOMIC route for a capability reason and wrote nothing. */
|
|
33
|
+
export declare function peerReplyFallbackReason(payload: any): string | null;
|
|
34
|
+
export declare function validatePeerReplyInput(input: ChannelPeerReplyInput): {
|
|
35
|
+
ok: true;
|
|
36
|
+
taskId: string;
|
|
37
|
+
text: string;
|
|
38
|
+
status: "completed" | "failed";
|
|
39
|
+
alias?: string;
|
|
40
|
+
} | ChannelPeerReplyResult;
|
|
41
|
+
export declare function sendChannelPeerReply(input: ChannelPeerReplyInput, deps: ChannelPeerReplyDeps): Promise<ChannelPeerReplyResult>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function sendChannelTaskWithTrace(input: {
|
|
2
|
+
alias: string;
|
|
3
|
+
task: string;
|
|
4
|
+
priority?: string;
|
|
5
|
+
fromAlias: string;
|
|
6
|
+
networkId?: string | null;
|
|
7
|
+
/** Structured task metadata forwarded verbatim, e.g. { attachments: [...] }.
|
|
8
|
+
* Omitted from the outbound body when absent, so a call without it is
|
|
9
|
+
* unchanged. */
|
|
10
|
+
meta?: Record<string, unknown>;
|
|
11
|
+
}, deps: {
|
|
12
|
+
send: (args: Record<string, unknown>) => Promise<any>;
|
|
13
|
+
log: (line: string) => void;
|
|
14
|
+
}): Promise<any>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const CLAUDE_VENDOR_ENV_KEYS: readonly ["ANTHROPIC_BASE_URL", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_API_KEY"];
|
|
2
|
+
export type PlainSecretEnvRewrite = {
|
|
3
|
+
key: string;
|
|
4
|
+
refName: string;
|
|
5
|
+
value: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Plan the values that the node-create writer will move into its line-oriented
|
|
9
|
+
* `.env` file. This is deliberately side-effect free: callers can run it as a
|
|
10
|
+
* preflight before creating a node directory, changing process.env, or writing
|
|
11
|
+
* config.json. Keeping the line-break rejection here makes it cover every
|
|
12
|
+
* caller of the dotenv writer, including the no-name interactive wizard.
|
|
13
|
+
*/
|
|
14
|
+
export declare function planPlainSecretEnvRewrites(input: {
|
|
15
|
+
env: unknown;
|
|
16
|
+
nodeId: string;
|
|
17
|
+
}): PlainSecretEnvRewrite[];
|
|
18
|
+
/**
|
|
19
|
+
* Persist the exact Anthropic-compatible vendor environment used by an
|
|
20
|
+
* explicit claude-agent-sdk create. Explicit --env values retain precedence;
|
|
21
|
+
* ambient shell values only fill missing known keys. Other environment values
|
|
22
|
+
* are intentionally ignored so node create never snapshots the whole shell.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectClaudeVendorEnvForCreate(input: {
|
|
25
|
+
runtime: string;
|
|
26
|
+
explicitEnv: readonly string[];
|
|
27
|
+
shellEnv: Readonly<Record<string, string | undefined>>;
|
|
28
|
+
}): string[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ParsedCliOptions = {
|
|
2
|
+
[key: string]: string | string[];
|
|
3
|
+
_channels: string[];
|
|
4
|
+
_envs: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare const BOOLEAN_FLAGS: Set<string>;
|
|
7
|
+
export declare function parseCliOptions(argv: string[]): ParsedCliOptions;
|
|
8
|
+
export declare function positionalArgs(argv: string[]): string[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type RevokeOutcome =
|
|
2
|
+
/** 服务端已撤销 */
|
|
3
|
+
{
|
|
4
|
+
kind: "revoked";
|
|
5
|
+
tokenId: string;
|
|
6
|
+
}
|
|
7
|
+
/** Hub 回 401:这个 token 在服务端本来就无效了(过期/已撤/改过密码),没东西可撤 */
|
|
8
|
+
| {
|
|
9
|
+
kind: "already_invalid";
|
|
10
|
+
}
|
|
11
|
+
/** 不是登录会话(显式 API 令牌 / 节点令牌):按设计不撤,仍有效 */
|
|
12
|
+
| {
|
|
13
|
+
kind: "not_a_session";
|
|
14
|
+
tokenId?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Hub 没有 /api/auth/sessions(早于 #2114 的旧版本 → 404) */
|
|
17
|
+
| {
|
|
18
|
+
kind: "unsupported";
|
|
19
|
+
status: number;
|
|
20
|
+
}
|
|
21
|
+
/** 连不上 Hub(DNS / 拒绝连接 / 超时) */
|
|
22
|
+
| {
|
|
23
|
+
kind: "unreachable";
|
|
24
|
+
error: string;
|
|
25
|
+
}
|
|
26
|
+
/** 其他意外响应 */
|
|
27
|
+
| {
|
|
28
|
+
kind: "failed";
|
|
29
|
+
status?: number;
|
|
30
|
+
error: string;
|
|
31
|
+
};
|
|
32
|
+
export type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
33
|
+
export declare function normalizeHubUrl(url: string): string;
|
|
34
|
+
export declare function sameHub(a?: string | null, b?: string | null): boolean;
|
|
35
|
+
/** 本地登录态字段。hub 不在里面:退出登录不等于忘掉 Hub 地址。 */
|
|
36
|
+
export declare const LOCAL_CREDENTIAL_KEYS: readonly ["token", "user", "network_id", "network_name"];
|
|
37
|
+
export declare function clearLocalCredentials(gc: Record<string, any>): Record<string, any>;
|
|
38
|
+
/** 在 `hub` 上撤销 `token` 所代表的登录会话。只把 token 发给 `hub` 本身。 */
|
|
39
|
+
export declare function revokeCurrentLoginSession(hub: string, token: string, opts?: {
|
|
40
|
+
fetchImpl?: FetchLike;
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
}): Promise<RevokeOutcome>;
|
|
43
|
+
/** 把撤销结果翻成给人看的行。`ok=false` 表示服务端令牌**仍然有效**,调用方按警告打印。 */
|
|
44
|
+
export declare function describeRevokeOutcome(o: RevokeOutcome, hub: string): {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
lines: string[];
|
|
47
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 把一个密钥变成 `<前缀>…<末 4 位>`。
|
|
3
|
+
* utok_abcdef…(40 字符)…wxyz → utok_…wxyz
|
|
4
|
+
* 太短(去掉前缀后不足 12 个字符)时连末 4 位也不给:短密钥露 4 位等于露了一大半。
|
|
5
|
+
*/
|
|
6
|
+
export declare function maskSecret(value: unknown): string;
|
|
7
|
+
/** 把任意文本里看得出的密钥都换成掩码。用在一切「把别处来的字符串打出来」的地方。 */
|
|
8
|
+
export declare function redactSecrets(text: string): string;
|
|
9
|
+
/** 深拷贝一个对象,键名像密钥的字符串值换成掩码,其余字符串值走 redactSecrets。 */
|
|
10
|
+
export declare function redactSecretFields<T>(value: T): T;
|
|
11
|
+
/** 任意「错误」值 → 一句可读文本。对象取 message / error.message / code,实在没有就 JSON。 */
|
|
12
|
+
export declare function errorText(x: unknown): string;
|
|
13
|
+
/**
|
|
14
|
+
* Hub 的失败响应体 → 一句话。hub 的 REST 路由回 `{ ok:false, error:"<字符串>" }`,
|
|
15
|
+
* 但 500 兜底(server/src/serve-error.ts)回 `{ error:{ code, message }, message }` ——
|
|
16
|
+
* 直接 `${res.error}` 就是 `[object Object]`。
|
|
17
|
+
*/
|
|
18
|
+
export declare function hubErrorText(res: unknown): string;
|
|
19
|
+
/** Doctor must not suggest retrying an implicit ownership claim. */
|
|
20
|
+
export declare function nodeTokenReissueError(res: unknown): string;
|
|
21
|
+
export interface CliErrorReport {
|
|
22
|
+
/** 第一行:出了什么事。 */
|
|
23
|
+
summary: string;
|
|
24
|
+
/** 下一步该敲的命令(每条一行)。 */
|
|
25
|
+
next: string[];
|
|
26
|
+
/** 为日志解析保留的 `FATAL: Error: CODE` 形状(只在消息本身是错误码时)。 */
|
|
27
|
+
fatalCode?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function isDebugEnabled(env?: Record<string, string | undefined>): boolean;
|
|
30
|
+
export declare function isNetworkError(err: any): boolean;
|
|
31
|
+
export declare function describeCliError(err: any, ctx?: {
|
|
32
|
+
hub?: string;
|
|
33
|
+
configPath?: string;
|
|
34
|
+
}): CliErrorReport;
|
|
35
|
+
/** 顶层 catch 用:产出要打到 stderr 的全部行(已脱敏)。stack 只在 ANET_DEBUG=1 时附上。 */
|
|
36
|
+
export declare function formatTopLevelError(err: any, opts?: {
|
|
37
|
+
hub?: string;
|
|
38
|
+
env?: Record<string, string | undefined>;
|
|
39
|
+
}): string[];
|
|
40
|
+
/** 「连 hub 失败」的原因,一句短语。用在已经写了 `Cannot reach <hub>:` 的地方。 */
|
|
41
|
+
export declare function hubReachReason(err: any): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const ANET_EXIT: {
|
|
2
|
+
readonly OK: 0;
|
|
3
|
+
readonly FAILURE: 1;
|
|
4
|
+
readonly USAGE: 2;
|
|
5
|
+
};
|
|
6
|
+
/** 命令打印了错误、不再继续 —— 记下失败码,让 main() 的终结器用它退出。 */
|
|
7
|
+
export declare function markFailed(): void;
|
|
8
|
+
/** 用法错误(缺参数 / 未知子命令 / 非法取值)。 */
|
|
9
|
+
export declare function markUsageError(): void;
|
|
10
|
+
/** main() 正常返回后的退出码:命令记下过的码,没记过就是 0。 */
|
|
11
|
+
export declare function finalExitCode(): number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const NODE_DELETE_USAGE = "Usage: anet node delete <node-id|node-name> [--force]\n anet node delete <node_id> --hub-only [--hub <url>]\n\nStop the node, delete its local config (.anet/nodes/<id>/), then remove its\nrow on the Hub so it no longer shows as offline.\n\n --force Required to actually delete (without it, prints what would go)\n --hub-only Only remove the Hub row (the retry command printed when the Hub\n could not be reached); takes the node_id from that warning\n --hub <url> Hub to use with --hub-only (default: your login's Hub)\n\nThe Hub row is matched by node_id only \u2014 never by name \u2014 so a node elsewhere\nthat reuses the same name is left untouched.\nIf the Hub is unreachable or refuses, the local files are still deleted, a\nwarning prints the exact retry command, and the exit code is 1.";
|
|
2
|
+
/** path (space-joined) → usage text. `{cmd}` is replaced by the word the user typed (hub/server). */
|
|
3
|
+
export declare const COMMAND_HELP: Record<string, string>;
|
|
4
|
+
/**
|
|
5
|
+
* The most specific help entry for argv (e.g. ["node","delete","x","--help"]).
|
|
6
|
+
* Only the leading positional words are the command path; the longest prefix
|
|
7
|
+
* with an entry wins. `minDepth` lets the caller skip bare group entries when a
|
|
8
|
+
* richer group printer exists in bin/cli.ts.
|
|
9
|
+
*/
|
|
10
|
+
export declare function lookupCommandHelp(argv: string[], minDepth?: number): string | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1645 —— `anet doctor` 原先对三个 runtime CLI **只检查「在不在」**:
|
|
3
|
+
*
|
|
4
|
+
* try { execSync("codex --version", …); check("Codex CLI", true); } catch { … }
|
|
5
|
+
*
|
|
6
|
+
* 于是一个**装着、但太旧**的 CLI 会拿到一个 ✅。实测过一次:`codex-cli 0.149.1`
|
|
7
|
+
* 解不动上游 models 响应(`unknown variant \`max\``,它只认到 `xhigh`),
|
|
8
|
+
* rmcp worker 致命退出,用户看到的是 300s 超时 —— 而 doctor 说一切正常。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **这里只把版本摆出来,不做最低版本判定。**
|
|
11
|
+
* 「多少版本才够」由上游返回什么决定,不是我们能钉死的常量;猜一个下限,
|
|
12
|
+
* 会在别人升级 CLI、上游又改动之后变成误报。而一个会误报的检查,
|
|
13
|
+
* 第一周就会被人关掉。摆出实际版本,让读的人自己对得上号,是这一格
|
|
14
|
+
* 现在能诚实做到的全部。
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatCliVersion(raw: unknown): string;
|
package/dist/src/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function a0_0x3a8a(_0xbf97b2,_0x1b0d8b){_0xbf97b2=_0xbf97b2-0xcc;const _0x1ead6b=a0_0x1ead();let _0x3a8a84=_0x1ead6b[_0xbf97b2];return _0x3a8a84;}const a0_0x5aa207=a0_0x3a8a;(function(_0xd6e14f,_0x212c4a){const _0x2d861c=a0_0x3a8a,_0x33513c=_0xd6e14f();while(!![]){try{const _0x25926b=-parseInt(_0x2d861c(0xfe))/0x1*(-parseInt(_0x2d861c(0x10c))/0x2)+parseInt(_0x2d861c(0xcc))/0x3+-parseInt(_0x2d861c(0xd2))/0x4+parseInt(_0x2d861c(0xf1))/0x5+-parseInt(_0x2d861c(0x101))/0x6+parseInt(_0x2d861c(0xd7))/0x7+parseInt(_0x2d861c(0xf8))/0x8*(-parseInt(_0x2d861c(0x11b))/0x9);if(_0x25926b===_0x212c4a)break;else _0x33513c['push'](_0x33513c['shift']());}catch(_0x177805){_0x33513c['push'](_0x33513c['shift']());}}}(a0_0x1ead,0xc6cad));function a0_0x1ead(){const _0x2627eb=['now','send_reply','inbox\x20error:\x20','token','error','data:\x20','application/json','task','read','body','reply','type','getReader','completed','sseAbort','disconnected','sdk-','toString','text','7438645HSevlt','match','status','/events/','log','application/json,\x20text/event-stream','message','8JSJtRn','Authorization','reconnectDelay','heartbeat\x20failed:\x20','heartbeatTimer','Bearer\x20','221077ssreUs','idle','sdk','1867512LPzeik','sleep','tools/call','new_message','connect','replace','url','alias','resumeId','content','messages','14GwWeVF','call','parse','SSE\x20error:\x20','autoConnect','result','min','getAllStatus','stringify','split','connectSSE','disconnect','broadcast','catch','POST','37381941xaArGT','name','decode','running','abort','3374694yHCTbU','connected','emit',']\x20[commhub:','2.0','startsWith','1593356MtueIW','send_task','new_task','get_all_status','text/event-stream','10620589IiTBss','heartbeatInterval','agent','from_session','registered','send','processInbox'];a0_0x1ead=function(){return _0x2627eb;};return a0_0x1ead();}import{EventEmitter as a0_0x91c43c}from'events';import{hostname as a0_0x6b38b3}from'os';class T extends a0_0x91c43c{[a0_0x5aa207(0x107)];['alias'];['token'];[a0_0x5aa207(0xd9)];[a0_0x5aa207(0x109)];[a0_0x5aa207(0xd8)];[a0_0x5aa207(0xfa)];['heartbeatTimer'];[a0_0x5aa207(0xec)];[a0_0x5aa207(0x11e)]=!0x1;constructor(_0x47ad2f){const _0x5595b9=a0_0x5aa207;super();if(this[_0x5595b9(0x107)]=_0x47ad2f[_0x5595b9(0x107)][_0x5595b9(0x106)](/\/$/,''),this['alias']=_0x47ad2f[_0x5595b9(0x108)],this['token']=_0x47ad2f['token'],this[_0x5595b9(0xd9)]=_0x47ad2f[_0x5595b9(0xd9)]||_0x5595b9(0x100),this[_0x5595b9(0x109)]=_0x5595b9(0xee)+_0x47ad2f[_0x5595b9(0x108)]+'-'+Date['now']()[_0x5595b9(0xef)](0x24),this[_0x5595b9(0xd8)]=_0x47ad2f[_0x5595b9(0xd8)]??0x2bf20,this[_0x5595b9(0xfa)]=_0x47ad2f[_0x5595b9(0xfa)]??0xbb8,_0x47ad2f[_0x5595b9(0x110)]!==!0x1)this[_0x5595b9(0x105)]();}[a0_0x5aa207(0xf5)](_0x5fdeb3){const _0x2d8ca9=a0_0x5aa207;console[_0x2d8ca9(0xf5)]('['+new Date()['toTimeString']()['slice'](0x0,0x8)+_0x2d8ca9(0xcf)+this[_0x2d8ca9(0x108)]+']\x20'+_0x5fdeb3);}async[a0_0x5aa207(0x10d)](_0x45979e,_0x67f4c2){const _0x16d5cf=a0_0x5aa207;let _0x374bc2={'Content-Type':_0x16d5cf(0xe4),'Accept':_0x16d5cf(0xf6)};if(this[_0x16d5cf(0xe1)])_0x374bc2[_0x16d5cf(0xf9)]=_0x16d5cf(0xfd)+this[_0x16d5cf(0xe1)];let _0x22adec=await(await fetch(this['url']+'/mcp',{'method':_0x16d5cf(0x11a),'headers':_0x374bc2,'body':JSON[_0x16d5cf(0x114)]({'jsonrpc':_0x16d5cf(0xd0),'id':Date[_0x16d5cf(0xde)](),'method':_0x16d5cf(0x103),'params':{'name':_0x45979e,'arguments':_0x67f4c2}})}))[_0x16d5cf(0xf0)](),_0x3347e1=_0x22adec[_0x16d5cf(0xf2)](/data: (.+)/),_0xdefda1=_0x3347e1?JSON[_0x16d5cf(0x10e)](_0x3347e1[0x1]):JSON[_0x16d5cf(0x10e)](_0x22adec),_0x3a1676=_0xdefda1?.[_0x16d5cf(0x111)]?.[_0x16d5cf(0x10a)]?.[0x0]?.[_0x16d5cf(0xf0)];return _0x3a1676?JSON['parse'](_0x3a1676):_0xdefda1;}async[a0_0x5aa207(0x105)](){const _0x5f85e5=a0_0x5aa207;if(this[_0x5f85e5(0x11e)])return;this[_0x5f85e5(0x11e)]=!0x0,await this[_0x5f85e5(0xf3)]('idle'),this[_0x5f85e5(0xf5)](_0x5f85e5(0xdb)),this[_0x5f85e5(0xfc)]=setInterval(()=>{const _0x5eb5ea=_0x5f85e5;this[_0x5eb5ea(0xf3)](_0x5eb5ea(0xff))[_0x5eb5ea(0x119)](_0x13203a=>this['log'](_0x5eb5ea(0xfb)+_0x13203a[_0x5eb5ea(0xf7)]));},this[_0x5f85e5(0xd8)]),this[_0x5f85e5(0x116)]();}async[a0_0x5aa207(0x117)](){const _0x49f25e=a0_0x5aa207;if(this[_0x49f25e(0x11e)]=!0x1,this[_0x49f25e(0xec)]?.[_0x49f25e(0x11f)](),this[_0x49f25e(0xfc)])clearInterval(this['heartbeatTimer']);await this[_0x49f25e(0xf3)]('offline')[_0x49f25e(0x119)](()=>{}),this['log'](_0x49f25e(0xed));}async[a0_0x5aa207(0xdc)](_0x4d1e04,_0x422be9,_0x33f24d='normal'){const _0x58ff90=a0_0x5aa207;return this[_0x58ff90(0x10d)](_0x58ff90(0xd3),{'alias':_0x4d1e04,'task':_0x422be9,'priority':_0x33f24d,'from_session':this[_0x58ff90(0x108)]});}async[a0_0x5aa207(0xf7)](_0x2de477,_0x3fd06a){const _0x5cc294=a0_0x5aa207;return this[_0x5cc294(0x10d)]('send_message',{'alias':_0x2de477,'message':_0x3fd06a,'from_session':this[_0x5cc294(0x108)]});}async[a0_0x5aa207(0xe8)](_0x3b3fed,_0x184d4b,_0x4848ea=a0_0x5aa207(0xeb)){const _0x14bcfc=a0_0x5aa207;return this[_0x14bcfc(0x10d)](_0x14bcfc(0xdf),{'in_reply_to':_0x3b3fed,'text':_0x184d4b,'status':_0x4848ea});}async[a0_0x5aa207(0xf3)](_0x930c31,_0x51a838){const _0x519971=a0_0x5aa207;return this['call']('report_status',{'resume_id':this[_0x519971(0x109)],'alias':this[_0x519971(0x108)],'status':_0x930c31,'server':a0_0x6b38b3(),'hostname':a0_0x6b38b3(),'agent':this[_0x519971(0xd9)],'project_dir':process['cwd'](),..._0x51a838});}async[a0_0x5aa207(0x113)](){const _0x68d16f=a0_0x5aa207;return this[_0x68d16f(0x10d)](_0x68d16f(0xd5),{});}async[a0_0x5aa207(0x118)](_0xe805e0,_0x2e4b2e){const _0x1911cc=a0_0x5aa207;return this[_0x1911cc(0x10d)](_0x1911cc(0x118),{'message':_0xe805e0,'filter_server':_0x2e4b2e?.['server'],'filter_status':_0x2e4b2e?.[_0x1911cc(0xf3)]});}async[a0_0x5aa207(0x116)](){const _0x34f5e5=a0_0x5aa207;let _0x44fca8=encodeURIComponent(this['alias']),_0x376b8f=this[_0x34f5e5(0x107)]+_0x34f5e5(0xf4)+_0x44fca8,_0x15a433=this[_0x34f5e5(0xfa)];while(this[_0x34f5e5(0x11e)]){try{this[_0x34f5e5(0xec)]=new AbortController();let _0x8d52a9={'Accept':_0x34f5e5(0xd6)};if(this[_0x34f5e5(0xe1)])_0x8d52a9['Authorization']=_0x34f5e5(0xfd)+this[_0x34f5e5(0xe1)];let _0xf1718=await fetch(_0x376b8f,{'headers':_0x8d52a9,'signal':this[_0x34f5e5(0xec)]['signal']});if(!_0xf1718['ok']||!_0xf1718[_0x34f5e5(0xe7)]){this[_0x34f5e5(0xf5)]('SSE\x20failed:\x20'+_0xf1718[_0x34f5e5(0xf3)]),await this[_0x34f5e5(0x102)](_0x15a433),_0x15a433=Math[_0x34f5e5(0x112)](_0x15a433*1.5,0xea60);continue;}_0x15a433=this[_0x34f5e5(0xfa)];let _0x2fc049=_0xf1718[_0x34f5e5(0xe7)][_0x34f5e5(0xea)](),_0x3d6c41=new TextDecoder(),_0x3d7d38='';while(this[_0x34f5e5(0x11e)]){let {done:_0x4c9277,value:_0x1cf8ca}=await _0x2fc049[_0x34f5e5(0xe6)]();if(_0x4c9277)break;_0x3d7d38+=_0x3d6c41[_0x34f5e5(0x11d)](_0x1cf8ca,{'stream':!0x0});let _0x1b850d=_0x3d7d38[_0x34f5e5(0x115)]('\x0a');_0x3d7d38=_0x1b850d['pop']()||'';for(let _0x25a619 of _0x1b850d){if(!_0x25a619[_0x34f5e5(0xd1)](_0x34f5e5(0xe3)))continue;try{let _0x3ba9fb=JSON[_0x34f5e5(0x10e)](_0x25a619['slice'](0x6));if(_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0xcd)){this['log']('SSE\x20connected'),this[_0x34f5e5(0xce)](_0x34f5e5(0xcd));continue;}if(_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0xd4)||_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0x104)||_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0x118))await this[_0x34f5e5(0xdd)]();}catch{}}}}catch(_0x198ae9){if(_0x198ae9[_0x34f5e5(0x11c)]==='AbortError')break;this[_0x34f5e5(0xce)](_0x34f5e5(0xe2),_0x198ae9),this[_0x34f5e5(0xf5)](_0x34f5e5(0x10f)+_0x198ae9['message']);}if(this[_0x34f5e5(0x11e)])this[_0x34f5e5(0xce)](_0x34f5e5(0xed)),this[_0x34f5e5(0xf5)]('SSE\x20reconnecting\x20in\x20'+_0x15a433/0x3e8+'s...'),await this[_0x34f5e5(0x102)](_0x15a433),_0x15a433=Math[_0x34f5e5(0x112)](_0x15a433*1.5,0xea60);}}async[a0_0x5aa207(0xdd)](){const _0x3d456e=a0_0x5aa207;try{let _0x12d9d9=(await this['call']('get_inbox',{'alias':this[_0x3d456e(0x108)],'limit':0xa}))?.[_0x3d456e(0x10b)]||[];for(let _0x297550 of _0x12d9d9)await this[_0x3d456e(0x10d)]('ack_inbox',{'alias':this[_0x3d456e(0x108)],'message_id':_0x297550['id']}),this['log']('←\x20'+_0x297550[_0x3d456e(0xda)]+':\x20'+_0x297550[_0x3d456e(0x10a)]['slice'](0x0,0x3c)),this['emit'](_0x3d456e(0xe5),_0x297550),this['emit']('message',_0x297550);}catch(_0x4476fa){this[_0x3d456e(0xf5)](_0x3d456e(0xe0)+_0x4476fa['message']);}}[a0_0x5aa207(0x102)](_0x3443b1){return new Promise(_0x5e965d=>setTimeout(_0x5e965d,_0x3443b1));}}var $=T;export{$ as default,T as CommHub};
|
|
1
|
+
const a0_0x48433c=a0_0x25c5;(function(_0x46ea15,_0xf86193){const _0x3e2f9a=a0_0x25c5,_0x48b355=_0x46ea15();while(!![]){try{const _0x1e6afa=-parseInt(_0x3e2f9a(0x19c))/0x1+-parseInt(_0x3e2f9a(0x184))/0x2+-parseInt(_0x3e2f9a(0x1a0))/0x3+-parseInt(_0x3e2f9a(0x17f))/0x4*(-parseInt(_0x3e2f9a(0x1a3))/0x5)+-parseInt(_0x3e2f9a(0x196))/0x6*(-parseInt(_0x3e2f9a(0x1b2))/0x7)+-parseInt(_0x3e2f9a(0x1dc))/0x8*(-parseInt(_0x3e2f9a(0x199))/0x9)+-parseInt(_0x3e2f9a(0x1f2))/0xa*(-parseInt(_0x3e2f9a(0x1b1))/0xb);if(_0x1e6afa===_0xf86193)break;else _0x48b355['push'](_0x48b355['shift']());}catch(_0x283aa6){_0x48b355['push'](_0x48b355['shift']());}}}(a0_0xbe4d,0x3f44f));import{EventEmitter as a0_0x380af2}from'events';import{hostname as a0_0x106efe}from'os';var K=/(?:atok|ntok|utok|ghp|github_pat)_[A-Za-z0-9_-]+|Bearer\s+\S+/gi,L=(_0x1f4861,_0x55d04d)=>(_0x1f4861??_0x55d04d)[a0_0x48433c(0x1eb)](/[\r\n\x00-\x1f\x7f]/g,'\x20')[a0_0x48433c(0x1db)](0x0,0xf0);function N(_0x4d9f15){const _0x3edcc6=a0_0x48433c;return(_0x4d9f15 instanceof Error?_0x4d9f15[_0x3edcc6(0x1da)]:String(_0x4d9f15??'unknown\x20error'))[_0x3edcc6(0x1eb)](K,_0x3edcc6(0x18b))[_0x3edcc6(0x1eb)](/[\r\n\x00-\x1f\x7f]/g,'\x20')[_0x3edcc6(0x1db)](0x0,0xf0);}function O(_0x5112e6,_0x4ebefc=process.env.ANET_TASK_TRACE_FORMAT==='json'){const _0x2cecd0=a0_0x48433c;if(_0x4ebefc)return JSON[_0x2cecd0(0x19f)](_0x5112e6);let _0x1e83df=L(_0x5112e6['parent_task_id'],'<missing>'),_0x1e1b52=L(_0x5112e6['task_id'],_0x2cecd0(0x1ac)),_0x1b33ca=_0x5112e6[_0x2cecd0(0x1e1)]?'\x20error='+_0x5112e6[_0x2cecd0(0x1e1)]+':'+(_0x5112e6['error_message']??''):'';return _0x2cecd0(0x1be)+_0x5112e6[_0x2cecd0(0x19a)]+_0x2cecd0(0x1ae)+L(_0x5112e6[_0x2cecd0(0x1cd)],_0x2cecd0(0x194))+_0x2cecd0(0x1cb)+L(_0x5112e6['to_alias'],'<unknown>')+_0x2cecd0(0x1ca)+_0x1e1b52+_0x2cecd0(0x1d3)+_0x1e83df+_0x2cecd0(0x18f)+L(_0x5112e6[_0x2cecd0(0x1b0)],_0x2cecd0(0x194))+'\x20transport='+_0x5112e6[_0x2cecd0(0x1ba)]+'\x20duration_ms='+_0x5112e6[_0x2cecd0(0x1f5)]+_0x2cecd0(0x1ea)+_0x5112e6[_0x2cecd0(0x1d0)]+_0x1b33ca;}function a0_0xbe4d(){const _0x18b3ad=['application/json,\x20text/event-stream','result','293594XJfJpR','parentTaskId','startsWith','delivered','parse','report_status','now','[REDACTED]','cwd','signal','new_task','\x20network_id=','heartbeatTimer','reconnectDelay','heartbeatInterval','disconnect','<unknown>','error','220818NCEcyU','split','sending','72999AFTSCh','status','sleep','328649gIhkRV','toString','/events/','stringify','695559rteRBQ','call','offline','854020VveXXY','send_failed','data:\x20','min','task.started','token','name','failed','connectSSE','<pending>','sdk','\x20from=',']\x20[commhub:','network_id','165ayXvtG','14OvMOow','content','autoConnect','SSE\x20connected','get_inbox','running','send_rejected','task','transport','Authorization','sseAbort','agent','[commhub:task]\x20','connected','new_message','from_session','AbortError','fromAlias','emit','send','inbox\x20error:\x20','match','decode','POST','\x20task_id=','\x20to=','task.ack','from_alias','catch','Bearer\x20','lifecycle_tracking','networkId','broadcast','\x20parent_task_id=','log','task.send.failed','text','messages','SSE\x20error:\x20','SSE\x20reconnecting\x20in\x20','message','slice','88aLxMBb','CommHub\x20response\x20omitted\x20task_id','alias','connect','/mcp','error_code','resumeId','not_tracked','type','disconnected','text/event-stream','reply','send_message','processInbox','\x20lifecycle=','replace','read','normal','missing_task_id','ack_inbox','idle','SSE\x20failed:\x20','308010RkKMuC','task.replied','message_id','duration_ms','toAlias','8nMwYOd','url','getAllStatus'];a0_0xbe4d=function(){return _0x18b3ad;};return a0_0xbe4d();}function U(_0x443d5a){const _0x5f2337=a0_0x48433c;return{'event':{'sending':'task.send.start','delivered':'task.send.delivered','failed':_0x5f2337(0x1d5),'acked':_0x5f2337(0x1cc),'started':_0x5f2337(0x1a7),'replied':_0x5f2337(0x1f3),'expired':'task.expired'}[_0x443d5a['status']],..._0x443d5a};}function j(_0x2d5dcc){const _0xd8436b=a0_0x48433c;let _0x548b7d=_0x2d5dcc?.['task_id']||_0x2d5dcc?.[_0xd8436b(0x1f4)]||_0x2d5dcc?.['id'];if(_0x548b7d)return String(_0x548b7d);let _0x1e5f66=_0x2d5dcc?.[_0xd8436b(0x1b3)]?.[0x0]?.[_0xd8436b(0x1d6)];if(typeof _0x1e5f66!=='string')return null;try{let _0x3a88b6=JSON['parse'](_0x1e5f66);return _0x3a88b6?.['task_id']||_0x3a88b6?.[_0xd8436b(0x1f4)]||_0x3a88b6?.['id']||null;}catch{return null;}}async function X(_0x4c70b6,_0xe12a0f){const _0x6fc10d=a0_0x48433c;let _0xc9fad1=_0xe12a0f[_0x6fc10d(0x18a)]??Date[_0x6fc10d(0x18a)],_0x27ca03=_0xc9fad1(),_0x128507=(_0x4531d6,_0x3de46c,_0xe9eb4f,_0x2cef04)=>{const _0x462bab=_0x6fc10d;_0xe12a0f['log'](O(U({'from_alias':_0x4c70b6[_0x462bab(0x1c3)],'to_alias':_0x4c70b6[_0x462bab(0x1f6)],'task_id':_0x3de46c,'parent_task_id':_0x4c70b6[_0x462bab(0x185)],'network_id':_0x4c70b6[_0x462bab(0x1d1)],'transport':_0x4c70b6['transport'],'status':_0x4531d6,'duration_ms':_0xc9fad1()-_0x27ca03,'lifecycle_tracking':_0x4c70b6['lifecycleTracking'],..._0xe9eb4f!==void 0x0?{'error_code':_0x2cef04||_0x462bab(0x1a4),'error_message':N(_0xe9eb4f)}:{}})));};_0x128507(_0x6fc10d(0x198),null);try{let _0x1ecd39=await _0xe12a0f['send'](),_0x1b32de=j(_0x1ecd39);if(_0x1b32de)_0x128507(_0x6fc10d(0x187),_0x1b32de);else{if(_0x1ecd39?.['ok']===!0x1||_0x1ecd39?.[_0x6fc10d(0x195)])_0x128507(_0x6fc10d(0x1aa),_0x1b32de,_0x1ecd39?.[_0x6fc10d(0x195)]||'CommHub\x20rejected\x20task',_0x6fc10d(0x1b8));else _0x128507(_0x6fc10d(0x1aa),null,_0x6fc10d(0x1dd),_0x6fc10d(0x1ee));}return _0x1ecd39;}catch(_0x13b6cd){throw _0x128507(_0x6fc10d(0x1aa),null,_0x13b6cd,_0x6fc10d(0x1a4)),_0x13b6cd;}}function a0_0x25c5(_0x3eccf3,_0x49d5ba){_0x3eccf3=_0x3eccf3-0x17f;const _0xbe4da1=a0_0xbe4d();let _0x25c58d=_0xbe4da1[_0x3eccf3];return _0x25c58d;}async function Y(_0x1fcaa8,_0x1d0a6c){const _0x44c82f=a0_0x48433c;return X({'fromAlias':_0x1fcaa8[_0x44c82f(0x1c3)],'toAlias':_0x1fcaa8[_0x44c82f(0x1de)],'parentTaskId':_0x1fcaa8[_0x44c82f(0x185)]||null,'networkId':_0x1fcaa8[_0x44c82f(0x1d1)]||null,'transport':'mcp_http','lifecycleTracking':_0x44c82f(0x1e3)},_0x1d0a6c);}class $ extends a0_0x380af2{[a0_0x48433c(0x180)];[a0_0x48433c(0x1de)];[a0_0x48433c(0x1a8)];[a0_0x48433c(0x1bd)];[a0_0x48433c(0x1e2)];[a0_0x48433c(0x192)];[a0_0x48433c(0x191)];[a0_0x48433c(0x190)];[a0_0x48433c(0x1bc)];[a0_0x48433c(0x1b7)]=!0x1;constructor(_0x14f07d){const _0x1ee3a1=a0_0x48433c;super();if(this[_0x1ee3a1(0x180)]=_0x14f07d[_0x1ee3a1(0x180)][_0x1ee3a1(0x1eb)](/\/$/,''),this[_0x1ee3a1(0x1de)]=_0x14f07d[_0x1ee3a1(0x1de)],this[_0x1ee3a1(0x1a8)]=_0x14f07d[_0x1ee3a1(0x1a8)],this[_0x1ee3a1(0x1bd)]=_0x14f07d[_0x1ee3a1(0x1bd)]||_0x1ee3a1(0x1ad),this[_0x1ee3a1(0x1e2)]='sdk-'+_0x14f07d['alias']+'-'+Date[_0x1ee3a1(0x18a)]()[_0x1ee3a1(0x19d)](0x24),this['heartbeatInterval']=_0x14f07d['heartbeatInterval']??0x2bf20,this[_0x1ee3a1(0x191)]=_0x14f07d[_0x1ee3a1(0x191)]??0xbb8,_0x14f07d[_0x1ee3a1(0x1b4)]!==!0x1)this[_0x1ee3a1(0x1df)]();}[a0_0x48433c(0x1d4)](_0x26730f){const _0xf9f10b=a0_0x48433c;console[_0xf9f10b(0x1d4)]('['+new Date()['toTimeString']()[_0xf9f10b(0x1db)](0x0,0x8)+_0xf9f10b(0x1af)+this[_0xf9f10b(0x1de)]+']\x20'+_0x26730f);}async[a0_0x48433c(0x1a1)](_0x38469f,_0x8003aa){const _0x21c350=a0_0x48433c;let _0x184cbb={'Content-Type':'application/json','Accept':_0x21c350(0x182)};if(this[_0x21c350(0x1a8)])_0x184cbb['Authorization']=_0x21c350(0x1cf)+this[_0x21c350(0x1a8)];let _0x1aa8a8=await(await fetch(this[_0x21c350(0x180)]+_0x21c350(0x1e0),{'method':_0x21c350(0x1c9),'headers':_0x184cbb,'body':JSON[_0x21c350(0x19f)]({'jsonrpc':'2.0','id':Date['now'](),'method':'tools/call','params':{'name':_0x38469f,'arguments':_0x8003aa}})}))[_0x21c350(0x1d6)](),_0x1e6d03=_0x1aa8a8[_0x21c350(0x1c7)](/data: (.+)/),_0x4d9cdc=_0x1e6d03?JSON[_0x21c350(0x188)](_0x1e6d03[0x1]):JSON[_0x21c350(0x188)](_0x1aa8a8),_0x168189=_0x4d9cdc?.[_0x21c350(0x183)]?.[_0x21c350(0x1b3)]?.[0x0]?.['text'];return _0x168189?JSON[_0x21c350(0x188)](_0x168189):_0x4d9cdc;}async[a0_0x48433c(0x1df)](){const _0x5ef9d2=a0_0x48433c;if(this['running'])return;this[_0x5ef9d2(0x1b7)]=!0x0,await this['status']('idle'),this[_0x5ef9d2(0x1d4)]('registered'),this['heartbeatTimer']=setInterval(()=>{const _0x1a596e=_0x5ef9d2;this[_0x1a596e(0x19a)](_0x1a596e(0x1f0))['catch'](_0x2c4857=>this['log']('heartbeat\x20failed:\x20'+_0x2c4857[_0x1a596e(0x1da)]));},this[_0x5ef9d2(0x192)]),this[_0x5ef9d2(0x1ab)]();}async[a0_0x48433c(0x193)](){const _0x117d6f=a0_0x48433c;if(this['running']=!0x1,this[_0x117d6f(0x1bc)]?.['abort'](),this[_0x117d6f(0x190)])clearInterval(this[_0x117d6f(0x190)]);await this[_0x117d6f(0x19a)](_0x117d6f(0x1a2))[_0x117d6f(0x1ce)](()=>{}),this[_0x117d6f(0x1d4)](_0x117d6f(0x1e5));}async[a0_0x48433c(0x1c5)](_0x507688,_0x4d2652,_0x1d9aa9=a0_0x48433c(0x1ed)){const _0x18b33b=a0_0x48433c;return Y({'alias':_0x507688,'fromAlias':this['alias']},{'log':_0x53e914=>console[_0x18b33b(0x1d4)](_0x53e914),'send':()=>this[_0x18b33b(0x1a1)]('send_task',{'alias':_0x507688,'task':_0x4d2652,'priority':_0x1d9aa9,'from_session':this['alias']})});}async[a0_0x48433c(0x1da)](_0x222f0e,_0x2443ac){const _0xd27eb=a0_0x48433c;return this[_0xd27eb(0x1a1)](_0xd27eb(0x1e8),{'alias':_0x222f0e,'message':_0x2443ac,'from_session':this['alias']});}async[a0_0x48433c(0x1e7)](_0x3ee7ff,_0x3b5a09,_0x348637='completed'){return this['call']('send_reply',{'in_reply_to':_0x3ee7ff,'text':_0x3b5a09,'status':_0x348637});}async[a0_0x48433c(0x19a)](_0x19c6f1,_0x3ac224){const _0x39e811=a0_0x48433c;return this[_0x39e811(0x1a1)](_0x39e811(0x189),{'resume_id':this[_0x39e811(0x1e2)],'alias':this['alias'],'status':_0x19c6f1,'server':a0_0x106efe(),'hostname':a0_0x106efe(),'agent':this[_0x39e811(0x1bd)],'project_dir':process[_0x39e811(0x18c)](),..._0x3ac224});}async[a0_0x48433c(0x181)](){return this['call']('get_all_status',{});}async[a0_0x48433c(0x1d2)](_0x415ea4,_0x2a7b72){const _0x88ef61=a0_0x48433c;return this[_0x88ef61(0x1a1)](_0x88ef61(0x1d2),{'message':_0x415ea4,'filter_server':_0x2a7b72?.['server'],'filter_status':_0x2a7b72?.[_0x88ef61(0x19a)]});}async[a0_0x48433c(0x1ab)](){const _0x77362f=a0_0x48433c;let _0x285b8b=encodeURIComponent(this[_0x77362f(0x1de)]),_0x393a6b=this['url']+_0x77362f(0x19e)+_0x285b8b,_0x51c2c8=this[_0x77362f(0x191)];while(this['running']){try{this[_0x77362f(0x1bc)]=new AbortController();let _0x22fca9={'Accept':_0x77362f(0x1e6)};if(this['token'])_0x22fca9[_0x77362f(0x1bb)]='Bearer\x20'+this[_0x77362f(0x1a8)];let _0x31343f=await fetch(_0x393a6b,{'headers':_0x22fca9,'signal':this[_0x77362f(0x1bc)][_0x77362f(0x18d)]});if(!_0x31343f['ok']||!_0x31343f['body']){this['log'](_0x77362f(0x1f1)+_0x31343f['status']),await this[_0x77362f(0x19b)](_0x51c2c8),_0x51c2c8=Math[_0x77362f(0x1a6)](_0x51c2c8*1.5,0xea60);continue;}_0x51c2c8=this[_0x77362f(0x191)];let _0x5a6963=_0x31343f['body']['getReader'](),_0x109d8c=new TextDecoder(),_0x32f459='';while(this[_0x77362f(0x1b7)]){let {done:_0xf4de4e,value:_0x3dd999}=await _0x5a6963[_0x77362f(0x1ec)]();if(_0xf4de4e)break;_0x32f459+=_0x109d8c[_0x77362f(0x1c8)](_0x3dd999,{'stream':!0x0});let _0x296e81=_0x32f459[_0x77362f(0x197)]('\x0a');_0x32f459=_0x296e81['pop']()||'';for(let _0x2ae7a6 of _0x296e81){if(!_0x2ae7a6[_0x77362f(0x186)](_0x77362f(0x1a5)))continue;try{let _0x572285=JSON[_0x77362f(0x188)](_0x2ae7a6[_0x77362f(0x1db)](0x6));if(_0x572285['type']===_0x77362f(0x1bf)){this['log'](_0x77362f(0x1b5)),this[_0x77362f(0x1c4)](_0x77362f(0x1bf));continue;}if(_0x572285[_0x77362f(0x1e4)]===_0x77362f(0x18e)||_0x572285[_0x77362f(0x1e4)]===_0x77362f(0x1c0)||_0x572285[_0x77362f(0x1e4)]===_0x77362f(0x1d2))await this[_0x77362f(0x1e9)]();}catch{}}}}catch(_0x2a2b85){if(_0x2a2b85[_0x77362f(0x1a9)]===_0x77362f(0x1c2))break;this[_0x77362f(0x1c4)]('error',_0x2a2b85),this[_0x77362f(0x1d4)](_0x77362f(0x1d8)+_0x2a2b85[_0x77362f(0x1da)]);}if(this[_0x77362f(0x1b7)])this[_0x77362f(0x1c4)]('disconnected'),this[_0x77362f(0x1d4)](_0x77362f(0x1d9)+_0x51c2c8/0x3e8+'s...'),await this[_0x77362f(0x19b)](_0x51c2c8),_0x51c2c8=Math[_0x77362f(0x1a6)](_0x51c2c8*1.5,0xea60);}}async[a0_0x48433c(0x1e9)](){const _0x4c7a09=a0_0x48433c;try{let _0x21f5e2=(await this[_0x4c7a09(0x1a1)](_0x4c7a09(0x1b6),{'alias':this[_0x4c7a09(0x1de)],'limit':0xa}))?.[_0x4c7a09(0x1d7)]||[];for(let _0x36fefa of _0x21f5e2)await this[_0x4c7a09(0x1a1)](_0x4c7a09(0x1ef),{'alias':this[_0x4c7a09(0x1de)],'message_id':_0x36fefa['id']}),this[_0x4c7a09(0x1d4)]('←\x20'+_0x36fefa[_0x4c7a09(0x1c1)]+':\x20'+_0x36fefa['content'][_0x4c7a09(0x1db)](0x0,0x3c)),this[_0x4c7a09(0x1c4)](_0x4c7a09(0x1b9),_0x36fefa),this[_0x4c7a09(0x1c4)]('message',_0x36fefa);}catch(_0x369a2a){this[_0x4c7a09(0x1d4)](_0x4c7a09(0x1c6)+_0x369a2a[_0x4c7a09(0x1da)]);}}[a0_0x48433c(0x19b)](_0x59db37){return new Promise(_0x4088ea=>setTimeout(_0x4088ea,_0x59db37));}}var F=$;export{F as default,$ as CommHub};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** A prefix is hex digits and dashes. Shorter than this matches too much to be a deliberate choice. */
|
|
2
|
+
export declare const MIN_THREAD_PREFIX = 4;
|
|
3
|
+
export interface ExternalThread {
|
|
4
|
+
readonly threadId: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly bytes: number;
|
|
7
|
+
readonly inode: number | bigint;
|
|
8
|
+
readonly mtimeMs: number;
|
|
9
|
+
/** session_meta timestamp (falls back to the file's mtime when missing). */
|
|
10
|
+
readonly startedAt: string;
|
|
11
|
+
readonly cwd: string | null;
|
|
12
|
+
readonly firstPrompt: string | null;
|
|
13
|
+
}
|
|
14
|
+
/** The first thing the human typed: event_msg user_message, else a user message item that is not injected context. */
|
|
15
|
+
export declare function firstPromptOf(lines: readonly string[]): string | null;
|
|
16
|
+
export declare function threadFactsOf(path: string, threadId: string, mtimeMs: number, headBytes?: number): {
|
|
17
|
+
startedAt: string;
|
|
18
|
+
cwd: string | null;
|
|
19
|
+
firstPrompt: string | null;
|
|
20
|
+
};
|
|
21
|
+
/** Every rollout under `<codexHome>/sessions` (read-only), newest first. */
|
|
22
|
+
export declare function listExternalThreads(codexHome: string): ExternalThread[];
|
|
23
|
+
export type ThreadResolution = {
|
|
24
|
+
kind: "ok";
|
|
25
|
+
thread: ExternalThread;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "invalid";
|
|
28
|
+
reason: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "none";
|
|
31
|
+
}
|
|
32
|
+
/** The prefix names more than one thread. */
|
|
33
|
+
| {
|
|
34
|
+
kind: "ambiguous";
|
|
35
|
+
matches: readonly ExternalThread[];
|
|
36
|
+
}
|
|
37
|
+
/** One thread id, but more than one rollout file carries it — which one is the conversation is a guess. */
|
|
38
|
+
| {
|
|
39
|
+
kind: "duplicate";
|
|
40
|
+
matches: readonly ExternalThread[];
|
|
41
|
+
};
|
|
42
|
+
export declare function resolveExternalThread(threads: readonly ExternalThread[], query: string): ThreadResolution;
|
|
43
|
+
/** Shortest prefix (≥ minLen) of each id that no other id in the list shares. */
|
|
44
|
+
export declare function shortIds(ids: readonly string[], minLen?: number): Map<string, string>;
|
|
45
|
+
/** Numbered table for the picker / the non-TTY listing. Local time is not used: the stamp is the UTC one codex wrote. */
|
|
46
|
+
export declare function formatThreadList(threads: readonly ExternalThread[], limit?: number): string[];
|