ace-herdr 0.4.0 → 0.5.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ace-defaults/herdr/config.yml +0 -4
  3. data/CHANGELOG.md +18 -0
  4. data/docs/usage.md +57 -35
  5. data/lib/ace/herdr/cli/commands/inbox.rb +83 -21
  6. data/lib/ace/herdr/cli/commands/native_source.rb +56 -0
  7. data/lib/ace/herdr/cli.rb +3 -0
  8. data/lib/ace/herdr/errors.rb +23 -0
  9. data/lib/ace/herdr/molecules/bounded_process.rb +261 -52
  10. data/lib/ace/herdr/molecules/delivery_record_store.rb +81 -6
  11. data/lib/ace/herdr/molecules/guarded_native_origin.rb +59 -0
  12. data/lib/ace/herdr/molecules/herdr_executor.rb +6 -3
  13. data/lib/ace/herdr/molecules/inbox_cli_input.rb +36 -0
  14. data/lib/ace/herdr/molecules/inbox_context_client.rb +88 -0
  15. data/lib/ace/herdr/molecules/inbox_context_completion_client.rb +119 -0
  16. data/lib/ace/herdr/molecules/inbox_context_key.rb +63 -0
  17. data/lib/ace/herdr/molecules/inbox_context_lifetime.rb +122 -0
  18. data/lib/ace/herdr/molecules/inbox_context_native_process.rb +92 -0
  19. data/lib/ace/herdr/molecules/inbox_context_service_configuration.rb +183 -0
  20. data/lib/ace/herdr/molecules/inbox_context_store.rb +159 -0
  21. data/lib/ace/herdr/molecules/inbox_context_wire.rb +76 -0
  22. data/lib/ace/herdr/molecules/inbox_direct_effect_binding.rb +92 -0
  23. data/lib/ace/herdr/molecules/inbox_direct_result.rb +65 -0
  24. data/lib/ace/herdr/molecules/native_queue_executor.rb +10 -21
  25. data/lib/ace/herdr/molecules/native_source.rb +189 -0
  26. data/lib/ace/herdr/molecules/protected_inbox_selection.rb +126 -0
  27. data/lib/ace/herdr/molecules/protected_native_control.rb +129 -4
  28. data/lib/ace/herdr/native_source/HERDR-LICENSE +201 -0
  29. data/lib/ace/herdr/native_source/guarded-prompt.patch +3493 -0
  30. data/lib/ace/herdr/native_source/selection.json +24 -0
  31. data/lib/ace/herdr/organisms/inbox.rb +293 -203
  32. data/lib/ace/herdr/organisms/inbox_context_direct_effects.rb +285 -0
  33. data/lib/ace/herdr/organisms/inbox_context_effects.rb +30 -0
  34. data/lib/ace/herdr/organisms/inbox_context_listener.rb +151 -0
  35. data/lib/ace/herdr/organisms/inbox_context_owner.rb +550 -0
  36. data/lib/ace/herdr/organisms/inbox_context_server.rb +70 -0
  37. data/lib/ace/herdr/organisms/inbox_context_service.rb +107 -0
  38. data/lib/ace/herdr/organisms/inbox_guarded_wake.rb +117 -0
  39. data/lib/ace/herdr/organisms/native_source_builder.rb +183 -0
  40. data/lib/ace/herdr/version.rb +1 -1
  41. data/lib/ace/herdr.rb +5 -28
  42. metadata +68 -9
  43. data/lib/ace/herdr/organisms/protected_inbox.rb +0 -73
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "inbox"
4
- require_relative "../molecules/protected_native_control"
5
- require_relative "../molecules/herdr_executor"
6
- require_relative "../molecules/native_queue_executor"
7
- require_relative "../molecules/bounded_process"
8
-
9
- module Ace
10
- module Herdr
11
- module Organisms
12
- # Fixed construction for the canonical authority consumer. Callers of the
13
- # public protocol cannot inject this factory or its collaborators.
14
- module ProtectedInbox
15
- class PaneReader
16
- def initialize(control)
17
- @control = control
18
- end
19
-
20
- def pane_get_bounded(pane)
21
- result = @control.request("pane.get", {"pane_id" => pane})
22
- Molecules::ExecutionResult.new(stdout: JSON.generate({"result" => result}), stderr: "",
23
- success: true, exit_code: 0)
24
- rescue Ace::Runtime::RuntimeUnavailableError
25
- raise ExecutorUnavailableError, "original protected native endpoint is unavailable"
26
- end
27
- end
28
-
29
- class PiIdentity
30
- def initialize(client)
31
- runner = lambda do |argv, stdin_data:, timeout_s:|
32
- unless argv == [client, "--identity"] && stdin_data.empty?
33
- raise ExecutorUnavailableError, "protected inbox permits identity inspection only"
34
- end
35
- result = Molecules::BoundedProcess.call(argv, stdin_data: stdin_data,
36
- timeout_s: timeout_s, environment: {})
37
- raise ExecutorError, "Pi identity output is oversized" if result.oversized
38
- [result.stdout, result.stderr, result.status]
39
- end
40
- @native = Molecules::NativeQueueExecutor.new(pi_client: client, runner: runner)
41
- end
42
-
43
- def pi_identity
44
- @native.pi_identity
45
- end
46
- end
47
-
48
- module_function
49
-
50
- # The Assign resolver has verified context paths/key/client. native is
51
- # the immutable canonical stage, not current process discovery. Endpoint
52
- # liveness is checked lazily only if Inbox actually observes replacement.
53
- def build(context:, mapping:, native:, kernel: Ace::Runtime::Molecules::ProtectedLinux.new)
54
- native_fields = %w[server_identity socket_identity workspace_id]
55
- unless native.is_a?(Hash) && native_fields.all? { |key| native.key?(key) }
56
- raise ValidationError, "canonical native stage is unavailable"
57
- end
58
- fixed = JSON.parse(JSON.generate(mapping))
59
- fixed["native"].merge!(native.slice(*native_fields))
60
- control = Molecules::ProtectedNativeControl.new(mapping: fixed, kernel: kernel)
61
- key = OpenSSL::PKey.read(File.binread(context.fetch("receipt_public_key")))
62
- unless key.is_a?(OpenSSL::PKey::RSA) && !key.private?
63
- raise ValidationError, "protected inbox requires a public RSA key"
64
- end
65
- Inbox.new(executor: PaneReader.new(control), native: PiIdentity.new(context.fetch("pi_queue_client")),
66
- deliveries_dir: context.fetch("deliveries_dir"), receipt_public_key: key)
67
- rescue KeyError, SystemCallError, OpenSSL::PKey::PKeyError
68
- raise ValidationError, "protected inbox fixed context is unavailable"
69
- end
70
- end
71
- end
72
- end
73
- end