@agentshouse/kit 0.0.1 → 0.1.0-alpha.1

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1696 -2
  3. package/bin/connect-linux.sh +127 -0
  4. package/bin/kit.js +1023 -0
  5. package/package.json +33 -3
  6. package/src/acp.js +99 -0
  7. package/src/adapter-mcp.js +44 -0
  8. package/src/adapter.js +252 -0
  9. package/src/agent-logins.js +65 -0
  10. package/src/agents.js +449 -0
  11. package/src/apply.js +29 -0
  12. package/src/attach.js +52 -0
  13. package/src/binding.js +90 -0
  14. package/src/blocks.js +156 -0
  15. package/src/bridge.js +449 -0
  16. package/src/bytes.js +89 -0
  17. package/src/channel.js +37 -0
  18. package/src/command.js +109 -0
  19. package/src/configuration.js +465 -0
  20. package/src/connector-login.js +91 -0
  21. package/src/connector.js +107 -0
  22. package/src/continuation.js +61 -0
  23. package/src/contract.js +363 -0
  24. package/src/conversation-originals.js +143 -0
  25. package/src/custom/authorization.js +63 -0
  26. package/src/declaration.js +35 -0
  27. package/src/delivery.js +191 -0
  28. package/src/directory.js +102 -0
  29. package/src/draft.js +89 -0
  30. package/src/google/calendar.js +177 -0
  31. package/src/google/declared.js +146 -0
  32. package/src/google/drive.js +435 -0
  33. package/src/google/gateway.js +166 -0
  34. package/src/google/gmail.js +249 -0
  35. package/src/google/id.js +1 -0
  36. package/src/google/oauth.js +273 -0
  37. package/src/google/source.js +25 -0
  38. package/src/hook.js +376 -0
  39. package/src/host.js +121 -0
  40. package/src/house-main.js +79 -0
  41. package/src/house.js +1085 -0
  42. package/src/inbound.js +175 -0
  43. package/src/instance/google.js +1 -0
  44. package/src/launcher-main.js +19 -0
  45. package/src/launcher.js +276 -0
  46. package/src/local-files.js +113 -0
  47. package/src/login.js +274 -0
  48. package/src/mcp.js +71 -0
  49. package/src/migrator.js +248 -0
  50. package/src/mount.js +582 -0
  51. package/src/operation.js +20 -0
  52. package/src/original.js +631 -0
  53. package/src/peer.js +124 -0
  54. package/src/plan.js +57 -0
  55. package/src/question.js +316 -0
  56. package/src/refusal.js +79 -0
  57. package/src/repository.js +521 -0
  58. package/src/session-bin/house +2 -0
  59. package/src/settlement.js +57 -0
  60. package/src/setup.js +185 -0
  61. package/src/source-originals.js +116 -0
  62. package/src/source.js +286 -0
  63. package/src/starter-set/grilling/LICENSE +21 -0
  64. package/src/starter-set/grilling/SKILL.md +30 -0
  65. package/src/starter-set/grilling/agents/openai.yaml +3 -0
  66. package/src/starter-set.js +17 -0
  67. package/src/state.js +157 -0
  68. package/src/sync-library.js +293 -0
  69. package/src/sync-state.js +116 -0
  70. package/src/sync.js +477 -0
  71. package/src/telegram.js +1045 -0
  72. package/src/terminal.js +57 -0
  73. package/src/tmux.js +119 -0
  74. package/src/worker.js +756 -0
  75. package/src/workspace.js +500 -0
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ IMAGE='ghcr.io/agentshouse/kit@sha256:__IMAGE_DIGEST__'
5
+ NAME='house-kit'
6
+ HOUSE='https://agents.house'
7
+ WORKSPACE="$HOME/AgentsHouse"
8
+ MANUAL=0
9
+ WORKSPACE_SELECTED=0
10
+ HOUSE_SELECTED=0
11
+
12
+ refuse() {
13
+ printf 'kit_bootstrap_refused: %s\n' "$1" >&2
14
+ exit 1
15
+ }
16
+
17
+ while (($#)); do
18
+ case "$1" in
19
+ --workspace|--house)
20
+ (($# >= 2)) || refuse "$1 requires one value"
21
+ if [[ "$1" == --workspace ]]; then
22
+ ((WORKSPACE_SELECTED == 0)) || refuse 'supply exactly one workspace root'
23
+ WORKSPACE="$2"
24
+ WORKSPACE_SELECTED=1
25
+ else
26
+ ((HOUSE_SELECTED == 0)) || refuse 'supply exactly one House origin'
27
+ HOUSE="$2"
28
+ HOUSE_SELECTED=1
29
+ fi
30
+ shift 2
31
+ ;;
32
+ --manual)
33
+ MANUAL=1
34
+ shift
35
+ ;;
36
+ *) refuse "unknown argument $1" ;;
37
+ esac
38
+ done
39
+
40
+ [[ "$IMAGE" =~ ^ghcr\.io/agentshouse/kit@sha256:[0-9a-f]{64}$ ]] || refuse 'this bootstrap has not been published with an immutable image digest'
41
+ [[ "$(uname -s)" == Linux ]] || refuse "unsupported host $(uname -s); this bootstrap is for Linux"
42
+ case "$(uname -m)" in
43
+ x86_64|amd64) ARCH=amd64 ;;
44
+ aarch64|arm64) ARCH=arm64 ;;
45
+ *) refuse "unsupported Linux architecture $(uname -m)" ;;
46
+ esac
47
+ [[ "$WORKSPACE" == /* ]] || refuse 'workspace root must be an absolute path'
48
+ command -v docker >/dev/null || refuse 'Docker Engine client is unavailable'
49
+ DOCKER_PLATFORM=$(docker info --format '{{.OSType}}/{{.Architecture}}' 2>/dev/null) || refuse 'Docker Engine is unavailable'
50
+ case "$DOCKER_PLATFORM" in
51
+ linux/x86_64|linux/amd64) DOCKER_ARCH=amd64 ;;
52
+ linux/aarch64|linux/arm64) DOCKER_ARCH=arm64 ;;
53
+ *) refuse "unsupported Docker Engine platform $DOCKER_PLATFORM" ;;
54
+ esac
55
+ [[ "$DOCKER_ARCH" == "$ARCH" ]] || refuse "host linux/$ARCH does not match Docker Engine linux/$DOCKER_ARCH"
56
+
57
+ umask 077
58
+ KIT_HOME="$HOME/.house-kit"
59
+ for path in "$KIT_HOME" "$WORKSPACE"; do
60
+ [[ ! -L "$path" ]] || refuse "$path is a symbolic link"
61
+ mkdir -p -m 700 "$path" || refuse "$path could not be created"
62
+ [[ -d "$path" ]] || refuse "$path is not a directory"
63
+ [[ "$(stat -c %u "$path")" == "$(id -u)" ]] || refuse "$path is not owned by this User"
64
+ chmod 700 "$path" || refuse "$path could not be owner-protected"
65
+ done
66
+ KIT_HOME=$(cd "$KIT_HOME" && pwd -P)
67
+ WORKSPACE=$(cd "$WORKSPACE" && pwd -P)
68
+ if [[ -f "$KIT_HOME/credential" || -f "$KIT_HOME/environment" ]] && [[ ! -f "$KIT_HOME/house" ]]; then
69
+ refuse 'stored House origin is missing for an enrolled Environment'
70
+ fi
71
+ if [[ -f "$KIT_HOME/house" ]]; then
72
+ IFS= read -r BOUND_HOUSE < "$KIT_HOME/house" || refuse 'stored House origin is unreadable'
73
+ if ((HOUSE_SELECTED)) && [[ "$HOUSE" != "$BOUND_HOUSE" ]]; then
74
+ refuse 'this Environment is bound to another House origin'
75
+ fi
76
+ HOUSE="$BOUND_HOUSE"
77
+ fi
78
+ [[ "$HOUSE" == https://* || "$HOUSE" == http://127.0.0.1:* || "$HOUSE" == http://localhost:* ]] || refuse 'House origin must use HTTPS or local loopback HTTP'
79
+ DOCKER_RUN=(docker run --rm --network host --user "$(id -u):$(id -g)" --mount "type=bind,src=$KIT_HOME,dst=/kit-home" --mount "type=bind,src=$WORKSPACE,dst=/agents/house" --env HOME=/kit-home --env HOUSE_KIT_HOME=/kit-home --env HOUSE_KIT_CONTAINER=1 --env "HOUSE_KIT_HOSTNAME=$(hostname)" "$IMAGE")
80
+
81
+ if docker container inspect "$NAME" >/dev/null 2>&1; then
82
+ [[ "$(docker inspect --format '{{.Config.Image}}' "$NAME")" == "$IMAGE" ]] || refuse 'an installed Kit uses a different image; update it explicitly'
83
+ [[ "$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$NAME")" == unless-stopped ]] || refuse 'the installed Kit has a different lifecycle'
84
+ [[ "$(docker inspect --format '{{len .Mounts}}' "$NAME")" == 2 ]] || refuse 'the installed Kit has unexpected mounts'
85
+ [[ "$(docker inspect --format '{{range .Mounts}}{{if eq .Destination "/kit-home"}}{{.Source}}{{end}}{{end}}' "$NAME")" == "$KIT_HOME" ]] || refuse 'the installed Kit uses another Kit home'
86
+ [[ "$(docker inspect --format '{{range .Mounts}}{{if eq .Destination "/kit-home"}}{{.Type}}/{{.RW}}{{end}}{{end}}' "$NAME")" == bind/true ]] || refuse 'the installed Kit home is not a writable bind mount'
87
+ [[ "$(docker inspect --format '{{range .Mounts}}{{if eq .Destination "/agents/house"}}{{.Source}}{{end}}{{end}}' "$NAME")" == "$WORKSPACE" ]] || refuse 'the installed Kit uses another workspace root'
88
+ [[ "$(docker inspect --format '{{range .Mounts}}{{if eq .Destination "/agents/house"}}{{.Type}}/{{.RW}}{{end}}{{end}}' "$NAME")" == bind/true ]] || refuse 'the installed workspace is not a writable bind mount'
89
+ [[ "$(docker inspect --format '{{index .Config.Labels "agentshouse.house"}}' "$NAME")" == "$HOUSE" ]] || refuse 'the installed Kit uses another House origin'
90
+ [[ -f "$KIT_HOME/credential" && -f "$KIT_HOME/environment" && -f "$KIT_HOME/house" ]] || refuse 'the installed Kit has no enrolled authority'
91
+ "${DOCKER_RUN[@]}" credential check --house "$HOUSE"
92
+ if [[ "$(docker inspect --format '{{.State.Running}}' "$NAME")" == true ]]; then
93
+ printf 'House Kit is already running for Environment %s.\n' "$(cat "$KIT_HOME/environment")"
94
+ else
95
+ docker start "$NAME" >/dev/null
96
+ printf 'House Kit restarted for Environment %s.\n' "$(cat "$KIT_HOME/environment")"
97
+ fi
98
+ exit 0
99
+ fi
100
+
101
+ docker pull --quiet --platform "linux/$ARCH" "$IMAGE" >/dev/null
102
+
103
+ if [[ ! -f "$KIT_HOME/kit.json" ]]; then
104
+ printf '{"availability":"intermittent","execution_authority":"allow","migrators":[],"instances":[],"clients":[],"host":null}\n' > "$KIT_HOME/kit.json"
105
+ fi
106
+
107
+ if [[ -f "$KIT_HOME/credential" ]]; then
108
+ "${DOCKER_RUN[@]}" credential check --house "$HOUSE"
109
+ else
110
+ if ((MANUAL)); then
111
+ "${DOCKER_RUN[@]:0:2}" -i "${DOCKER_RUN[@]:2}" login --house "$HOUSE" --manual
112
+ else
113
+ command -v xdg-open >/dev/null || refuse 'no host browser opener; rerun with --manual'
114
+ "${DOCKER_RUN[@]}" login --house "$HOUSE" --host-browser | while IFS= read -r line; do
115
+ if [[ "$line" == 'Open '* ]]; then
116
+ printf 'Opening House Login in the host browser.\n'
117
+ xdg-open "${line#Open }" >/dev/null 2>&1 || refuse 'host browser did not open; rerun with --manual'
118
+ else
119
+ printf '%s\n' "$line"
120
+ fi
121
+ done
122
+ fi
123
+ fi
124
+
125
+ "${DOCKER_RUN[@]}" apply --house "$HOUSE"
126
+ docker run -d --name "$NAME" --restart unless-stopped --user "$(id -u):$(id -g)" --mount "type=bind,src=$KIT_HOME,dst=/kit-home" --mount "type=bind,src=$WORKSPACE,dst=/agents/house" --label "agentshouse.house=$HOUSE" --env HOME=/kit-home --env HOUSE_KIT_HOME=/kit-home --env HOUSE_KIT_CONTAINER=1 "$IMAGE" resident --house "$HOUSE" >/dev/null
127
+ printf 'House Kit connected for Environment %s.\n' "$(cat "$KIT_HOME/environment")"