Naming conventions for implementing Account Login Integration

Summary

I would like to clarify the naming convention specifications for implementing Account Login integration on Vega OS. Based on the verification results below, the system appears to operate under the assumption of a specific ID format: {package_id}.interface.provider.

Questions

  1. Is it mandatory for the Account Login integration service component ID to follow the format {package_id}.interface.provider? Is there a way to use a custom ID?
  2. Does the key in the [[extras]] section have to be the fixed value interface.provider for it to be recognized by Vega OS as an interface provider?
  3. Does the first argument of registerHeadlessEntryPoint2 in service.js also need to be in the format {package_id}.interface.provider::{function_name}?

Verification Details

I created a sample app based on the documentation and verified four implementation patterns by monitoring logs during the installation process. In each case, the login state is configured to always return SIGNED_IN.

Verification Steps

  1. Before installing the app, enter the Vega OS shell via vega exec vda shell.

  2. Run the following two commands to monitor logs:

    1. Headless Service Logs:
    loggingctl log -f --since now | grep -i "com.amazondeveloper.keplersampleapp\|KeplerScript-Native\|KeplerScript-JavaScript"
    
    
    1. Account Login Status Logs:
    loggingctl log -f --since now | grep -E 'ContentAppEndpoint.*KEP_VID.*login_status'
    
    
  3. Install the app.

a. Success Case

Implementation Details

  • manifest.toml
    • Set interface.provider in the key of [extra] section
    • Set to {packageId}.interface.provider in:
      • components.service.id

      • processes.group.id

      • offers.service.id

      • extras.value.application.interface.override_attribute_component

  • service.js
    • Set {packageId}.interface.provider::{functionName} in registerHeadlessEntryPoint2.

manifest.toml

schema-version = 1

[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"

[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]

[[components.service]]
id = "com.amazondeveloper.keplersampleapp.interface.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"

[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]

[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]

[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]

[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"

[[offers.service]]
id = "com.amazondeveloper.keplersampleapp.interface.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]

[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]

[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"

[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }

[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }

[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"

[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"

service.js

import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';

{
  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
     'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
    () => onStartService,
  );

  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
    'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
    () => onStopService,
  );
}

Result

The headless service starts successfully upon app installation, and the account login status is returned as expected.

Logs

a1_headless_service_log.txt (45.2 KB)

a2_login_status_log.txt (437 バイト)

b. Failure Case 1

Implementation Details

  • manifest.toml
    • Set account.login.provider in the key of [extra] section
    • Set to {packageId}.account.login.provider in:
      • components.service.id

      • processes.group.id

      • offers.service.id

      • extras.value.application.interface.override_attribute_component

  • service.js
    • Set {packageId}.account.login.provider::{functionName} in registerHeadlessEntryPoint2.

manifest.toml

schema-version = 1

[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"

[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]

[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"

[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]

[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]

[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]

[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"

[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]

[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]

[[extras]]
- key = "interface.provider"
+ key = "account.login.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"

[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }

[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }

[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"

[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"

service.js

import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';

{
  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
-     'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+     'com.amazondeveloper.keplersampleapp.account.login.provider::onStartService',
    () => onStartService,
  );

  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
-    'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
+   'com.amazondeveloper.keplersampleapp.account.login.provider::onStopService',
    () => onStopService,
  );
}

Result

The headless service does not start upon installation, and no login status is returned.

Logs

b1_headless_service_log.txt (21.5 KB)

As there were no logs, b2_login_status_log.txt does not exist.

c. Failure Case 2

Implementation Details

  • manifest.toml
    • Set to {packageId}.account.login.provider in:
      • components.service.id

      • processes.group.id

      • offers.service.id

      • extras.value.application.interface.override_attribute_component

  • service.js
    • Set {packageId}.account.login.provider::{functionName} in registerHeadlessEntryPoint2.

manifest.toml

schema-version = 1

[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"

[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]

[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"

[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]

[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]

[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]

[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"

[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]

[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]

[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"

[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }

[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }

[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"

[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"

service.js

import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';

{
  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
-    'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+    'com.amazondeveloper.keplersampleapp.account.login.provider::onStartService',
    () => onStartService,
  );

  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
-    'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+    'com.amazondeveloper.keplersampleapp.account.login.provider::onStopService',
    () => onStopService,
  );
}

Result

Upon app installation, it appears the headless service is not launching due to an unknown service error. The account login status is fixed at false and returned.

Logs

c1_headless_service_log.txt (31.7 KB)

c2_login_status_log.txt (436 バイト)

d. Failure Case 3

Implementation Details

  • manifest.toml
    • Set to {packageId}.account.login.provider in:
      • components.service.id

      • processes.group.id

      • offers.service.id

      • extras.value.application.interface.override_attribute_component

  • service.js
    • Set {packageId}.interface.provider::{functionName} in registerHeadlessEntryPoint2.

manifest.toml

schema-version = 1

[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"

[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]

[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"

[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]

[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]

[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]

[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"

[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]

[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]

[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"

[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }

[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }

[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"

[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"

service.js

import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';

{
  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
    'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
    () => onStartService,
  );

  HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
    'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
    () => onStopService,
  );
}

Result

Upon app installation, it appears the headless service is not launching due to an unknown service error. The account login status is fixed at false and returned.

Logs

d1_headless_service_log.txt (40.2 KB)

d2_login_status_log.txt (438 バイト)

Best regards,

Tatsuki

Hey @ishijima_tatsuki_1

Thanks for the detailed report.
I’ll be looking into this and will come back to you with updates/questions.

Warm regards,
Ivy

Hi @ishijima_tatsuki_1

Yes, these naming conventions are expected by KCP and are hard-coded. App will fail to launch or have undefined behavior if these are not following the naming convention.

We analyzed the scenarios and logs associated with each scenario. Here is our analysis.

1. Is the format {package_id}.interface.provider mandatory? {}
Yes, it appears mandatory. The logs show:

Success Case (a) //Uses com.amazondeveloper.keplersampleapp.interface.provider → Service starts successfully (as mentioned in ticket) //Failure Cases (b, c) //Use com.amazondeveloper.keplersampleapp.account.login.provider → Service fails to start //No service was registered (empty interfaces array), which is why there are no connection attempt logs in case Jan 15 05:09:00.570388 firestick-8deb058caf53676a local0.info servicergrd[830]: 3651926512 INFO com.amazon.appfwk.servicergrd: binder_request{cid="b0c5785a328a70cc"}:register_package:register_package: found package 'com.amazondeveloper.keplersampleapp' with interfaces: []

Even when using account.login.provider in the manifest, KCP still tries to connect to interface.provider, indicating hardcoded expectations.

2. Must the [[extras]] key be “interface.provider”? {}

Yes. Comparing the cases:

-Case (a): key = “interface.provider” → Works
-Case (b): key = “account.login.provider” → Fails (no headless service logs)
-Case (c): key = “interface.provider” but component ID uses account.login.provider → Partial failure

The system appears to use this key to discover interface providers. Without it, the registration doesn’t occur.

3. Must registerHeadlessEntryPoint2 use {package_id}.interface.provider::{function_name}? {}

Yes. The pattern must match the service component ID. In failure case (c), the logs show:

Connecting to cluster provider : com.amazondeveloper.keplersampleapp.interface.provide.

But the actual service was registered as account.login.provider, causing connection failures. The entry point registration must align with what KCP expects to find.

Failure Case (c) **

KCP correctly parses the custom component ID

Jan 15 05:15:28.675629 firestick-8deb058caf53676a local0.info com.amazon.kcp:amzn_kepler_controller_platform[1698]: 925499687 INFO com.amazon.kcp.service: [content_app_retriever.rs:316] Parsed TOML info: KCPClusterConfig { application: KCPAppInfo { info: BasicApplicationInfo { vendor_name: None, vendor_id: None, application_name: "", product_id: None, catalog_id: 0, application_id: "", application_version: "", allowed_vendors: [], asin: "" }, interface: [InterfaceToml { interface_name: "com.amazon.kepler.media.IContentLauncherServer", features: [], attribute_options: ["partner-id"], command_options: [], override_command_component: {}, override_attribute_component: {}, static_values: {"partner-id": String("KEP_VID")} }, InterfaceToml { interface_name: "com.amazon.kepler.media.IAccountLoginServer", features: [], attribute_options: ["Status"], command_options: [], override_command_component: {}, override_attribute_component: {"Status": String("com.amazondeveloper.keplersampleapp.account.login.provider")}, static_values: {} }] } }

But then tries to connect to interface.provider instead:

Jan 15 05:15:32.062738 firestick-8deb058caf53676a local0.info com.amazon.kcp:amzn_kepler_controller_platform[1698]: 1232403098 INFO com.amazon.kcp.ipc: [ClusterServiceInternal.cpp:118] Connecting to cluster provider : com.amazondeveloper.keplersampleapp.interface.provider

Service not found error:

Jan 15 05:15:32.063331 firestick-8deb058caf53676a local0.err servicergrd[830]: 2373339023 ERROR com.amazon.appfwk.servicergrd: binder_request{cid="c744441fc26b7233"}: Error connecting to service - Operation: 'connect_to_service', ClientCreds: Credentials { pid: 1698, uid: 5000, gid: 0, security_ctx: "User::Pkg::5fad07c2-0ae2-4f25-9827-891e42f1ec72" }, ServiceName: com.amazondeveloper.keplersampleapp.interface.provider, cid: 14358676415160480307, Error: connection attempt for unknown service (it may not be up yet): service not found: com.amazondeveloper.keplersampleapp.interface.provider

Connection failure:

Jan 15 05:15:32.065701 firestick-8deb058caf53676a local0.err com.amazon.kcp:amzn_kepler_controller_platform[1698]: 1232403098 ERROR com.amazondeveloper.keplersampleapp.interface.provider.ipcf4.proxy: .svc_endp_hdl: Cannot connect! Failed to bind to service! IPCN returned IPCN_ERR_REMOTE_ERROR

Retry attempts:

Jan 15 05:15:32.066474 firestick-8deb058caf53676a local0.info com.amazon.kcp:amzn_kepler_controller_platform[1698]: 1232403098 INFO com.amazon.kcp.service: [message_sender_work_items.rs:137] ClusterProviderClient for com.amazondeveloper.keplersampleapp is not ready, txid 4101, will retry in 2000ms

Login status remains false:

Jan 15 05:15:29.208911 firestick-8deb058caf53676a local0.info com.amazon.kcs:kcs-lib[9069]: 875320553 INFO com.amazon.kcs.service: KCS amzn_kcs_ipc_common::storage::lmdb_store - cargo-project/common/src/storage/lmdb_store.rs(125) insert invoked. key com.amazondeveloper.keplersampleapp, value ContentAppEndpoint: endpoint_id=237, partner_id=KEP_VID, package_component=com.amazondeveloper.keplersampleapp.main, asin=, login_status=false

#Recommendation:

The naming convention {package_id}.interface.provider is not just a convention but a system requirement. Vega OS’s KCP (Kepler Controller Platform) has hardcoded expectations for this naming pattern when discovering and connecting to interface providers for Account Login integration.

To implement Account Login successfully, these are the requirements:
-Component ID: {package_id}.interface.provider
-Extras key: interface.provider
-Entry point: {package_id}.interface.provider::{function_name}

Warm regards,
Ivy

Hi @Ivy_Mahajan

Thank you very much for your detailed analysis and feedback.

After reviewing the log results you provided, I now clearly understand that the naming convention {package_id}.interface.provider is not just a convention, but a “mandatory requirement” hard-coded into the KCP (Kepler Controller Platform) system.

Request for Documentation Update: If possible, could you please reflect in the official documentation that these naming conventions are “hard-coded mandatory conditions” rather than “optional”? I believe this would be extremely beneficial for other developers performing the same integration in the future.

Thank you again for your prompt and professional support.

Best regards,
Tatsuki

Hi @ishijima_tatsuki_1

The documentation has examples and mentions it as a “naming convention” to use interface.provider as the suffix, but not that it is mandatory . See Account Login Integration Guide | Design and Develop Vega Apps

We will amend the documentation and explicitly call out that it is mandatory to use interface.provider for the entry point naming.

Thank you for making Vega better!
Happy Developing !

Warm regards,
Ivy

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.