@agentshouse/kit 0.0.1 → 0.1.0-alpha.10

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