@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.
- package/LICENSE +21 -0
- package/README.md +1696 -2
- package/bin/connect-linux.sh +127 -0
- package/bin/kit.js +1023 -0
- package/package.json +33 -3
- package/src/acp.js +99 -0
- package/src/adapter-mcp.js +44 -0
- package/src/adapter.js +252 -0
- package/src/agent-logins.js +65 -0
- package/src/agents.js +449 -0
- package/src/apply.js +29 -0
- package/src/attach.js +52 -0
- package/src/binding.js +90 -0
- package/src/blocks.js +156 -0
- package/src/bridge.js +449 -0
- package/src/bytes.js +89 -0
- package/src/channel.js +37 -0
- package/src/command.js +109 -0
- package/src/configuration.js +465 -0
- package/src/connector-login.js +91 -0
- package/src/connector.js +107 -0
- package/src/continuation.js +61 -0
- package/src/contract.js +363 -0
- package/src/conversation-originals.js +143 -0
- package/src/custom/authorization.js +63 -0
- package/src/declaration.js +35 -0
- package/src/delivery.js +191 -0
- package/src/directory.js +102 -0
- package/src/draft.js +89 -0
- package/src/google/calendar.js +177 -0
- package/src/google/declared.js +146 -0
- package/src/google/drive.js +435 -0
- package/src/google/gateway.js +166 -0
- package/src/google/gmail.js +249 -0
- package/src/google/id.js +1 -0
- package/src/google/oauth.js +273 -0
- package/src/google/source.js +25 -0
- package/src/hook.js +376 -0
- package/src/host.js +121 -0
- package/src/house-main.js +79 -0
- package/src/house.js +1085 -0
- package/src/inbound.js +175 -0
- package/src/instance/google.js +1 -0
- package/src/launcher-main.js +19 -0
- package/src/launcher.js +276 -0
- package/src/local-files.js +113 -0
- package/src/login.js +274 -0
- package/src/mcp.js +71 -0
- package/src/migrator.js +248 -0
- package/src/mount.js +582 -0
- package/src/operation.js +20 -0
- package/src/original.js +631 -0
- package/src/peer.js +124 -0
- package/src/plan.js +57 -0
- package/src/question.js +316 -0
- package/src/refusal.js +79 -0
- package/src/repository.js +521 -0
- package/src/session-bin/house +2 -0
- package/src/settlement.js +57 -0
- package/src/setup.js +185 -0
- package/src/source-originals.js +116 -0
- package/src/source.js +286 -0
- package/src/starter-set/grilling/LICENSE +21 -0
- package/src/starter-set/grilling/SKILL.md +30 -0
- package/src/starter-set/grilling/agents/openai.yaml +3 -0
- package/src/starter-set.js +17 -0
- package/src/state.js +157 -0
- package/src/sync-library.js +293 -0
- package/src/sync-state.js +116 -0
- package/src/sync.js +477 -0
- package/src/telegram.js +1045 -0
- package/src/terminal.js +57 -0
- package/src/tmux.js +119 -0
- package/src/worker.js +756 -0
- 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")"
|