@primitive.ai/prim 0.1.0-alpha.92 → 0.1.0-alpha.94
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 +84 -10
- package/SKILL.md +5 -2
- package/dist/{chunk-67VNLLBN.js → chunk-2GP5UFV7.js} +1 -0
- package/dist/{chunk-26P57LAR.js → chunk-AXQQMX2U.js} +203 -9
- package/dist/{chunk-M6RIJVRE.js → chunk-DSWT6BCC.js} +78 -4
- package/dist/{chunk-FBAYCS3X.js → chunk-DXJQR4QI.js} +150 -38
- package/dist/chunk-FXF4JWK2.js +162 -0
- package/dist/{chunk-PCVGBE5B.js → chunk-G2VMA2QO.js} +2 -1
- package/dist/{chunk-NAHHFSLH.js → chunk-ICM2XCXS.js} +2 -2
- package/dist/{chunk-5HRR4AOR.js → chunk-IMK4JKTA.js} +1 -1
- package/dist/{chunk-OAAP2MY6.js → chunk-K7D2EYBS.js} +2 -2
- package/dist/{chunk-ADUTW66W.js → chunk-O7YAW7G6.js} +6 -6
- package/dist/{chunk-5AFRMOPX.js → chunk-OH3EZXYX.js} +1 -1
- package/dist/{chunk-KFXF2V5G.js → chunk-OTHKG76J.js} +1 -1
- package/dist/chunk-OYHYCK4K.js +13 -0
- package/dist/{chunk-FKXFUUWJ.js → chunk-TYAHC25F.js} +1 -1
- package/dist/{chunk-5GYQ4J3D.js → chunk-UKUAAAXE.js} +2 -2
- package/dist/{chunk-LGGMJYY4.js → chunk-WUXFLE7X.js} +720 -369
- package/dist/{chunk-WX52U7Z2.js → chunk-ZU563PQI.js} +58 -2
- package/dist/daemon/server.js +372 -123
- package/dist/hook-runtime/daemon/server.js +372 -123
- package/dist/hook-runtime/hooks/post-commit.js +192 -58
- package/dist/hook-runtime/hooks/post-rewrite.js +58 -40
- package/dist/hook-runtime/hooks/post-tool-use.js +150 -67
- package/dist/hook-runtime/hooks/pre-tool-use.js +87 -15
- package/dist/hook-runtime/hooks/prim-hook.js +197 -107
- package/dist/hook-runtime/hooks/session-end.js +53 -5
- package/dist/hook-runtime/hooks/session-start.js +880 -280
- package/dist/hook-runtime/index.js +4008 -2438
- package/dist/hook-runtime/statusline-main.js +23 -1
- package/dist/hooks/post-commit.js +15 -8
- package/dist/hooks/post-rewrite.js +11 -8
- package/dist/hooks/post-tool-use.js +13 -15
- package/dist/hooks/pre-commit.js +4 -4
- package/dist/hooks/pre-tool-use.js +10 -12
- package/dist/hooks/prim-hook.js +17 -14
- package/dist/hooks/session-end.js +4 -4
- package/dist/hooks/session-start.js +35 -45
- package/dist/index.js +1401 -620
- package/dist/statusline-main.js +23 -1
- package/package.json +1 -1
- package/dist/chunk-BTNNEH2W.js +0 -79
|
@@ -370,6 +370,13 @@ function shellQuote(value) {
|
|
|
370
370
|
}
|
|
371
371
|
var STABLE_HOOK_ARGUMENTS_RE = /^[-A-Za-z0-9_ ]*$/u;
|
|
372
372
|
var STABLE_HOOK_BIN_RE = /^[A-Za-z0-9][A-Za-z0-9-]*$/u;
|
|
373
|
+
var PRIM_CONFIG_SHELL_RESOLVER = [
|
|
374
|
+
'prim_absolute() { case "$1" in [/]* ) ;; *) return 1 ;; esac; case "$1" in [[:space:]]*|*[[:space:]]|*[/][/]*|*[/].[/]*|*[/]..[/]*|*[/].|*[/]..|?*[/]) return 1 ;; esac; }; ',
|
|
375
|
+
'prim_config=${PRIM_CONFIG_DIR:-}; if ! prim_absolute "$prim_config"; then prim_config=${XDG_CONFIG_HOME:-}; if prim_absolute "$prim_config"; then ',
|
|
376
|
+
'case "$prim_config" in /) prim_config=/prim ;; *) prim_config="$prim_config/prim" ;; esac; ',
|
|
377
|
+
'else prim_home=${HOME:-}; prim_absolute "$prim_home" || exit 78; case "$prim_home" in /) prim_config=/.config/prim ;; *) prim_config="$prim_home/.config/prim" ;; esac; ',
|
|
378
|
+
"fi; fi; "
|
|
379
|
+
].join("");
|
|
373
380
|
function stableHookCommand(bin, args = "") {
|
|
374
381
|
if (!STABLE_HOOK_BIN_RE.test(bin) || !STABLE_HOOK_ARGUMENTS_RE.test(args)) {
|
|
375
382
|
throw new Error("invalid stable hook command");
|
|
@@ -379,11 +386,7 @@ function stableHookCommand(bin, args = "") {
|
|
|
379
386
|
// it as inert data during the rolling window so an older uninstall or
|
|
380
387
|
// reinstall can remove the stable entry without invoking npm or PATH.
|
|
381
388
|
`prim_legacy_reader='-p ${PKG_NAME}@stable prim-shim.sh ${bin} '; `,
|
|
382
|
-
|
|
383
|
-
'prim_config=${PRIM_CONFIG_DIR:-}; if ! prim_absolute "$prim_config"; then prim_config=${XDG_CONFIG_HOME:-}; if prim_absolute "$prim_config"; then ',
|
|
384
|
-
'case "$prim_config" in /) prim_config=/prim ;; *) prim_config="$prim_config/prim" ;; esac; ',
|
|
385
|
-
'else prim_home=${HOME:-}; prim_absolute "$prim_home" || exit 78; case "$prim_home" in /) prim_config=/.config/prim ;; *) prim_config="$prim_home/.config/prim" ;; esac; ',
|
|
386
|
-
"fi; fi; ",
|
|
389
|
+
PRIM_CONFIG_SHELL_RESOLVER,
|
|
387
390
|
`case "$prim_config" in /) prim_launcher=/${STABLE_HOOK_LAUNCHER_NAME} ;; *) prim_launcher="$prim_config/${STABLE_HOOK_LAUNCHER_NAME}" ;; esac; `,
|
|
388
391
|
'exec "$prim_launcher" "$@"'
|
|
389
392
|
].join("");
|
|
@@ -19677,6 +19680,36 @@ function isActionablePrivateDraft(row) {
|
|
|
19677
19680
|
return typeof candidate.id === "string" && SAFE_PRIVATE_DRAFT_ID.test(candidate.id) && typeof candidate.intent === "string" && candidate.authorIsSelf === true && candidate.stage === "draft" && (candidate.intentKind === void 0 || candidate.intentKind === "change");
|
|
19678
19681
|
}
|
|
19679
19682
|
|
|
19683
|
+
// src/lib/ansi.ts
|
|
19684
|
+
var MAX_HEALTH_ERROR_LENGTH = 240;
|
|
19685
|
+
function boundedHealthError(value) {
|
|
19686
|
+
if (!value) return void 0;
|
|
19687
|
+
const clean = terminalSafeLine(value);
|
|
19688
|
+
if (!clean) return void 0;
|
|
19689
|
+
return clean.length <= MAX_HEALTH_ERROR_LENGTH ? clean : `${clean.slice(0, MAX_HEALTH_ERROR_LENGTH - 1)}\u2026`;
|
|
19690
|
+
}
|
|
19691
|
+
|
|
19692
|
+
// src/lib/delivery-backlog.ts
|
|
19693
|
+
var MS_PER_SECOND = 1e3;
|
|
19694
|
+
var MS_PER_MINUTE = 60 * MS_PER_SECOND;
|
|
19695
|
+
var MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
|
19696
|
+
var MS_PER_DAY = 24 * MS_PER_HOUR;
|
|
19697
|
+
function isNonNegativeInteger(value) {
|
|
19698
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
19699
|
+
}
|
|
19700
|
+
function isPositiveInteger(value) {
|
|
19701
|
+
return isNonNegativeInteger(value) && value > 0;
|
|
19702
|
+
}
|
|
19703
|
+
function deliveryBacklogState(ingestion) {
|
|
19704
|
+
if (ingestion?.healthy !== false) return void 0;
|
|
19705
|
+
const failures = ingestion.consecutiveFailures;
|
|
19706
|
+
const failedWithoutProgress = failures !== 0 && !(isPositiveInteger(failures) && isPositiveInteger(ingestion.lastFailedDrainAcknowledgedCount));
|
|
19707
|
+
if (failedWithoutProgress) return "failing";
|
|
19708
|
+
const retained = ingestion.lastRetainedBucketCount;
|
|
19709
|
+
if (!isNonNegativeInteger(retained)) return "failing";
|
|
19710
|
+
return retained > 0 ? "retained" : "draining";
|
|
19711
|
+
}
|
|
19712
|
+
|
|
19680
19713
|
// src/lib/presence.ts
|
|
19681
19714
|
var DECISION_ORIGIN = "https://app.getprimitive.ai";
|
|
19682
19715
|
function validDecisionUrl(value) {
|
|
@@ -19751,7 +19784,8 @@ function formatStatusline(version, snapshot, resolveIngestionStatus, options = {
|
|
|
19751
19784
|
if (snapshot.ingestion?.healthy === false) {
|
|
19752
19785
|
const pending = snapshot.ingestion.pendingCount;
|
|
19753
19786
|
const qualifier = snapshot.ingestion.pendingSampled ? "at least " : "";
|
|
19754
|
-
|
|
19787
|
+
const delivery = deliveryBacklogState(snapshot.ingestion) === "draining" && snapshot.heartbeat?.healthy === true ? "draining" : "stalled";
|
|
19788
|
+
return `primitive ${version} (daemon: degraded \xB7 delivery: ${delivery}${typeof pending === "number" ? ` \xB7 ${qualifier}${String(pending)} pending` : ""}${repositorySuffix}${ingestionSuffix(ingestionStatus)})`;
|
|
19755
19789
|
}
|
|
19756
19790
|
if (snapshot.heartbeat?.healthy === false) {
|
|
19757
19791
|
return `primitive ${version} (daemon: degraded \xB7 presence: unavailable${repositorySuffix}${ingestionSuffix(ingestionStatus)})`;
|
|
@@ -20261,6 +20295,53 @@ import {
|
|
|
20261
20295
|
writeFileSync as writeFileSync4
|
|
20262
20296
|
} from "fs";
|
|
20263
20297
|
import { delimiter, dirname as dirname6, isAbsolute as isAbsolute4, join as join9, resolve as resolve3 } from "path";
|
|
20298
|
+
|
|
20299
|
+
// src/lib/git-hook-contract.ts
|
|
20300
|
+
var GIT_HOOK_ENTRYPOINT_CONTENT = `#!/bin/sh
|
|
20301
|
+
# prim git hook entrypoint v1 \u2014 managed by prim; do not edit.
|
|
20302
|
+
# Run by the "# >>> prim <hook> hook >>>" block in a Git hook file. Acts only
|
|
20303
|
+
# where prim is active (git config prim.active true) and never fails the hook.
|
|
20304
|
+
case "$0" in */*) prim_dir=\${0%/*} ;; *) exit 0 ;; esac
|
|
20305
|
+
prim_launcher="$prim_dir/${STABLE_HOOK_LAUNCHER_NAME}"
|
|
20306
|
+
[ -x "$prim_launcher" ] || exit 0
|
|
20307
|
+
[ "$(git config --get prim.active 2>/dev/null)" = "true" ] || exit 0
|
|
20308
|
+
prim_hook=\${1-}
|
|
20309
|
+
if [ "$#" -gt 0 ]; then shift; fi
|
|
20310
|
+
case "$prim_hook" in
|
|
20311
|
+
pre-commit)
|
|
20312
|
+
"$prim_launcher" prim-pre-commit "$@" || :
|
|
20313
|
+
;;
|
|
20314
|
+
post-commit)
|
|
20315
|
+
prim_sha=$(git rev-parse --verify HEAD 2>/dev/null) || exit 0
|
|
20316
|
+
case "$prim_sha" in *[!0-9a-f]* | "") exit 0 ;; esac
|
|
20317
|
+
case "\${#prim_sha}" in 40 | 64) ;; *) exit 0 ;; esac
|
|
20318
|
+
prim_branch=$(git symbolic-ref --quiet --short HEAD 2>/dev/null) || prim_branch=
|
|
20319
|
+
prim_observed=$(mktemp "\${TMPDIR:-/tmp}/prim-post-commit-observed.XXXXXXXX" 2>/dev/null) || prim_observed=
|
|
20320
|
+
(
|
|
20321
|
+
trap '' HUP
|
|
20322
|
+
trap 'if [ -n "$prim_observed" ]; then rm -f "$prim_observed"; fi' 0
|
|
20323
|
+
PRIM_COMMIT_SHA=$prim_sha PRIM_COMMIT_BRANCH=$prim_branch PRIM_COMMIT_OBSERVED_FILE=$prim_observed "$prim_launcher" prim-post-commit
|
|
20324
|
+
) </dev/null >/dev/null 2>&1 &
|
|
20325
|
+
;;
|
|
20326
|
+
post-rewrite)
|
|
20327
|
+
case "\${1-}" in amend | rebase) prim_source=$1 ;; *) exit 0 ;; esac
|
|
20328
|
+
prim_pairs=$(mktemp "\${TMPDIR:-/tmp}/prim-post-rewrite-pairs.XXXXXXXX" 2>/dev/null) || exit 0
|
|
20329
|
+
if ! chmod 600 "$prim_pairs" 2>/dev/null || ! cat >"$prim_pairs"; then
|
|
20330
|
+
rm -f "$prim_pairs"
|
|
20331
|
+
exit 0
|
|
20332
|
+
fi
|
|
20333
|
+
prim_branch=$(git symbolic-ref --quiet --short HEAD 2>/dev/null) || prim_branch=
|
|
20334
|
+
(
|
|
20335
|
+
trap '' HUP
|
|
20336
|
+
trap 'rm -f "$prim_pairs"' 0
|
|
20337
|
+
PRIM_REWRITE_SOURCE=$prim_source PRIM_REWRITE_BRANCH=$prim_branch PRIM_REWRITE_PAIRS_FILE=$prim_pairs "$prim_launcher" prim-post-rewrite
|
|
20338
|
+
) </dev/null >/dev/null 2>&1 &
|
|
20339
|
+
;;
|
|
20340
|
+
esac
|
|
20341
|
+
exit 0
|
|
20342
|
+
`;
|
|
20343
|
+
|
|
20344
|
+
// src/lib/hook-runtime.ts
|
|
20264
20345
|
var RELEASE_PREFIX = "release-";
|
|
20265
20346
|
var MAX_MANIFEST_BYTES = 64 * 1024;
|
|
20266
20347
|
var RELEASE_GRACE_MS = 10 * 60 * 1e3;
|
|
@@ -20945,15 +21026,6 @@ function demoteForMode(verdict, mode) {
|
|
|
20945
21026
|
// src/hooks/preflight-v3.ts
|
|
20946
21027
|
import { Buffer as Buffer2 } from "buffer";
|
|
20947
21028
|
|
|
20948
|
-
// src/lib/ansi.ts
|
|
20949
|
-
var MAX_HEALTH_ERROR_LENGTH = 240;
|
|
20950
|
-
function boundedHealthError(value) {
|
|
20951
|
-
if (!value) return void 0;
|
|
20952
|
-
const clean = terminalSafeLine(value);
|
|
20953
|
-
if (!clean) return void 0;
|
|
20954
|
-
return clean.length <= MAX_HEALTH_ERROR_LENGTH ? clean : `${clean.slice(0, MAX_HEALTH_ERROR_LENGTH - 1)}\u2026`;
|
|
20955
|
-
}
|
|
20956
|
-
|
|
20957
21029
|
// src/hooks/redact.ts
|
|
20958
21030
|
import { existsSync as existsSync9, readFileSync as readFileSync10, statSync as statSync4 } from "fs";
|
|
20959
21031
|
import { join as join12 } from "path";
|