@indigoai-us/hq-cli 5.309.0 → 5.310.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/CHANGELOG.md +15 -0
- package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
- package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
- package/dist/command-catalog.generated.d.ts +30 -1
- package/dist/command-catalog.generated.js +37 -1
- package/dist/commands/agents.js +6 -0
- package/dist/commands/core-checkpoint-gate-setting.d.ts +0 -10
- package/dist/commands/core-checkpoint-gate-setting.js +3 -3
- package/dist/commands/core-dm-bind-native.d.ts +32 -0
- package/dist/commands/core-dm-bind-native.js +668 -0
- package/dist/commands/core-native-utilities.d.ts +2 -1
- package/dist/commands/core-native-utilities.js +4 -2
- package/dist/commands/core-ontology.d.ts +1 -9
- package/dist/commands/core-ontology.js +4 -4
- package/dist/commands/core-policy.d.ts +0 -3
- package/dist/commands/core-policy.js +3 -3
- package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
- package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
- package/dist/commands/core.js +6 -0
- package/dist/commands/files.js +1 -1
- package/dist/commands/index-cmd.js +1 -1
- package/dist/commands/integrations-api.d.ts +9 -4
- package/dist/commands/integrations-api.js +9 -6
- package/dist/commands/integrations-manage.js +11 -3
- package/dist/commands/integrations.d.ts +8 -0
- package/dist/commands/integrations.js +83 -0
- package/dist/commands/lanes-checks.d.ts +0 -2
- package/dist/commands/lanes-checks.js +2 -2
- package/dist/commands/lanes.d.ts +0 -11
- package/dist/commands/lanes.js +6 -6
- package/dist/commands/mcp-registration.d.ts +5 -11
- package/dist/commands/mcp-registration.js +2 -6
- package/dist/lib/core-utils/sentry-report.d.ts +5 -11
- package/dist/lib/core-utils/sentry-report.js +2 -2
- package/dist/lib/db/local.d.ts +0 -5
- package/dist/lib/db/local.js +1 -1
- package/dist/lib/db/migrate.d.ts +0 -12
- package/dist/lib/db/migrate.js +5 -5
- package/dist/lib/db/sql.d.ts +0 -10
- package/dist/lib/db/sql.js +4 -8
- package/dist/lib/doctor/checks/codex-wiring.js +1 -33
- package/dist/lib/doctor/checks/grok-wiring.js +1 -34
- package/dist/lib/doctor/deep/effects.js +1 -3
- package/dist/lib/doctor/deep/sandbox.js +1 -3
- package/dist/lib/doctor/fixtures/schema.js +1 -3
- package/dist/lib/doctor/shared.d.ts +8 -0
- package/dist/lib/doctor/shared.js +38 -0
- package/dist/lib/lanes/autopilot.js +6 -4
- package/dist/lib/monitor.d.ts +2 -6
- package/dist/lib/monitor.js +5 -5
- package/dist/lib/report-publish.d.ts +1 -10
- package/dist/lib/report-publish.js +3 -9
- package/dist/lib/search-index/index.d.ts +7 -0
- package/dist/lib/search-index/index.js +21 -2
- package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
- package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
- package/dist/lib/service-manager/launchd.d.ts +0 -7
- package/dist/lib/service-manager/launchd.js +2 -2
- package/dist/main.js +7 -2
- package/dist/startup-registration.js +9 -1
- package/dist/utils/client-health.d.ts +0 -4
- package/dist/utils/client-health.js +2 -2
- package/dist/utils/feedback-diagnostics.d.ts +2 -1
- package/dist/utils/feedback-log-bundle.d.ts +0 -25
- package/dist/utils/feedback-log-bundle.js +5 -5
- package/dist/utils/feedback-logs.d.ts +4 -38
- package/dist/utils/feedback-logs.js +7 -7
- package/dist/utils/feedback-screenshots.d.ts +0 -1
- package/dist/utils/feedback-screenshots.js +1 -1
- package/dist/utils/install-tree-torn.d.ts +19 -13
- package/dist/utils/install-tree-torn.js +77 -2
- package/dist/utils/local-files-overview.d.ts +0 -6
- package/dist/utils/local-files-overview.js +1 -1
- package/dist/utils/qmd-model-download-error.d.ts +0 -8
- package/dist/utils/qmd-model-download-error.js +1 -1
- package/dist/utils/qmd-query-document-error.d.ts +0 -6
- package/dist/utils/qmd-query-document-error.js +1 -1
- package/dist/utils/scaffold-fast-import-guard.d.ts +0 -1
- package/dist/utils/scaffold-fast-import-guard.js +1 -1
- package/dist/utils/scaffold-sibling-references.d.ts +3 -2
- package/dist/utils/sentry-fingerprint.js +17 -0
- package/dist/utils/version-gate.d.ts +4 -0
- package/dist/utils/version-gate.js +13 -0
- package/package.json +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# hq-core: public
|
|
3
|
+
# US-011 — write session meta + reconcile with observation.trustedContext.
|
|
4
|
+
# No --trusted CLI flag in hq-cli; trusted bind is the observation field.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
ROOT="${HQ_ROOT:-${CLAUDE_PROJECT_DIR:-}}"
|
|
8
|
+
if [ -z "$ROOT" ]; then
|
|
9
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
COMPANY=""
|
|
13
|
+
PROJECT=""
|
|
14
|
+
TASK=""
|
|
15
|
+
SESSION_ID=""
|
|
16
|
+
NO_RECONCILE=0
|
|
17
|
+
|
|
18
|
+
while [ $# -gt 0 ]; do
|
|
19
|
+
case "$1" in
|
|
20
|
+
--company|--company-slug) COMPANY="${2:-}"; shift 2 ;;
|
|
21
|
+
--project) PROJECT="${2:-}"; shift 2 ;;
|
|
22
|
+
--task) TASK="${2:-}"; shift 2 ;;
|
|
23
|
+
--session|--session-id) SESSION_ID="${2:-}"; shift 2 ;;
|
|
24
|
+
--no-reconcile) NO_RECONCILE=1; shift ;;
|
|
25
|
+
--root) ROOT="${2:-}"; shift 2 ;;
|
|
26
|
+
-h|--help)
|
|
27
|
+
sed -n '2,8p' "$0" | sed 's/^# \{0,1\}//'
|
|
28
|
+
exit 0
|
|
29
|
+
;;
|
|
30
|
+
*) shift ;;
|
|
31
|
+
esac
|
|
32
|
+
done
|
|
33
|
+
|
|
34
|
+
HQ_SESSION="$ROOT/core/scripts/hq-session.sh"
|
|
35
|
+
|
|
36
|
+
# Resolve session id before metadata writes so a known session is pinned even
|
|
37
|
+
# when the caller omitted --session-id. Empty `pin` must still be safe on
|
|
38
|
+
# macOS Bash 3.2 (`set -u` + `"${pin[@]}"` is an unbound-variable abort).
|
|
39
|
+
if [ -z "$SESSION_ID" ]; then
|
|
40
|
+
SESSION_ID="${HQ_SESSION_ID:-${CLAUDE_CODE_SESSION_ID:-${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${CODEX_THREAD_ID:-}}}}}"
|
|
41
|
+
SESSION_ID="$(printf '%s' "$SESSION_ID" | tr -d '[:space:]')"
|
|
42
|
+
if [ -z "$SESSION_ID" ] && [ -f "$ROOT/workspace/sessions/.current" ]; then
|
|
43
|
+
SESSION_ID="$(tr -d '[:space:]' <"$ROOT/workspace/sessions/.current")"
|
|
44
|
+
fi
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
pin=()
|
|
48
|
+
if [ -n "$SESSION_ID" ]; then
|
|
49
|
+
pin=(--session-id "$SESSION_ID")
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if [ -n "$COMPANY" ]; then
|
|
53
|
+
bash "$HQ_SESSION" ${pin[@]+"${pin[@]}"} set company_slug "$COMPANY"
|
|
54
|
+
fi
|
|
55
|
+
if [ -n "$PROJECT" ]; then
|
|
56
|
+
bash "$HQ_SESSION" ${pin[@]+"${pin[@]}"} set project "$PROJECT"
|
|
57
|
+
fi
|
|
58
|
+
if [ -n "$TASK" ]; then
|
|
59
|
+
bash "$HQ_SESSION" ${pin[@]+"${pin[@]}"} set task "$TASK"
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
if [ "$NO_RECONCILE" -eq 1 ]; then
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
[ -n "$SESSION_ID" ] || exit 0
|
|
67
|
+
|
|
68
|
+
# shellcheck source=lib/work-mesh-enqueue.sh
|
|
69
|
+
. "$ROOT/core/scripts/lib/work-mesh-enqueue.sh" 2>/dev/null || true
|
|
70
|
+
|
|
71
|
+
HARNESS="${HQ_HARNESS:-${HQ_WORK_MESH_HARNESS:-claude-code}}"
|
|
72
|
+
case "$HARNESS" in
|
|
73
|
+
claude|Claude|ClaudeCode) HARNESS=claude-code ;;
|
|
74
|
+
Codex) HARNESS=codex ;;
|
|
75
|
+
Grok) HARNESS=grok ;;
|
|
76
|
+
esac
|
|
77
|
+
ADAPTER="${HQ_ADAPTER_CONTRACT_VERSION:-1.0.0}"
|
|
78
|
+
|
|
79
|
+
if command -v work_mesh_ulid >/dev/null 2>&1; then
|
|
80
|
+
work_mesh_ulid >/dev/null; CLIENT_OP=$REPLY
|
|
81
|
+
else
|
|
82
|
+
CLIENT_OP="cop_$(date +%s)_$$"
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
json_quote() {
|
|
86
|
+
if command -v work_mesh_json_quote >/dev/null 2>&1; then
|
|
87
|
+
work_mesh_json_quote "$1"; printf '%s' "$REPLY"
|
|
88
|
+
return 0
|
|
89
|
+
fi
|
|
90
|
+
if command -v jq >/dev/null 2>&1; then
|
|
91
|
+
jq -n --arg s "$1" '$s'
|
|
92
|
+
return 0
|
|
93
|
+
fi
|
|
94
|
+
# bash-only fallback (hooks-no-python)
|
|
95
|
+
local s=$1
|
|
96
|
+
s=${s//'\'/'\\'}
|
|
97
|
+
s=${s//'"'/'\"'}
|
|
98
|
+
s=${s//$'\n'/'\n'}
|
|
99
|
+
s=${s//$'\r'/'\r'}
|
|
100
|
+
s=${s//$'\t'/'\t'}
|
|
101
|
+
printf '"%s"' "$s"
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
_q_sid="$(json_quote "$SESSION_ID")"
|
|
105
|
+
_q_har="$(json_quote "$HARNESS")"
|
|
106
|
+
_q_ad="$(json_quote "$ADAPTER")"
|
|
107
|
+
_q_op="$(json_quote "$CLIENT_OP")"
|
|
108
|
+
_q_cwd="$(json_quote "${PWD:-}")"
|
|
109
|
+
_q_root="$(json_quote "$ROOT")"
|
|
110
|
+
|
|
111
|
+
OBS='{"contractVersion":1,"clientOperationId":'"$_q_op"',"identity":{"sessionId":'"$_q_sid"',"harness":'"$_q_har"',"adapterVersion":'"$_q_ad"'},"cwd":'"$_q_cwd"',"hqRoot":'"$_q_root"
|
|
112
|
+
if [ -n "$COMPANY" ] || [ -n "$PROJECT" ] || [ -n "$TASK" ]; then
|
|
113
|
+
OBS+=',"trustedContext":{'
|
|
114
|
+
_first=1
|
|
115
|
+
if [ -n "$COMPANY" ]; then
|
|
116
|
+
OBS+='"companySlug":'"$(json_quote "$COMPANY")"
|
|
117
|
+
_first=0
|
|
118
|
+
fi
|
|
119
|
+
if [ -n "$PROJECT" ]; then
|
|
120
|
+
[ "$_first" -eq 1 ] || OBS+=','
|
|
121
|
+
OBS+='"project":'"$(json_quote "$PROJECT")"
|
|
122
|
+
_first=0
|
|
123
|
+
fi
|
|
124
|
+
if [ -n "$TASK" ]; then
|
|
125
|
+
[ "$_first" -eq 1 ] || OBS+=','
|
|
126
|
+
OBS+='"task":'"$(json_quote "$TASK")"
|
|
127
|
+
fi
|
|
128
|
+
OBS+='}'
|
|
129
|
+
fi
|
|
130
|
+
OBS+='}'
|
|
131
|
+
|
|
132
|
+
OBS_DIR="${TMPDIR:-/tmp}/hq-work-mesh-obs"
|
|
133
|
+
mkdir -p -- "$OBS_DIR" 2>/dev/null || true
|
|
134
|
+
chmod 700 -- "$OBS_DIR" 2>/dev/null || true
|
|
135
|
+
OBS_FILE="$OBS_DIR/$SESSION_ID.bind.$$.json"
|
|
136
|
+
printf '%s\n' "$OBS" >"$OBS_FILE"
|
|
137
|
+
|
|
138
|
+
if [ -n "${HQ_WORK_MESH_RECONCILE_LOG:-}" ]; then
|
|
139
|
+
printf 'reconcile-trusted %s\n' "$OBS_FILE" >>"$HQ_WORK_MESH_RECONCILE_LOG" 2>/dev/null || true
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
if [ "${HQ_WORK_MESH_RECONCILE_STUB:-}" = "1" ]; then
|
|
143
|
+
exit 0
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
HQ_BIN="$(command -v hq 2>/dev/null || true)"
|
|
147
|
+
if [ -n "$HQ_BIN" ] && [ -f "$OBS_FILE" ]; then
|
|
148
|
+
nohup "$HQ_BIN" mesh context reconcile --observation-file "$OBS_FILE" --machine \
|
|
149
|
+
>/dev/null 2>&1 </dev/null &
|
|
150
|
+
disown 2>/dev/null || true
|
|
151
|
+
fi
|
|
152
|
+
exit 0
|
|
@@ -1734,7 +1734,7 @@ export declare const COMMAND_CATALOG: readonly [{
|
|
|
1734
1734
|
readonly subcommands: readonly [];
|
|
1735
1735
|
}, {
|
|
1736
1736
|
readonly name: "delete";
|
|
1737
|
-
readonly description: "Delete vault objects
|
|
1737
|
+
readonly description: "Delete vault objects by exact key or bounded prefix. A trailing slash expands recursively; use * for an explicit wildcard prefix. Always previews the exact count first; prompts for confirmation unless --yes. Use --personal to target your own personal vault instead of a company.";
|
|
1738
1738
|
readonly aliases: readonly [];
|
|
1739
1739
|
readonly hidden: false;
|
|
1740
1740
|
readonly usage: "[options] <prefix>";
|
|
@@ -3492,6 +3492,9 @@ export declare const COMMAND_CATALOG: readonly [{
|
|
|
3492
3492
|
}, {
|
|
3493
3493
|
readonly flags: "--json";
|
|
3494
3494
|
readonly description: "Machine-readable output";
|
|
3495
|
+
}, {
|
|
3496
|
+
readonly flags: "--history";
|
|
3497
|
+
readonly description: "Include recently decided calls";
|
|
3495
3498
|
}];
|
|
3496
3499
|
readonly subcommands: readonly [];
|
|
3497
3500
|
}, {
|
|
@@ -5795,6 +5798,32 @@ export declare const COMMAND_CATALOG: readonly [{
|
|
|
5795
5798
|
}];
|
|
5796
5799
|
readonly options: readonly [];
|
|
5797
5800
|
readonly subcommands: readonly [];
|
|
5801
|
+
}, {
|
|
5802
|
+
readonly name: "dm-bind";
|
|
5803
|
+
readonly description: "Bind this session to one HQ DM channel";
|
|
5804
|
+
readonly aliases: readonly [];
|
|
5805
|
+
readonly hidden: false;
|
|
5806
|
+
readonly usage: "[args...]";
|
|
5807
|
+
readonly arguments: readonly [{
|
|
5808
|
+
readonly name: "args";
|
|
5809
|
+
readonly required: false;
|
|
5810
|
+
readonly variadic: true;
|
|
5811
|
+
}];
|
|
5812
|
+
readonly options: readonly [];
|
|
5813
|
+
readonly subcommands: readonly [];
|
|
5814
|
+
}, {
|
|
5815
|
+
readonly name: "work-mesh-bind-trusted";
|
|
5816
|
+
readonly description: "Bind trusted session context and reconcile it with Work Mesh";
|
|
5817
|
+
readonly aliases: readonly [];
|
|
5818
|
+
readonly hidden: false;
|
|
5819
|
+
readonly usage: "[args...]";
|
|
5820
|
+
readonly arguments: readonly [{
|
|
5821
|
+
readonly name: "args";
|
|
5822
|
+
readonly required: false;
|
|
5823
|
+
readonly variadic: true;
|
|
5824
|
+
}];
|
|
5825
|
+
readonly options: readonly [];
|
|
5826
|
+
readonly subcommands: readonly [];
|
|
5798
5827
|
}, {
|
|
5799
5828
|
readonly name: "worktree-gc";
|
|
5800
5829
|
readonly description: "Safely collect old, preserved HQ worktrees";
|
|
@@ -2213,7 +2213,7 @@ export const COMMAND_CATALOG = [
|
|
|
2213
2213
|
},
|
|
2214
2214
|
{
|
|
2215
2215
|
"name": "delete",
|
|
2216
|
-
"description": "Delete vault objects
|
|
2216
|
+
"description": "Delete vault objects by exact key or bounded prefix. A trailing slash expands recursively; use * for an explicit wildcard prefix. Always previews the exact count first; prompts for confirmation unless --yes. Use --personal to target your own personal vault instead of a company.",
|
|
2217
2217
|
"aliases": [],
|
|
2218
2218
|
"hidden": false,
|
|
2219
2219
|
"usage": "[options] <prefix>",
|
|
@@ -4500,6 +4500,10 @@ export const COMMAND_CATALOG = [
|
|
|
4500
4500
|
{
|
|
4501
4501
|
"flags": "--json",
|
|
4502
4502
|
"description": "Machine-readable output"
|
|
4503
|
+
},
|
|
4504
|
+
{
|
|
4505
|
+
"flags": "--history",
|
|
4506
|
+
"description": "Include recently decided calls"
|
|
4503
4507
|
}
|
|
4504
4508
|
],
|
|
4505
4509
|
"subcommands": []
|
|
@@ -7464,6 +7468,38 @@ export const COMMAND_CATALOG = [
|
|
|
7464
7468
|
"options": [],
|
|
7465
7469
|
"subcommands": []
|
|
7466
7470
|
},
|
|
7471
|
+
{
|
|
7472
|
+
"name": "dm-bind",
|
|
7473
|
+
"description": "Bind this session to one HQ DM channel",
|
|
7474
|
+
"aliases": [],
|
|
7475
|
+
"hidden": false,
|
|
7476
|
+
"usage": "[args...]",
|
|
7477
|
+
"arguments": [
|
|
7478
|
+
{
|
|
7479
|
+
"name": "args",
|
|
7480
|
+
"required": false,
|
|
7481
|
+
"variadic": true
|
|
7482
|
+
}
|
|
7483
|
+
],
|
|
7484
|
+
"options": [],
|
|
7485
|
+
"subcommands": []
|
|
7486
|
+
},
|
|
7487
|
+
{
|
|
7488
|
+
"name": "work-mesh-bind-trusted",
|
|
7489
|
+
"description": "Bind trusted session context and reconcile it with Work Mesh",
|
|
7490
|
+
"aliases": [],
|
|
7491
|
+
"hidden": false,
|
|
7492
|
+
"usage": "[args...]",
|
|
7493
|
+
"arguments": [
|
|
7494
|
+
{
|
|
7495
|
+
"name": "args",
|
|
7496
|
+
"required": false,
|
|
7497
|
+
"variadic": true
|
|
7498
|
+
}
|
|
7499
|
+
],
|
|
7500
|
+
"options": [],
|
|
7501
|
+
"subcommands": []
|
|
7502
|
+
},
|
|
7467
7503
|
{
|
|
7468
7504
|
"name": "worktree-gc",
|
|
7469
7505
|
"description": "Safely collect old, preserved HQ worktrees",
|
package/dist/commands/agents.js
CHANGED
|
@@ -1946,6 +1946,12 @@ export function registerAgentsCommand(program) {
|
|
|
1946
1946
|
}
|
|
1947
1947
|
try {
|
|
1948
1948
|
const token = (await resolveVaultCredential()).token;
|
|
1949
|
+
const status = await getAgentStatus(token, agentUid);
|
|
1950
|
+
if (recordValue(status.agent)?.runtimeKind === "external") {
|
|
1951
|
+
await revokeAgent(token, agentUid, true);
|
|
1952
|
+
console.log(chalk.green(`Revoked and removed external agent ${agentUid}.`));
|
|
1953
|
+
return;
|
|
1954
|
+
}
|
|
1949
1955
|
const result = await deprovisionAgent(token, agentUid, opts.confirmDestroyAgentsV2);
|
|
1950
1956
|
if (result.terminal === false) {
|
|
1951
1957
|
console.log(chalk.yellow(`Deprovision in progress for agent ${agentUid} (not yet fully torn down — re-run to continue).`));
|
|
@@ -18,16 +18,6 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { Command } from "commander";
|
|
20
20
|
export declare const CHECKPOINT_GATE_SETTING_FLAG = "checkpoint.gate.company-setting";
|
|
21
|
-
/** The refresh gives up after this long; the gate keeps the cached value. */
|
|
22
|
-
export declare const CHECKPOINT_GATE_REFRESH_TIMEOUT_MS = 3000;
|
|
23
|
-
export declare function assertCompanySlug(slug: string): void;
|
|
24
|
-
export interface CheckpointGateCacheEntry {
|
|
25
|
-
company: string;
|
|
26
|
-
checkpointGateEnabled: boolean;
|
|
27
|
-
/** Unix seconds. The gate treats an entry older than 600 s as stale. */
|
|
28
|
-
fetched_at: number;
|
|
29
|
-
}
|
|
30
|
-
export declare function checkpointGateCacheDir(home?: string): string;
|
|
31
21
|
export declare function checkpointGateCachePath(slug: string, home?: string): string;
|
|
32
22
|
export type CheckpointGateRefreshOutcome = {
|
|
33
23
|
status: "written";
|
|
@@ -25,15 +25,15 @@ import { readLanesRegistryFlag } from "../lib/lanes/registry-flag.js";
|
|
|
25
25
|
import { describeCoreCommand } from "./core-command-catalog.js";
|
|
26
26
|
export const CHECKPOINT_GATE_SETTING_FLAG = "checkpoint.gate.company-setting";
|
|
27
27
|
/** The refresh gives up after this long; the gate keeps the cached value. */
|
|
28
|
-
|
|
28
|
+
const CHECKPOINT_GATE_REFRESH_TIMEOUT_MS = 3_000;
|
|
29
29
|
/** Same character set the gate script accepts; anything else is refused. */
|
|
30
30
|
const SLUG_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
31
|
-
|
|
31
|
+
function assertCompanySlug(slug) {
|
|
32
32
|
if (!SLUG_RE.test(slug) || slug === "personal") {
|
|
33
33
|
throw new Error(`checkpoint-gate-setting: '${slug}' is not a company slug`);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
function checkpointGateCacheDir(home = os.homedir()) {
|
|
37
37
|
return path.join(home, ".hq", "cache", "checkpoint-gate");
|
|
38
38
|
}
|
|
39
39
|
export function checkpointGateCachePath(slug, home = os.homedir()) {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Native implementation of core/scripts/hq-dm-bind.sh. */
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import { type UtilityOutput } from "./core-native-utilities.js";
|
|
5
|
+
export declare const DM_BIND_ASSET = "core/scripts/hq-dm-bind.sh";
|
|
6
|
+
export declare const DM_BIND_HELP = "# hq-dm-bind.sh \u2014 bind the current session to one HQ DM channel, post\n# structured updates to it, and listen for replies (feedback / requests).\n#\n# Usage:\n# core/scripts/hq-dm-bind.sh bind <channel> # bind + set the read cursor to \"now\"\n# core/scripts/hq-dm-bind.sh status # show the binding and cursor\n# core/scripts/hq-dm-bind.sh post --title <t> [--state <s>] [--line <l>]... [--next <l>]... [--ask <l>]... [--to <name>]... [--topic <t>] [--under <id>] [--new-thread]\n# core/scripts/hq-dm-bind.sh post --title <t> - < body.md # body from stdin (already structured)\n# core/scripts/hq-dm-bind.sh threads # list the channel's recent top-level threads (id, replies, author, text)\n# core/scripts/hq-dm-bind.sh roster # print the channel members a post will @-mention\n# core/scripts/hq-dm-bind.sh poll # print new messages since the cursor, advance it\n# core/scripts/hq-dm-bind.sh listen [--interval 60] [--timeout 1800]\n# # block until a new message arrives (or timeout)\n# core/scripts/hq-dm-bind.sh unbind\n#\n# The binding lives in the session's meta.yaml (`dm_channel`) via hq-session.sh;\n# the cursor is `workspace/sessions/<sid>/dm-bind.cursor` (the last seen sort\n# key from `hq dm channel --json`). `listen` is meant to run detached\n# (Bash run_in_background): it exits 0 and prints the new messages the moment\n# one lands, exits 3 on timeout with nothing new.\n#\n# Every post opens with an @-mention of every other member of the channel, so\n# the update reaches people (HQ mentions are structured: the `hq` CLI resolves\n# the `@\"Display Name\"` tokens against the roster and sends the real mention\n";
|
|
7
|
+
export type DmBindDeps = {
|
|
8
|
+
root: string;
|
|
9
|
+
cwd: string;
|
|
10
|
+
env: NodeJS.ProcessEnv;
|
|
11
|
+
home: string;
|
|
12
|
+
now: () => Date;
|
|
13
|
+
fs: typeof fs;
|
|
14
|
+
runHq: (args: string[], env: NodeJS.ProcessEnv) => {
|
|
15
|
+
code: number;
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
};
|
|
19
|
+
runHqSession: (args: string[], env: NodeJS.ProcessEnv) => {
|
|
20
|
+
code: number;
|
|
21
|
+
stdout: string;
|
|
22
|
+
stderr: string;
|
|
23
|
+
};
|
|
24
|
+
fetch: typeof fetch;
|
|
25
|
+
readStdin: () => Promise<string>;
|
|
26
|
+
sleep: (milliseconds: number) => Promise<void>;
|
|
27
|
+
};
|
|
28
|
+
export declare const createDmBindDeps: (root: string, cwd: string, env: NodeJS.ProcessEnv, now: () => Date, home?: string) => DmBindDeps;
|
|
29
|
+
export declare function resolveDmBindSessionId(d: Pick<DmBindDeps, "root" | "env" | "fs">): string;
|
|
30
|
+
export declare function runDmBind(args: string[], deps: DmBindDeps): Promise<UtilityOutput>;
|
|
31
|
+
export declare function registerCoreDmBindNative(core: Command): void;
|
|
32
|
+
//# sourceMappingURL=core-dm-bind-native.d.ts.map
|