@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.
Files changed (42) hide show
  1. package/README.md +84 -10
  2. package/SKILL.md +5 -2
  3. package/dist/{chunk-67VNLLBN.js → chunk-2GP5UFV7.js} +1 -0
  4. package/dist/{chunk-26P57LAR.js → chunk-AXQQMX2U.js} +203 -9
  5. package/dist/{chunk-M6RIJVRE.js → chunk-DSWT6BCC.js} +78 -4
  6. package/dist/{chunk-FBAYCS3X.js → chunk-DXJQR4QI.js} +150 -38
  7. package/dist/chunk-FXF4JWK2.js +162 -0
  8. package/dist/{chunk-PCVGBE5B.js → chunk-G2VMA2QO.js} +2 -1
  9. package/dist/{chunk-NAHHFSLH.js → chunk-ICM2XCXS.js} +2 -2
  10. package/dist/{chunk-5HRR4AOR.js → chunk-IMK4JKTA.js} +1 -1
  11. package/dist/{chunk-OAAP2MY6.js → chunk-K7D2EYBS.js} +2 -2
  12. package/dist/{chunk-ADUTW66W.js → chunk-O7YAW7G6.js} +6 -6
  13. package/dist/{chunk-5AFRMOPX.js → chunk-OH3EZXYX.js} +1 -1
  14. package/dist/{chunk-KFXF2V5G.js → chunk-OTHKG76J.js} +1 -1
  15. package/dist/chunk-OYHYCK4K.js +13 -0
  16. package/dist/{chunk-FKXFUUWJ.js → chunk-TYAHC25F.js} +1 -1
  17. package/dist/{chunk-5GYQ4J3D.js → chunk-UKUAAAXE.js} +2 -2
  18. package/dist/{chunk-LGGMJYY4.js → chunk-WUXFLE7X.js} +720 -369
  19. package/dist/{chunk-WX52U7Z2.js → chunk-ZU563PQI.js} +58 -2
  20. package/dist/daemon/server.js +372 -123
  21. package/dist/hook-runtime/daemon/server.js +372 -123
  22. package/dist/hook-runtime/hooks/post-commit.js +192 -58
  23. package/dist/hook-runtime/hooks/post-rewrite.js +58 -40
  24. package/dist/hook-runtime/hooks/post-tool-use.js +150 -67
  25. package/dist/hook-runtime/hooks/pre-tool-use.js +87 -15
  26. package/dist/hook-runtime/hooks/prim-hook.js +197 -107
  27. package/dist/hook-runtime/hooks/session-end.js +53 -5
  28. package/dist/hook-runtime/hooks/session-start.js +880 -280
  29. package/dist/hook-runtime/index.js +4008 -2438
  30. package/dist/hook-runtime/statusline-main.js +23 -1
  31. package/dist/hooks/post-commit.js +15 -8
  32. package/dist/hooks/post-rewrite.js +11 -8
  33. package/dist/hooks/post-tool-use.js +13 -15
  34. package/dist/hooks/pre-commit.js +4 -4
  35. package/dist/hooks/pre-tool-use.js +10 -12
  36. package/dist/hooks/prim-hook.js +17 -14
  37. package/dist/hooks/session-end.js +4 -4
  38. package/dist/hooks/session-start.js +35 -45
  39. package/dist/index.js +1401 -620
  40. package/dist/statusline-main.js +23 -1
  41. package/package.json +1 -1
  42. 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
- 'prim_absolute() { case "$1" in [/]* ) ;; *) return 1 ;; esac; case "$1" in [[:space:]]*|*[[:space:]]|*[/][/]*|*[/].[/]*|*[/]..[/]*|*[/].|*[/]..|?*[/]) return 1 ;; esac; }; ',
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
- return `primitive ${version} (daemon: degraded \xB7 delivery: stalled${typeof pending === "number" ? ` \xB7 ${qualifier}${String(pending)} pending` : ""}${repositorySuffix}${ingestionSuffix(ingestionStatus)})`;
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";